我从 XDP 和 BPF 映射开始。
我知道要从用户空间访问 BPF 映射,我们使用bpf_*
系统调用。例如,bpf_map_lookup_elem()
用于在用户空间程序中查找 BPF 映射的元素。但是,我注意到相同的系统调用也用于访问加载在内核上的 XDP 程序中的映射(参考此处)。
我假设这样的程序应该在内核空间中运行,因此是否有其他方法可以从内核空间访问这些 BPF 映射?还是 XDP 加载的程序也是用户空间的一部分,但只在内核中运行?
要从用户空间查找地图元素,您应该使用syscallbpf(2)
和command BPF_MAP_LOOKUP_ELEM
。BPF 的主要用户空间库确实将此系统调用命令公开为bpf_map_lookup_elem()
.
要从 BPF 程序中查找地图元素,您确实需要使用bpf_map_lookup_elem
BPF 助手。简而言之,BPF 助手是内核函数,您可以使用指令从 BPF 字节码调用call
。
尽管名称相同,但它们是不同的东西:第一个是库函数,而第二个是 BPF 助手。