1# libbpf 2 3仓库包含第三方开源软件libbpf,libbpf是eBPF技术的一种实现,eBPF提供给开发者一种内核事件和用户进程事件发生时安全注入代码的机制,避免开发者直接进行内核编程时可能导致的系统锁定、内存损坏、进程崩溃和安全漏洞等问题。开发者基于libbpf第三方开源库高效便捷开发eBPF程序,应用于网络过滤、程序跟踪、性能分析以及调试等需求场景。 4 5## 目录结构 6 7``` 8docs/ 文档 9fuzz/ fuzz测试 10include/ 头文件 11scripts/ 脚本 12src/ 源文件 13LICENSE 证书文件 14README.md 英文说明 15README_zh.md 中文说明 16``` 17 18## OpenHarmony如何集成libbpf 19 20### 1.头文件引入 21 22``` 23#include "libbpf.h" 24#include "bpf.h" 25``` 26 27### 2.BUILD.gn添加引用 28 29``` 30deps += ["//third_party/libbpf:libbpf"] 31``` 32### 3.示例代码 33``` 34# kprobe.bpf.c BPF程序 35# 指定LICENSE 36char LICENSE[] SEC("license") = "Dual BSD/GPL"; 37# 进入do_unlinkat函数时调用 38SEC("kprobe/do_unlinkat") 39int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) 40{ 41 pid_t pid; 42 const char *filename; 43 44 pid = bpf_get_current_pid_tgid() >> 32; 45 filename = BPF_CORE_READ(name, name); 46 bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); 47 return 0; 48} 49# 退出do_unlinkat函数时调用 50SEC("kretprobe/do_unlinkat") 51int BPF_KRETPROBE(do_unlinkat_exit, long ret) 52{ 53 pid_t pid; 54 55 pid = bpf_get_current_pid_tgid() >> 32; 56 bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); 57 return 0; 58} 59``` 60``` 61# 用bpftool生成BPF skeleton脚手架文件 62$ bpftool gen skeleton kprobe.bpf.o > kprobe.skel.h 63``` 64``` 65# kprobe.c 将BPF程序加载进内核并附着到内核指定位置 66#include kprobe.skel.h 67struct kprobe_bpf *skel; 68int err; 69libbpf_set_strict_mode(LIBBPF_STRICT_ALL); 70/* 加载并验证BPF程序 */ 71skel = kprobe_bpf__open_and_load(); 72if (!skel) { 73 fprintf(stderr, "Failed to open BPF skeleton\n"); 74 return 1; 75} 76/* 将BPF程序附加到跟踪点 */ 77err = kprobe_bpf__attach(skel); 78/* 销毁和回收资源 */ 79kprobe_bpf__destroy(skel); 80``` 81## libbpf相关知识文档 82 83[bpf参考指南](https://nakryiko.com/posts/bpf-core-reference-guide/) 84 85[libbpf开发指导](https://nakryiko.com/posts/bcc-to-libbpf-howto-guide/) 86 87[libbpf开发示例](https://github.com/libbpf/libbpf-bootstrap) 88## License 89 90`SPDX-License-Identifier: BSD-2-Clause OR LGPL-2.1` 91 92 93