下图是BPF内部逻辑图,可以看出如何从bpftrace program经过AST,LLVM IR,BPF bytecode这几个阶段,最终得到machine code由CPU来执行。接下来我们详细介绍一下每个阶段。 2. bpftrace program → AST 我们以下面这个bpftrace One-Liner作为例子,介绍一下如何把bpftrace program转化成抽象语法树AST。 # bpftrace -e 'kprobe...
BPF 指令的核心结构体如下,每一条 eBPF 指令都以一个 bpf_insn 来表示,在 cBPF 中是其他的一个结构体(struct sock_filter ),不过最终都会转换成统一的格式,这里我们只研究 eBPF:由结构体中的__u8 code 可以知道,一条 BPF 指令是 8 个字节长。这 8 位的 code,第 0、1、2 位表示的是该操作指令...
下面是描述 BPF 程序类型的枚举结构:enum bpf_prog_type { BPF_PROG_TYPE_UNSPEC, /* Reserve 0 as invalid program type */ BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_KPROBE, BPF_PROG_TYPE_SCHED_CLS, BPF_PROG_TYPE_SCHED_ACT, BPF_PROG_TYPE_TRACEPOINT, BPF_PROG_TYPE_XDP, BPF_PROG_TYPE_...
2) bpf_program__attach_perf_event_opts上面我们已经找到了"vfs_read"内核对应的函数地址,通过perf_event的fd关联起来(如此处的pfd) 4.3 perf_event_open_probe 1. 构建perf_event_attr结构体,用于向内核传递数据。如ret probe会额外设置attr.config |= 1、 attr.type传递是kprobe类型(6)、attr.config1传递的...
2.4 BPF 指令集BPF(默认指 eBPF 非 cBPF) 程序指令都是 64 位,使用了 11 个 64 位寄存器,32 位称为半寄存器(subregister)和一个程序计数器(program counter),一个大小为 512 字节的 BPF 栈。所有的 BPF 指令都有着相同的编码方式。eBPF虚拟指令系统属于 RISC,拥有 11 个虚拟寄存器、r0-r10,在实际运行时...
= 0) { delta = bpf_ktime_get_ns() - *tsp; dist.increment(bpf_log2l(delta / 1000)); // 修改直方图数据,key 为 bpf_log2l(delta / 1000),即 千分之差值的 2 的对数 start.delete(&pid); } return 0; } ''' # load BPF program b = BPF(text = bpf_src) b.attach_kprobe(event...
BPF(默认指 eBPF 非 cBPF) 程序指令都是 64 位,使用了 11 个 64 位寄存器,32 位称为半寄存器(subregister)和一个程序计数器(program counter),一个大小为 512 字节的 BPF 栈。所有的 BPF 指令都有着相同的编码方式。eBPF虚拟指令系统属于 RISC,拥有 11 个虚拟寄存器、r0-r10,在实际运行时,虚拟机会把这...
BPF(默认指 eBPF 非 cBPF) 程序指令都是 64 位,使用了 11 个 64 位寄存器,32 位称为半寄存器(subregister)和一个程序计数器(program counter),一个大小为 512 字节的 BPF 栈。所有的 BPF 指令都有着相同的编码方式。eBPF虚拟指令系统属于 RISC,拥有 11 个虚拟寄存器、r0-r10,在实际运行时,虚拟机会把这...
BPF_KPROBE(uprobe)和BPF_KRETPROBE(uretprobe)分别定义了进入函数(uprobe)和退出函数(uretprobe)时执行的动作。括号中的名字会生成struct bpf_program 和struct bpf_link类型的结构体成员名,在 selfuprobe.skel.h 文件中有体现 example/c/selfuprobe.c ...
BPF(默认指 eBPF 非 cBPF) 程序指令都是 64 位,使用了 11 个 64 位寄存器,32 位称为半寄存器(subregister)和一个程序计数器(program counter),一个大小为 512 字节的 BPF 栈。所有的 BPF 指令都有着相同的编码方式。eBPF虚拟指令系统属于 RISC,拥有 11 个虚拟寄存器、r0-r10,在实际运行时,虚拟机会把这...