debugging - 软件断点和现代 OOOE 处理器

标签 debugging operating-system cpu-architecture

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

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

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

最佳答案

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

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

关于debugging - 软件断点和现代 OOOE 处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28155797/

相关文章:

java - Java:读取时文件损坏的每一行的第一个字母

parallel-processing - 在本书的上下文中,所谓的 "Fine-Grained Parallelism"究竟意味着什么?

caching - 在 L1、L2 和 L3 缓存方面的缓存命中和缓存未命中数

assembly - 什么是机器周期?

javascript - 在 Visual Studio(或其他 JS 调试器)中调试 Javascript

java - 使用外部程序将输入发送到 GDB scanf

c# - 带有远程设备的控制台 Windows Phone 8

c - 是否可以完全用 C 编写操作系统?

CreateProcess 方法以错误结束

caching - 程序的大小如何会增加缓存未命中率?