这是谁在 BPF 中创建地图的后续行动,因为我的新问题与该线程没有直接关系。
所以,在我看来,必须有一个创建 BPF 映射的点,要么是 bpf 程序,要么是加载 bpf 的用户程序等。
BPF 程序必须在编译时知道它将使用的映射类型,所以我们需要:
struct bpf_map_def SEC("maps") my_map = {
...
};
所以这意味着一个用户程序,例如bpftool
,将启动在 bpf ELF 部分中找到的映射的创建,如谁在 BPF线程中创建映射所示。
另一方面,用户应用程序将需要在地图中添加/删除条目。为此,它必须知道 mapID
才能使用bpf_map_get_fd_by_id()
from获取 get map 的 fd libbpf
。之后我们就可以享受bpf_map_update_elem()
和类似的API了。
另一方面,如果我们在 BPF 程序中声明了一个 map 部分并且确实使用了 map API,则 map(s) 将保留在内核中并分配 ID。
所以在这种情况下,我们将有两个具有两个不同 ID 的映射:一个作为bpf_prog_load()
from的结果创建bpftool
,另一个来自用户应用程序bpf_create_map()
(假设应用程序继续运行,例如更新映射,并且不返回到 shell )。
一定有办法绕过这种歧义吗?