Как я могу прикрепить программу BPF к функции ядра через kprobe?
Справочное руководство по Cilium BPF и XDP описывает, как вы можете загрузить программу BPF в сетевое устройство через ip
а также tc
команды. Как бы я прикрепил программу BPF к функции ядра / функции пространства пользователей таким же образом?
1 ответ
Решение
TL;DR Вы можете использовать традиционный API kprobe для отслеживания функции, затем perf_event_open
+ ioctl
прикрепить программу BPF.
Это реализовано в load_and_attach
функция файла load_bpf.c
в ядре, и в bpf_attach_kprobe
а также bpf_attach_tracing_event
функция файла libbpf.c
в оц.
Вы можете увидеть это в действии при отслеживании hello_world.py
из ОЦК:
$ strace -s 100 python examples/hello_world.py
[...]
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_KPROBE, insn_cnt=15, insns=0x7f35716217d0, license="GPL", log_level=0, log_size=0, log_buf=0, kern_version=265728}, 72) = 3
openat(AT_FDCWD, "/sys/bus/event_source/devices/kprobe/type", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/bus/event_source/devices/kprobe/format/retprobe", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/sys/kernel/debug/tracing/kprobe_events", O_WRONLY|O_APPEND) = 4
getpid() = 8121
write(4, "p:kprobes/p_sys_clone_bcc_8121 sys_clone", 40) = 40
close(4) = 0
openat(AT_FDCWD, "/sys/kernel/debug/tracing/events/kprobes/p_sys_clone_bcc_8121/id", O_RDONLY) = 4
read(4, "1846\n", 4096) = 5
close(4) = 0
perf_event_open({type=PERF_TYPE_TRACEPOINT, size=0 /* PERF_ATTR_SIZE_??? */, config=1846, ...}, -1, 0, -1, PERF_FLAG_FD_CLOEXEC) = 4
mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_SHARED, 4, 0) = 0x7f356c58b000
ioctl(4, PERF_EVENT_IOC_SET_BPF, 0x3) = 0
ioctl(4, PERF_EVENT_IOC_ENABLE, 0) = 0
openat(AT_FDCWD, "/sys/kernel/debug/tracing/trace_pipe", O_RDONLY) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(5,
- Первый системный вызов (
bpf
) загружает программу BPF в ядро. - Затем bcc следует API-интерфейсу kprobe для отслеживания
sys_clone
написавp:kprobes/p_sys_clone_bcc_8121 sys_clone
вp:kprobes/p_sys_clone_bcc_8121 sys_clone
, - ОЦК извлекает, в
p:kprobes/p_sys_clone_bcc_8121 sys_clone
ID для использования вperf_event_open
, - скрытые звонки
perf_event_open
с типомPERF_TYPE_TRACEPOINT
- и присоединяет загруженную программу BPF (на которую указывает fd
0x3
) к этому perf_event, сPERF_EVENT_IOC_SET_BPF
IOCTL.