关于新版本内核(4.17+)以后无法使用jprobe的替代方案
之前调试内核一直使用的是jprobe api来hook内核函数,一直使用非常方便。jprobe的好处是在于可以无缝的hook函数的入口,保持一致的参数调用而不必像kprobe那样函数入口处的参数寄存器和调用栈需要自己去处理和提取。但是自从2017年4.17版本的内核发布以后,jprobe相关的api已经被禁用,从5.2以后的内核开始,所有相关的代码都已经被移除了,那么在这个之后的版本里面要hook内核函数应该如何实现呢。为此笔者专门阅了内核commit的邮件list中发现了这样一段话:
Nowadays ftrace and other tracing features are enough matured to replace jprobe use-cases. Users can safely use ftrace and perf probe etc. for their use cases. So we have better way. IOW, jprobe finished its task. People who still use jprobe, must migrate to other tracing features. Please consider to migrate your tool to following options.
大概意思是说,目前内核代码里面已经有很多其他更成熟性能更好的trace工具来代替jprobe的功能了,比如perf probe和ftrace,jprobe作为一个临时解决方案已经完成他的使命了,让大家迁移到其他两个工具。
目前网上文章对于内核函数的hook一直用的是jprobe,对于使用ftrace的介绍并不多,目前只找到一个ftrace用于内核函数hook的案例,不过这个案例只能在x86-64架构里面使用,如果有需要可以参考。
https://github.com/ilammy/ftrace-hook
至于arm,mips之类的架构下如何使用ftrace来hook内核函数,打算之后写一篇文章详细讨论一下。
wood
请教作者,arm中如何使用 ftrace来hook函数,有更新wiki吗