gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:45 28 4
gpt4 key购买 nike

纤毛 BPF and XDP Reference Guide描述了如何通过 iptc 命令将 BPF 程序加载到网络设备。我如何以相同的方式将 BPF 程序附加到内核函数/用户空间函数?

最佳答案

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

这是在 the load_and_attach function 中实现的内核中和 the bpf_attach_kprobe 中的文件 load_bpf.cbpf_attach_tracing_event function密件抄送中的文件 libbpf.c


您可以在追踪 the hello_world.py from bcc 时看到这一点。 :

$ 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,
  1. 第一个系统调用 (bpf) 在内核中加载 BPF 程序。
  2. 然后 bcc 按照 kprobe API 跟踪 sys_clone,方法是在 p:kprobes/p_sys_clone_bcc_8121 sys_clone 中写入 p:kprobes/p_sys_clone_bcc_8121 sys_clone
  3. bcc 在 p:kprobes/p_sys_clone_bcc_8121 sys_clone 中检索要在 perf_event_open 中使用的 ID。
  4. 密件抄送调用 perf_event_open 类型为 PERF_TYPE_TRACEPOINT
  5. 并使用 PERF_EVENT_IOC_SET_BPF ioctl 将加载的 BPF 程序(由 fd 0x3 引用)附加到该 perf_event。

关于c - 如何通过 kprobe 将 BPF 程序附加到内核函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48611499/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com