eBPF 系统调用与数据缓冲区使用详解
1. eBPF 程序与映射的元数据及引用管理
在 eBPF 编程中,程序的一些元数据可以定义为全局变量,并存储在映射(map)中。若 eBPF 程序未对映射进行操作,程序与映射间不会自动产生引用计数。可使用 BPF_PROG_BIND_MAP 系统调用将映射与程序关联,防止用户空间加载程序退出且不再持有映射文件描述符引用时,映射被清理。此外,映射还能固定到文件系统,用户空间程序通过知晓映射路径来访问它。
另一种创建对 eBPF 程序引用的方式是使用 BPF 链接(BPF Links)。BPF 链接在 eBPF 程序和其所关联的事件之间提供了一层抽象。BPF 链接本身可固定到文件系统,为程序创建额外引用。这意味着将程序加载到内核的用户空间进程终止后,程序仍会保留在加载状态。虽用户空间加载程序的文件描述符被释放,程序引用计数会减少,但因 BPF 链接的存在,引用计数不会为零。
2. eBPF 涉及的其他系统调用
之前我们看到了使用 bpf() 系统调用将 BTF 数据、程序、映射及映射数据添加到内核的过程。接下来, strace 输出显示的内容与设置性能缓冲区(perf buffer)有关。
2.1 初始化性能缓冲区
之前已看到使用 bpf(BPF_MAP_UPDATE_ELEM) 调用向配置映射中添加条目。随后的输出显示了类似如下的调用:
bpf(BPF_MAP_UPDA
超级会员免费看
订阅专栏 解锁全文
80

被折叠的 条评论
为什么被折叠?



