gpt4 book ai didi

linux-kernel - 谁在 BPF 中创建 map

转载 作者:行者123 更新时间:2023-12-04 05:10:39 25 4
gpt4 key购买 nike

阅读后man bpf以及其他一些文档来源,我的印象是 map只能由用户进程创建。然而下面这个小程序似乎神奇地创造了bpf map :

struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(long),
.max_entries = 10,
};

SEC("sockops")
int my_prog(struct bpf_sock_ops *skops)
{
u32 key = 1;
long *value;
...

value = bpf_map_lookup_elem(&my_map, &key);
...
return 1;
}

所以我用内核的 tools/bpf/bpftool 加载程序并验证程序是否已加载:
$ bpftool prog show
1: sock_ops name my_prog tag f3a3583cdd82ae8d
loaded_at Jan 02/18:46 uid 0
xlated 728B not jited memlock 4096B

$ bpftool map show
1: array name my_map flags 0x0
key 4B value 8B max_entries 10 memlock 4096B

当然 map 是空的。但是,删除 bpf_map_lookup_elem从程序结果不会创建 map 。

更新
我用 strace 调试了它并发现在这两种情况下,即 bpf_map_lookup_elem没有它,bpftool 会调用 bpf(BPF_MAP_CREATE, ...)它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我会跟踪 bpftool map show , 和 bpf(BPF_MAP_GET_NEXT_ID, ..)立即返回 ENOENT ,它永远不会转储 map 。所以显然有些东西没有完成 map 创建。

所以我想知道这是否是预期的行为?

谢谢。

最佳答案

正如 antiduh 所解释的,并与您的 strace 确认支票,bpftool是在这种情况下创建 map 的用户空间程序。它调用函数 bpf_prog_load()来自 libbpf(在 tools/lib/bpf/ 下),最终执行系统调用。然后将程序固定在所需位置(在 bpf 虚拟文件系统挂载点下),以便在 bpftool 返回时不会卸载它。 map 没有固定。

关于 map 创建,魔术位也发生在 libbpf 中。当bpf_prog_load()被调用时,libbpf 接收目标文件的名称作为参数。 bpftool不要求加载此特定程序或特定 map ;相反,它提供目标文件,而 libbpf 必须处理它。所以libbpf中的函数解析这个ELF目标文件,最终找到对应maps和programs的多个section。然后它尝试加载第一个程序。

加载这个程序包括以下步骤:

CHECK_ERR(bpf_object__create_maps(obj), err, out);
CHECK_ERR(bpf_object__relocate(obj), err, out);
CHECK_ERR(bpf_object__load_progs(obj), err, out);

换句话说:首先创建我们在目标文件中找到的所有映射。然后执行 map 重定位(即将 map 索引关联到 eBPF 指令),最后加载程序指令。

所以关于你的问题:在这两种情况下,有和没有 bpf_map_lookup_elem() , map 是用 bpf(BPF_MAP_CREATE, ...) 创建的系统调用。之后,发生重定位,如果需要,程序指令将调整为指向新创建的 map 。然后一旦完成所有步骤并加载程序, bpftool退出。 eBPF 程序应该被固定,并且仍然加载到内核中。据我所知,如果它确实使用了映射(如果使用了 bpf_map_lookup_elem()),那么映射仍然被加载的程序引用,并保存在内核中。另一方面,如果程序不使用这些映射,那么就没有什么可以阻止它们了,所以当 bpftool 持有的文件描述符时,这些映射就会被销毁。关闭,当 bpftool返回。

所以最后,当 bpftool完成后,如果程序使用它,您将在内核中加载一个 map ,但如果没有程序依赖它,则没有 map 。在我看来,这听起来像是预期的行为;但是如果您在 bpftool 遇到奇怪的事情,请以一种或另一种方式执行 ping 操作。 ,我是该实用程序的工作人员之一。最后一个通用观察:映射也可以固定并保留在内核中,即使没有程序使用它们,如果需要保留它们。

关于linux-kernel - 谁在 BPF 中创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48067163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com