Я хотел использовать последнюю карту 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
? Я клонировал последний libbpf
с GitHub и сделал make
и make install
. Я использую ядро Linux 5.8.0.
ОБНОВЛЕНИЕ: проблема кажется решенной, если я изменил max_entries
на что-то вроде 4096 * 64, но я не знаю, почему это так.