movabsq rdi, 64bit_addr_of_struct_bpf_prog // unused if bpf stats are offmov rsi, rbx // prog start timecall __bpf_prog_exit // rcu_read_unlock, preempt_enable and stats mathmov rax, qword ptr [rbp - 8] // 将eth_type_trans函数的返回值放到rax寄存器中,作为TRAMPOLINE的返回值pop ...
libbpf没有 BCC 的代码重写魔法(code-rewriting magic),但提供了几种其他方式来 实现同样的目的。 方式二:libbpf+BPF_PROG_TYPE_TRACING(不可移植) 如果使用的是最近新加的BTF_PROG_TYPE_TRACING类型 BPF 程序,那校验器已经足够智 能了,能原生地理解和记录 BTF 类型、跟踪指针,直接(安全地)读取内核内存, 代码语...
Libbpf + BPF_PROG_TYPE_TRACING 方式: 代码语言:javascript 复制 pid_t pid=task->pid; 将该功能与BPF CO-RE配合使用,可以支持可移植(即可重定位)的字段读取,此时需要将此代码封装到编译器内置的__builtin_preserve_access_index中 BPF_PROG_TYPE_TRACING + BPF CO-RE 方式: 代码语言:javascript 复制 pid_...
prog = bpf_prog_get(prog_fd); if (IS_ERR(prog)) return PTR_ERR(prog); /* (2) 对于TRACE_EVENT_FL_TRACEPOINT类型的perf_event,需要绑定BPF_PROG_TYPE_TRACEPOINT类型的BPF prog 对于TRACE_EVENT_FL_UKPROBE类型的perf_event,需要绑定BPF_PROG_TYPE_KPROBE类型的BPF prog event->tp_event->prog =...
如果使用的内核版本还没支持 BPF_PROG_TYPE_TRACING,就必须显式地使用 bpf_probe_read() 来读取字段。 Non-CO-RE libbpf 方式: pid_t pid; bpf_probe_read(&pid, sizeof(pid), &task->pid); 1. 2. 有了CO-RE+libbpf,我们有两种方式实现这个目的。
一种eBPF程序类型:BPF_PROG_TYPE_TRACING,它支持如同c语言语法那样直接访问结构体成员。 处理结构体问题 回到最开始的例子,我们提到过struct task_struct内的state成员新一点的内核版本已经被重命名为__state(在21年被合并进了内核),那么如何编写一个使用到该成员的程序并且能够在不同的内核版本兼容就是一个值得关注...
内核在packet filter和tracing等应用中提供了一系列的钩子来运行BPF代码。目前支持以下类型的BPF代码: staticint __init register_kprobe_prog_ops(void){bpf_register_prog_type(&kprobe_tl);bpf_register_prog_type(&tracepoint_tl);bpf_register_prog_type(&perf_event_tl);return 0;}static int __init regi...
prog_type域表示程序将运行的上下文;它包括那些数据和辅助函数可供程序使用。BPF_PROG_TYPE_SOCKET用于使用socket的程序,BPF_PROG_TYPE_TRACING用于跟踪过滤器。程序的大小(以指令数衡量)由insn_cnt标识,insns域这个指针则指向程序本身。license域这个指针指向许可的描述信息,它未来可以用于限制非GPL程序的功能。
2:BPF_MAP_TYPE_PROG_ARRAYhid_jmp_table owner:BPF_PROG_TYPE_TRACINGJITed 4207:BPF_MAP_TYPE_PROG_ARRAYjmp_table owner:BPF_PROG_TYPE_SCHED_CLSJITed poke:2295:BPF_PROG_TYPE_EXTentrytail_call_reachable 4208:BPF_MAP_TYPE_ARRAYtailcall.bss ...
内核在packet filter和tracing等应用中提供了一系列的钩子来运行BPF代码。目前支持以下类型的BPF代码: static int __init register_kprobe_prog_ops(void){bpf_register_prog_type(&kprobe_tl);bpf_register_prog_type(&tracepoint_tl);bpf_register_prog_type(&perf_event_tl);return 0;} ...