这个例子给出了 BPF_HASH 用于内核态向用户态传递数据的场景。主要有以下几个关键点:BPF_HASH(counts, struct info_t, struct val_t):本次声明的哈希表,key 和 val 均为一个结构体,这在实操上是常见的。不过要注意 eBPF 运行栈大小限制。 valp = counts.lookup_or_try_init(&info, &zero):内核态的...
) if start == 0: start = ts ts = ts - start print("At time %.2f s: multiple syncs detected, last %s ms ago" % (ts, ms)) 内容包括: bpf_ktime_get_ns(): 返回纳秒为单位的时间 BPF_HASHlast):创建一个hash(关联数组)的BPF map对象,称为”last“,由于没有进一步指定任何参数,...
BCC是eBPF的一个工具集,是对eBPF提取数据的上层封装,BCC工具编程形式是Python中嵌套BPF程序。Python代码可以为用户提供友好使用eBPF的上层接口,也可以用于数据处理。BPF程序会注入内核,提取数据。当BPF程序运行时,通过LLVM将BPF程序编译得到BPF指令集的elf文件,从elf文件中解析出可以注入内核的部分,使用bpf_load_program方...
BPF_HASH(start, u32); BPF_HASH(arg0, u32); int begin(struct pt_regs *ctx, int cpu) { struct data_t data = {}; u64 pid_tgid = bpf_get_current_pid_tgid(); u32 pid = pid_tgid >> 32; u32 tid = (u32)pid_tgid; u64 ts, c = 0; c = (u64)cpu; bpf_get_current_co...
使用BPF Map。BPF Map也可以在不同的BPF程序中传递数据。其实BPF_PERF_OUTPUT也是使用了一种eBPF map。 // c BPF_HASH(ipv4_send_bytes, struct ipv4_key_t); ... ipv4_send_bytes.increment(ipv4_key, size); # python ipv4_send_bytes = b["ipv4_send_bytes"]...
通过python的BPF.attach_uprobe()可以将普通C函数关联到uprobe探针。 参数可以通过PT_REGS_PARM宏来检测。 程序本身名字使用宏PT_REGS_PARM1,第一个参数使用宏PT_REGS_PARM2。 1.5uretprobes 同uprobes,只不过该探针是在函数返回时候触发。 返回的值通过PT_REGS_RC(ctx)获取,例如: ...
opensnoop通过动态追踪sys_open()内核函数并更新函数的任何变化,opensnoop需要Linux Kernel 4.5版本支持,由于使用BPF,因此需要root权限。 opensnoop [-h] [-T] [-U] [-x] [-p PID] [-t TID] [-u UID] [-d DURATION] [-n NAME] [-e] [-f FLAG_FILTER] ...
BPF_HASH(start, u32); int do_entry(struct pt_regs *ctx) //pt_regs结构定义了在系统调用或其他内核条目期间将寄存器存储在内核堆栈上的方式 { u32 pid; u64 ts; pid = bpf_get_current_pid_tgid(); ts = bpf_ktime_get_ns(); //bpf_ktime_get_ns返回自系统启动以来所经过的时间(以纳秒为单...
可以看到,这里在由malloc第一次调用gen_alloc_enter之后,mmap也调用了gen_alloc_enter,由于我们的BPF_HASH(sizes, u32, u64)的主键是tid,所以原来为四字节的部分就被冲刷掉了,自然而然就少统计了四个字节。 理想中的统计抵消过程如下图(:表示map的映射): ...
通过往eBPF挂载函数中添加参数可以捕获对应函数的参数; 用指针的地址作为BPF的HASH的key很有效; BPF_PERF_OUTPUT是很好的输出方法,通过perf ring buffers进行输出,bcc前端需要用perf_buffer_poll来轮询这块区域,并通过open_perf_buffer(callback)来捕获对应的数据并传给callback函数调用; 下次再见!