从内核访问 BPF 映射 space
Accessing BPF maps from kernel space
我从 XDP 和 BPF 映射开始。
我知道要从用户space 访问 BPF 映射,我们使用 bpf_*
系统调用。例如,bpf_map_lookup_elem()
用于在 userspace 程序中查找 BPF 映射的元素。但是,我注意到相同的系统调用也用于访问内核上加载的 XDP 程序中的映射(参考文献 here)。
我假设这样的程序应该在内核 space 中 运行,因此是否有其他方法可以从内核 space 访问这些 BPF 映射?或者 XDP 加载的程序是否也是用户的一部分space 但仅在内核中 运行?
要从用户空间查找地图元素,您应该使用the bpf(2)
syscall, with command BPF_MAP_LOOKUP_ELEM
. The main userspace library for BPF does expose this syscall command as bpf_map_lookup_elem()
。
要从 BPF 程序中查找地图元素,您确实需要使用 bpf_map_lookup_elem
BPF 助手。简而言之,BPF 助手是内核函数,您可以使用指令 call
.
从 BPF 字节码调用
尽管名称相同,但它们是不同的东西:第一个是库函数,而第二个是 BPF 助手。
我从 XDP 和 BPF 映射开始。
我知道要从用户space 访问 BPF 映射,我们使用 bpf_*
系统调用。例如,bpf_map_lookup_elem()
用于在 userspace 程序中查找 BPF 映射的元素。但是,我注意到相同的系统调用也用于访问内核上加载的 XDP 程序中的映射(参考文献 here)。
我假设这样的程序应该在内核 space 中 运行,因此是否有其他方法可以从内核 space 访问这些 BPF 映射?或者 XDP 加载的程序是否也是用户的一部分space 但仅在内核中 运行?
要从用户空间查找地图元素,您应该使用the bpf(2)
syscall, with command BPF_MAP_LOOKUP_ELEM
. The main userspace library for BPF does expose this syscall command as bpf_map_lookup_elem()
。
要从 BPF 程序中查找地图元素,您确实需要使用 bpf_map_lookup_elem
BPF 助手。简而言之,BPF 助手是内核函数,您可以使用指令 call
.
尽管名称相同,但它们是不同的东西:第一个是库函数,而第二个是 BPF 助手。