ebpf开发bcc之opensnoop方法源码阅读(上)
今天一起来阅读libbpf-tools下使用C语言开发的工具opensnoop
opensnoop 功能是监听 syscalls 下的open方法的一个调用,使用此工具进行open函数的可观测性打印
下面直接开始源码阅读
这里只列举出关键方法,其余方法在视频中学习
opensnoop.bpf.c 内核态程序,他的作用是程序加载到ebpf虚拟机之后,当发生系统调用'open' 后触发对应的内核态方法执行,下面一一列出方法的详细说明
这里不得不说下:
以下三个介绍统属于跟踪文件系统:
tracepoint : 跟踪点(对于新人来说此时暂且理解ebpf中这个声明是固定的,他的类型很多我们在别的篇幅中专门对他进行学习)
syscalls: 跟踪点类型(在 debugfs 中对跟踪点的类型进行了各种的分类,如:TCP,电源,系统调用,网络等等类型这个也在以后章节中说明)
sys_enter_open: 跟踪点的名称(他是由linux内核管理者进行维护,随着linux版本的升级跟踪点名字不会发生改变,提供了更好的版本兼容性,通俗的说sys_enter_open的声明对应着系统调用中的 open方法)
SEC("tracepoint/syscalls/sys_enter_open") 的定义意味着如果linux内核方法open方法发生调用时将触发下面的 tracepoint__syscalls__sys_enter_open(struct trace_event_raw_sys_enter* ctx) 方法的执行。
与上方相对应的还有一个,当open 方法执行完毕以后会触发下方内核态函数的执行
细心点可以发现这里使用的跟踪点名称是sys_exit_open 他和sys_enter_open"是成对出现,在跟踪系统文件中默认这样定义的,对于我们来说,当进入(enter) 一个方法时,我们可以拿到方法的参数信息,当退出(exit)一个方法时我们可以得到一个方法返回值信息。
下面我们看以下方法:
trace_exit();
代码中的注释写的很详细,其中我们重点关心的方法是
bpf_perf_event_output() 方法 他使用到环形缓冲区机制,更好的达到了数据传输的准确性(避免打印错乱,无数据大小限制)和性能,将event中当前发生的事件结果映射到events Array类型的结构体中供用户态使用
opensnoop 内核态学习到此结束,下章分享学习用户态程序的实现方法

