【发布时间】:2018-06-12 12:35:39
【问题描述】:
在阅读man bpf 和其他一些文档来源后,我的印象是map 只能由用户进程创建。然而,以下小程序似乎神奇地创建了bpf 地图:
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
当然地图是空的。但是,从程序中删除 bpf_map_lookup_elem 会导致不会创建任何地图。
更新
我使用strace 对其进行了调试,发现在这两种情况下,即使用bpf_map_lookup_elem 并且没有它,bpftool 确实调用bpf(BPF_MAP_CREATE, ...) 并且它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我在bpftool map show 上搜索,bpf(BPF_MAP_GET_NEXT_ID, ..) 立即返回ENOENT,它永远不会转储地图。所以很明显有些东西没有完成地图的创建。
所以我想知道这是否是预期的行为?
谢谢。
【问题讨论】:
标签: linux-kernel bpf ebpf