3

写入特定地址时是否可以使 x86 cpu 中断?

我想要一种硬件机制来监视某些地址的变化。

4

1 回答 1

4

我想知道在写入特定地址时是否可以使 x86 cpu 中断?

有可能的。

您将其中一个调试寄存器 ( DR0to DR4) 设置为要监视的地址,然后将相应的标志配置DR7为“全局断点,仅在数据写入时中断,1 字节大小”。一旦完成,该 CPU 完成的任何正常数据写入都将触发调试异常(中断 1),并且调试异常处理程序可以找出发生了什么并执行您想要的任何操作(例如,向用户报告写入?)。

但是,有一些限制——你不能只在用户空间自己做,需要依赖内核的支持;并且内核的支持希望包括在任务切换期间保存/恢复调试寄存器(这样当您的任务在另一个 CPU 上运行时,您的断点不会停止工作,并且您的断点不会对其他任务造成问题)。因此(除非您完全控制计算机/CPU - 例如您正在编写自己的内核),通常您必须依赖操作系统提供的任何 API。

如果其他东西修改了内存(例如磁盘控制器或网卡),它也将不起作用。

于 2021-04-16T16:20:24.287 回答