Linux kernel ebpf:拦截函数调用

Linux kernel ebpf:拦截函数调用,linux-kernel,system-calls,bpf,kprobe,ebpf,Linux Kernel,System Calls,Bpf,Kprobe,Ebpf,我正在阅读关于kprobesBPF程序类型的文章,我想知道是否有可能不只是为了跟踪而拦截函数调用或收集一些低级信息(寄存器、堆栈等),而是代替调用并执行,而不是实际的函数 kprobe是否提供了此功能,或者我使用了错误的工具?否,kprobes BPF程序只能读取syscall参数和返回值,它们无法修改寄存器,因此无法拦截函数调用。这是BPF验证器施加的限制 但是,内核模块可以使用kprobe拦截函数调用。感谢您的反馈!所以我想这是起点。是的。您可能也感兴趣。嗯,是的,可以更改kprobe的预处

我正在阅读关于
kprobes
BPF程序类型的文章,我想知道是否有可能不只是为了跟踪而拦截函数调用或收集一些低级信息(寄存器、堆栈等),而是代替调用并执行,而不是实际的函数


kprobe
是否提供了此功能,或者我使用了错误的工具?

否,kprobes BPF程序只能读取syscall参数和返回值,它们无法修改寄存器,因此无法拦截函数调用。这是BPF验证器施加的限制


但是,内核模块可以使用kprobe拦截函数调用。

感谢您的反馈!所以我想这是起点。是的。您可能也感兴趣。嗯,是的,可以更改kprobe的预处理程序中的IP寄存器,以将执行重定向到您的函数,而不是原来的函数,不过,我还想看一看,它也可以用来替换函数。也许,这可能更容易使用,但这是一个品味的问题。事实上,Ftrace已经做到了这一点。您还可以看看它是如何用来替换内核函数的。