我想使用eBPF的最新地图BPF_MAP_TYPE_RINGBUF,但我在网上找不到多少关于如何使用它的信息,所以我只是在这里做一些尝试和错误。我这样定义和使用它:
struct bpf_map_def SEC("maps") r_buf = {
.type = BPF_MAP_TYPE_RINGBUF,
.max_entries = 1 << 2,
};
SEC("lsm/task_alloc")
int BPF_PROG(task_alloc, struct task_struct *task, unsigned long clone_flags) {
uint32_t pid = task->pid;
bpf_ringbuf_output(&r_buf, &pid, sizeof(uint32_t), 0); //stores the pid value to the ring buffer
return 0;
}但是,在运行时,我得到了以下错误:
libbpf: map 'r_buf': failed to create: Invalid argument(-22)
libbpf: failed to load object 'bpf_example_kern'
libbpf: failed to load BPF skeleton 'bpf_example_kern': -22似乎libbpf不认识BPF_MAP_TYPE_RINGBUF?我从GitHub克隆了最新的GitHub,并做了make和make install。我正在使用Linux5.8.0内核。
UPDATE:如果我将max_entries改为4096 * 64,这个问题似乎就解决了,但我不知道为什么会这样。
发布于 2020-09-28 03:52:36
您是对的,问题在于BPF_MAP_TYPE_RINGBUF ( libbpf定义中的max_entries属性)的大小。它必须是内存页的倍数(至少在大多数流行的平台上是4096字节)。因此,当您指定64 * 4096时,这就解释了为什么所有这些都有效。
顺便说一句,如果您想看到一些使用它的例子,我将从BPF自我测试开始:
用户空间部分:https://github.com/torvalds/linux/blob/master/tools/testing/selftests/bpf/prog_tests/ringbuf.c
https://stackoverflow.com/questions/63415220
复制相似问题