关于linux内核

时间:2016-11-26 02:58:32

标签: linux linux-kernel x86 arm kprobe

根据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相关联。执行   然后继续探测点之后的指令。

给出了三个步骤,但为什么需要singlepost_handler程序?我的意思是在用断点指令替换原始指令后,处理器被捕获来执行pre-handler,为什么不在pre-handler中复制pc减1的原始指令并恢复中断上下文?

请提示一下。

请参阅图表here以获得清晰度。

0 个答案:

没有答案