据我所知,现代操作系统提供了用于调试的 API。当调试器进程要求内核在另一个进程的机器代码指令上设置断点时,内核会用导致中断的操作码替换指令的第一个字节。
中断处理程序将停止进程,保存寄存器并通知调试进程。
我不明白的是乱序执行处理器上到底发生了什么。中断指令可以在其前驱指令之前执行,也可以在其祖先指令之后执行,因此,在中断发生时,寄存器和内存将包含错误的值。
最佳答案
这就是为什么所有有序事件(例如中断、故障、异常等)始终在乱序处理器的提交点进行处理,在乱序处理器中恢复原始程序顺序并捕获正确的机器状态。这意味着您可能知道有待处理的事件,但仍会延迟处理它。
请注意,外部世界可见的操作(例如存储到内存)也会在此阶段之后处理,因此您永远无法查看无序核心的推测内部状态(好吧,除了侧 channel 攻击方法。 ..),并且任何中断或断点也将根据它们正确排序
关于debugging - 软件断点和现代 OOOE 处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28155797/