假设有两个程序(用户程序和内核程序)。
用户程序通过api制作bpf图bpf_create_map_name
() 返回 fd。有了这个 fd,我可以通过系统调用访问地图(例如,bpf_map_update
(FD,..))。但我只能在用户空间程序中执行此操作,因为 fd 仅对用户程序(=用户进程)有效,然后如何在 bpf 程序(位于内核空间)中访问该映射?
我听说我可以通过 libbpf 将地图固定在 fs 中bpf_obj_pin
(fd,文件路径)并且可以通过 libbpf 获取此映射bpf_obj_get
(文件路径)但问题是bpf_obj_get
仅在用户空间中可用,因为这是系统调用。
之前看过类似的讨论(从内核空间访问 BPF 映射 https://stackoverflow.com/questions/70707891/accessing-bpf-maps-from-kernel-space)。但这对我来说并不清楚。通过以下方式访问 bpf 地图bpf_map_lookup_elem
(fd, ..) 在内核空间,我必须提前知道map的fd。但正如我之前提到的,map 的 fd 在内核中无效。
我使用的是 libbpf 而不是 BCC。
你可能应该看看 libbpf 的函数bpf_map__reuse_fd() https://elixir.bootlin.com/linux/v5.17/source/tools/lib/bpf/libbpf.c,它允许重用指向 BPF 程序的现有映射的文件描述符。
这是使用此函数的示例 https://elixir.bootlin.com/linux/v5.17/source/tools/testing/selftests/bpf/prog_tests/pinning.c#L253:我们首先检索一个指向要替换的地图的指针struct bpf_object
通过致电bpf_object__find_map_by_name()
,然后告诉它重用现有的 fd。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)