根据linux内核中的kprobe.txt,当我阅读linux内核的源代码以满足工作需求时,我有一个关于kprobe如何工作的小问题:
1.1 Kprobe如何工作?
当kprobe注册时,Kprobes会复制被探测的内容 指令并替换被探测指令的第一个字节 使用断点指令(例如,i386和x86_64上的int3)。
当CPU命中断点指令时,会发生陷阱,即CPU 保存寄存器,控制通过传递到Kprobes notifier_call_chain机制。 Kprobes执行“pre_handler” 与kprobe相关联,传递处理程序的地址 kprobe结构和保存的寄存器。
接下来,Kprobes单步执行探测指令的副本。 (它 单步执行实际指令会更简单,但是 然后Kprobes将不得不暂时删除断点 指令。这将在另一个CPU时打开一个小时间窗口 可以驶过探测点。)
指令单步后,Kprobes执行 “post_handler”,如果有的话,与kprobe相关联。执行 然后继续探测点之后的指令。
给出了三个步骤,但为什么需要single
和post_handler
程序?我的意思是在用断点指令替换原始指令后,处理器被捕获来执行pre-handler
,为什么不在pre-handler
中复制pc减1的原始指令并恢复中断上下文?
请提示一下。
请参阅图表here以获得清晰度。