type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
跟踪点是内核代码的静态标记,可用于将代码附加在运行的内核中。跟踪点跟 kprobes 的主要区别在于跟踪点由内核开发人员在内核中编写和修改。这就是我们将跟踪点称作静态的原因。由于跟踪点是静态存在的,所以跟踪点的 ABI更稳定。内核保证旧版本上跟踪点将在新版本上存在。但是,考虑到跟踪点添加是由内核开发人员添加的,所以跟踪点可能并不会涵盖到内核的所有子系统。
通过查看 /sys/kernel/debug/tracing/events 目录下的内容可以查看系统中所有可用的跟踪点。例如查看 BPF 可用的所有的跟踪点:
notion image
编写使用跟踪点的 BPF 程序与编写 kprobes 跟踪程序类似。下面的示例是使用 BPF 程序跟踪系统中加载的其他 BPF 程序:

example.py

程序的主要区别是:不是将程序附加到 kprobe 上,而是将其附加到跟踪点上。BCC 遵循追踪点命名约定,首先是指定要跟踪的子系统,这里是 syscalls: ,然后是子系统中的跟踪点 sys_enter_bpf。这意味着每次内核执行 sys_enter_bpf 函数时,该程序将会收到该事件,并打印执行 sys_enter_bpf 指令的应用程序名称。
内核探针和跟踪点提供了对内核的完全访问。由于跟踪点更加安全,我们推荐尽可能使用跟踪点,当然这不是强制的。在某些场景下,我们也需要利用内核探针的动态性质。

运行结果展示

结果分析

分析一下 update 程序的源码,可以看到在代码里面首先是加载 bpf 对象(第一次进入 bpf ),然后是更新对应键的值(第二次进入 bpf)与上面的运行结果一致。
 
 
BPF 学习系列之 - 用户空间探针 - uprobes 与 uretprobes 使用 CoreDNS 对抗 DNS 污染