Debugging 软件断点和现代OOOE处理器

Debugging 软件断点和现代OOOE处理器,debugging,operating-system,computer-architecture,Debugging,Operating System,Computer Architecture,我知道现代操作系统提供了用于调试的api。当调试器进程要求内核在另一进程的机器代码指令上设置断点时,内核会用导致中断的操作码替换指令的第一个字节 中断处理程序将停止进程,保存寄存器并通知调试进程 我不明白的是无序执行处理器上到底发生了什么。中断指令可以在它的前辈之前执行,也可以在它的前辈之后执行,因此,在中断时,寄存器和内存将包含错误的值。这就是为什么所有有序事件(如中断、故障、异常等)总是在无序处理器的提交点处处理的原因,恢复原始程序顺序并捕获正确的机器状态。这意味着您可能知道挂起的事件,但仍

我知道现代操作系统提供了用于调试的api。当调试器进程要求内核在另一进程的机器代码指令上设置断点时,内核会用导致中断的操作码替换指令的第一个字节

中断处理程序将停止进程,保存寄存器并通知调试进程


我不明白的是无序执行处理器上到底发生了什么。中断指令可以在它的前辈之前执行,也可以在它的前辈之后执行,因此,在中断时,寄存器和内存将包含错误的值。

这就是为什么所有有序事件(如中断、故障、异常等)总是在无序处理器的提交点处处理的原因,恢复原始程序顺序并捕获正确的机器状态。这意味着您可能知道挂起的事件,但仍然会延迟处理它


请注意,外部世界可见的操作(如存储到内存)也会在这一阶段之后处理,因此您永远无法查看无序内核的推测内部状态(除了侧通道攻击方法…),任何中断或断点也将根据它们正确排序

似乎相关“内核将指令的第一个字节替换为导致中断的操作码”-不,不是今天。现代处理器内置调试硬件,允许调试器在各种情况下中断,例如指令指针与断点寄存器匹配。异步事件(相对于指令流),通常称为中断,可以选择提交点。此外,同步事件处理可以在承诺之前(推测地)开始。当然,到目前为止,还没有人(AFAIK)认为这样做的好处值得这么复杂!(这样的细微差别可能会让寻找问题答案的人感到困惑。)如果说现代处理器(OoO和订单发布/OoO完成)提供了精确的例外情况,那么OP就有了一个用于进一步研究的术语。同样,区分体系结构状态(如寄存器和内存值)与非体系结构状态和效果(如电源使用、DRAM访问、缓存内容)可能比“外部世界可见的操作”更“技术正确”,但目标受众不太清楚。不以博学来埋葬人通常是一种美德+1@PaulA.Clayton-关于精确异常的观点很好,但体系结构与非体系结构并不是我要说的重点-DRAM写入访问(我将其定义为体系结构,因为内存是系统体系结构状态的一部分)比内部寄存器写入问题更大(这显然是架构性的,但很容易隐藏以防外部检查,并在需要暴露时回滚)。因此,区别在于外部可见的效果和内部可以自由推测的效果。顺便说一句,你对异步事件的看法也是正确的,但他询问了断点/陷阱(我要添加软件级中断)这需要更高的精度。诡辩:寄存器写入不一定是体系结构(与微体系结构相反);遗憾的是,“体系结构”过载,有时意味着微体系结构/组织(例如,“Nehalem体系结构”),有时意味着体系结构/ISA(即ISA适当的接口保证和其他接口保证,如内存排序),有时还意味着更广泛的内容(“计算机体系结构”)(我应该抵制住如此健谈的诱惑!)