如何通过kprobe将BPF程序附加到内核函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过kprobe将BPF程序附加到内核函数?相关的知识,希望对你有一定的参考价值。

Cilium BPF and XDP Reference Guide描述了如何通过q​​azxswpoi和ip命令将BPF程序加载到netdevice。如何以相同的方式将BPF程序附加到内核函数/用户空间函数?

答案

TL; DR您可以使用传统的tc来跟踪函数,然后使用kprobe API + perf_event_open来附加BPF程序。

这是在内核中ioctl文件的the load_and_attach function和bcc中load_bpf.c文件的the bpf_attach_kprobebpf_attach_tracing_event function中实现的。


跟踪libbpf.c时,您可以看到这一点:

the hello_world.py from bcc
  1. 第一个系统调用($ 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 ", 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程序。
  2. 然后bcc跟随kprobe API通过在bpf中编写sys_clone来跟踪p:kprobes/p_sys_clone_bcc_8121 sys_clone
  3. bcc在p:kprobes/p_sys_clone_bcc_8121 sys_clone中检索在p:kprobes/p_sys_clone_bcc_8121 sys_clone中使用的ID。
  4. bcc用perf_event_open类型调用perf_event_open
  5. 并使用PERF_TYPE_TRACEPOINT ioctl将加载的BPF程序(由fd 0x3引用)附加到该perf_event。

以上是关于如何通过kprobe将BPF程序附加到内核函数?的主要内容,如果未能解决你的问题,请参考以下文章

eBPF监控工具bcc系列八BPF C

XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性

XDP/eBPF — 基于 eBPF 的 Linux Kernel 可观测性

linux内核调试工具之kprobe

eBPF理解

linux内核调试工具之kprobe