update fentry

This commit is contained in:
yunwei37
2023-04-09 20:29:48 +08:00
parent 9bf3d70229
commit 1bab2ca6a9

View File

@@ -6,6 +6,10 @@ eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网
## Fentry
fentryfunction entry和fexitfunction exit是eBPF扩展的伯克利包过滤器中的两种探针类型用于在Linux内核函数的入口和退出处进行跟踪。它们允许开发者在内核函数执行的特定阶段收集信息、修改参数或观察返回值。这种跟踪和监控功能在性能分析、故障排查和安全分析等场景中非常有用。
与 kprobes 相比fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样而不需要使用各种读取帮助程序。fexit 和 kretprobe 程序最大的区别在于fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。从 5.5 内核开始fentry 和 fexit 对 eBPF 程序可用。
```c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
@@ -34,11 +38,16 @@ int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret)
}
```
这段程序通过定义两个函数,分别附加到 do_unlinkat 和 do_unlinkat_exit 上。这两个函数分别在进入 do_unlinkat 和离开 do_unlinkat 时执行。这两个函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数来获取调用 do_unlinkat 的进程 ID文件名和返回值并在内核日志中打印出来
这段程序是用C语言编写的eBPF扩展的伯克利包过滤器程序它使用BPF的fentry和fexit探针来跟踪Linux内核函数do_unlinkat。在这个教程中我们将以这段程序作为示例让您学会如何在eBPF中使用fentry监测捕获unlink系统调用
与 kprobes 相比fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样而不需要使用各种读取帮助程序。fexit 和 kretprobe 程序最大的区别在于fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。
程序包含以下部分:
从 5.5 内核开始fentry 和 fexit 程序可用
1. 包含头文件包括vmlinux.h用于访问内核数据结构、bpf/bpf_helpers.h包含eBPF帮助函数、bpf/bpf_tracing.h用于eBPF跟踪相关功能
2. 定义许可证这里定义了一个名为LICENSE的字符数组包含许可证信息"Dual BSD/GPL"。
3. 定义fentry探针我们定义了一个名为BPF_PROG(do_unlinkat)的fentry探针该探针在do_unlinkat函数的入口处被触发。这个探针获取当前进程的PID进程ID并将其与文件名一起打印到内核日志。
4. 定义fexit探针我们还定义了一个名为BPF_PROG(do_unlinkat_exit)的fexit探针该探针在do_unlinkat函数的退出处被触发。与fentry探针类似这个探针也会获取当前进程的PID并将其与文件名和返回值一起打印到内核日志。
通过这个示例您可以学习如何在eBPF中使用fentry和fexit探针来监控和捕获内核函数调用例如在本教程中的unlink系统调用。
eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 <https://github.com/eunomia-bpf/eunomia-bpf> 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。