欢迎光临散文网 会员登陆 & 注册

ebpf开发bcc之opensnoop方法源码阅读(上)

2023-04-09 23:01 作者:云知道B  | 我要投稿

今天一起来阅读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 内核态学习到此结束,下章分享学习用户态程序的实现方法



ebpf开发bcc之opensnoop方法源码阅读(上)的评论 (共 条)

分享到微博请遵守国家法律