【发布时间】:2020-06-21 05:55:56
【问题描述】:
我想用 BPF_PROG_TYPE_CGROUP_DEVICE 在用户/内核端之间传递数据
我已将地图定义为:
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_ARRAY,
.key_size = sizeof(int),
.value_size = sizeof(int),
.max_entries = 100,
};
当我在 BPF 程序中执行以下操作时:
int ret = bpf_map_update_elem(&my_map, &key, &value, BPF_ANY);
void *out = bpf_map_lookup_elem(&my_map, &key);
if (!out)
{
// Never gets in here
}
我的代码永远不会进入 if 语句。
用户端
在用户方面,我使用辅助函数正确加载了对映射的引用,这些辅助函数为我提供了全局数组,例如
struct bpf_map_data map_data[MAX_MAPS];。
我可以通过以下方式获取地图名称:
printf("Name: %s \n", map_data[0].name);
这意味着我能够正确解析 SEC("maps") 属性的 ELF 文件,并且当我尝试以下操作时:
bpf_map_update_elem(map_data[0].fd, &key, &value, BPF_ANY);
bpf_map_lookup_elem(map_data[0].fd, &key, &value);
地图数据已更新,并且在用户空间中可见。
问题是我看不到 BPF 程序中定义的映射。我尝试过使用另一种类型的程序,它的行为符合预期。
我是否缺少这种类型的 BPF_PROG_TYPE_CGROUP_DEVICE 以及与地图共享的数据?
【问题讨论】: