【发布时间】:2020-08-14 14:58:01
【问题描述】:
我想使用 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 克隆了最新的 libbpf 并做了 make 和 make install。我使用的是 Linux 5.8.0 内核。
更新:如果我将max_entries 更改为 4096 * 64 之类的值,问题似乎得到了解决,但我不知道为什么会这样。
【问题讨论】: