linux内核中kprobe机制的一个难题

linux内核中kprobe机制的一个难题,linux,linux-kernel,x86,arm,kprobe,Linux,Linux Kernel,X86,Arm,Kprobe,当我阅读linux内核的源代码以满足工作需要时,我有一个关于kprobe如何工作的难题,根据linux内核: 1.1 Kprobe如何工作 注册kprobe后,Kprobes会制作一份被探测的文件的副本 指令,并替换被探测指令的第一个字节 使用断点指令(例如,i386和x86_64上的int3) 当CPU命中断点指令时,会出现陷阱,CPU的 保存寄存器,并通过 通知程序\调用\链机制。Kprobes执行“pre_处理程序” 与kprobe关联,向处理程序传递 kprobe结构和保存的寄存器 接下

当我阅读linux内核的源代码以满足工作需要时,我有一个关于kprobe如何工作的难题,根据linux内核:

1.1 Kprobe如何工作

注册kprobe后,Kprobes会制作一份被探测的文件的副本 指令,并替换被探测指令的第一个字节 使用断点指令(例如,i386和x86_64上的int3)

当CPU命中断点指令时,会出现陷阱,CPU的 保存寄存器,并通过 通知程序\调用\链机制。Kprobes执行“pre_处理程序” 与kprobe关联,向处理程序传递 kprobe结构和保存的寄存器

接下来,Kprobes单步执行其被探测指令的副本。(It) 将实际指令单步执行会更简单,但是 然后kprobe必须临时删除断点 指令。当另一个CPU 可以直接驶过探测点。)

指令单步执行后,Kprobes执行 与kprobe关联的“post_handler”(如果有)。执行 然后继续执行probepoint后面的指令

给出了三个步骤,但为什么需要
single
post\u处理程序
过程?我的意思是,在用断点指令替换原始指令后,处理器被困在执行
预处理程序
,为什么不在
预处理程序
中用pc减1复制原始指令并恢复中断上下文

请给我一个提示


请参见图表以了解清楚性。

您引用的文档有一个解释。仔细阅读以下部分:“单步执行实际指令会更简单……”duskwuff呃,是的,就是这样,这很尴尬,谢谢。你引用的文档有一个解释。仔细阅读以下部分:“单步执行实际指令会更简单……”duskwuff呃,是的,就是这样,这很尴尬,谢谢。