我看到,对于python BCC实现,系统调用__x64_sys_openat
用于附加kprobe,但在libbpf实现中,kprobe附加到sys_enter_openat
。似乎两者都捕获了openat()
系统调用,我用cat file.txt
测试了它。
它们之间有什么区别?使用哪一个更可靠?
__x64_sys_openat
是Linux内核中某个函数的名称,BCC将kprobe附加到该函数。
sys_enter_openat
是Linux中跟踪点的名称,这意味着这是一个(或多或少(稳定的接口,您可以挂接它进行跟踪,包括使用eBPF程序。您可以通过在/sys/kernel/debug/tracing/events/
下列出条目来查看系统上可用的跟踪点。我认为BCC也有一个叫做tplist
的实用程序来帮助它
如果可以选择,我建议尽可能挂接跟踪点,因为它们往往比内核内部更稳定:例如,__x64_sys_openat
的参数或该函数的名称可能在不同的内核版本之间发生变化;或者名称会在其他架构上更改,et cætera。但是,跟踪点不太可能改变。注意,使用CO-RE的eBPF在一定程度上减轻了内核内部的不稳定性。
那么,并不总是可以挂接到跟踪点:您只能使用内核中的一个现有跟踪点。如果您想挂接到另一个不存在跟踪点的随机函数(假设该函数在编译时没有内联-通过在/proc/kallsyms
中查找它来检查(,那么您需要使用kprobe。
有时,您还需要格外注意您钩住的位置。例如,对于安全用例(即阻止系统调用(,系统调用跟踪点(或者相应的内核函数,显然(并不总是最好的挂钩点,因为它们可能会让您容易受到TOCTOU攻击。LSM钩子可能是该用例的一个很好的解决方案。