这是谁在 BPF 中创建地图的后续行动,因为我的新问题与该线程没有直接关系。
所以,在我看来,必须有一个点在那里创建了一个BPF地图,无论它是一个BPF程序或用户程序加载BPF等。
BPF 程序必须在编译时知道它要使用的映射类型,所以我们需要:
struct bpf_map_def SEC("maps") my_map = {
...
};
Run Code Online (Sandbox Code Playgroud)
因此,这意味着,例如bpftool,用户程序将启动在 bpf ELF 部分中找到的映射的创建,如谁在 BPF线程中创建映射所示。
另一方面,用户应用程序需要在地图中添加/删除条目。要做到这一点,它必须知道 mapID以便bpf_map_get_fd_by_id()从 from获得 get map 的 fd libbpf。之后我们就可以享受bpf_map_update_elem()和类似的API了。
另一方面,如果我们在 BPF 程序中声明了一个映射部分并且确实使用了映射 API,那么映射将被保留在内核中并被分配 ID。
因此,在这种情况下,我们将有两个具有两个不同 ID 的映射:一个作为bpf_prog_load()from的结果创建bpftool,另一个来自用户应用程序的bpf_create_map()(假设应用程序继续运行,例如更新映射,并且不返回到 shell )。
一定有办法绕过这种歧义吗?
我不完全确定我理解你的问题,让我试着改写一下。
bpftool,它会创建程序所需的所有映射。bpftool 是一个用户空间应用程序,最终通过bpf(BPF_MAP_CREATE, …)系统调用创建映射。foobar与这些地图交互的用户空间应用程序,可能通过使用 libbpf(最终执行bpf(BPF_MAP_*, …)系统调用)从地图中查找、更新或删除元素。foobar 也尝试创建地图。因此,您创建的地图bpftool和创建的地图之间存在冲突foobar。如果这是正确的,解决的办法是“简单”:你不重复建立的地图。
这意味着您应该bpf_create_map()从其他应用程序中删除对 的调用foobar,或者使用除bpftool. 通常,工作流包括在 eBPF 对象文件中描述映射,并由加载程序的同一个应用程序创建,就在加载之前——这就是bpftool它的作用。然后应用程序具有映射的文件描述符并可以对其进行处理。
或者,可以将映射固定在 BPF 虚拟文件系统 ( /sys/fs/bpf/) 下,以便另一个应用程序可以检索文件描述符,也可以访问此映射。这是通过系统调用完成的bpf(BPF_OBJ_GET, …)(目前还没有在手册页上记录,至少在我的系统上)。
如果我是对的,使用固定映射还可以允许在加载新的 eBPF 程序时重用已经存在的映射。我相信tc从包 iproute2 打算这样做,如果描述的地图存在并且已经固定(请参阅文件lib/bpf.c,但代码并不容易阅读)。这通常会在重定位时执行。
最近添加了映射 ID,主要用于调试或自省,但在您的情况下,它们可能提供另一种方法来检索映射的文件描述符,如您使用bpf_map_get_fd_by_id(). 虽然首先得想办法拿到ID。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1080 次 |
| 最近记录: |