问题描述
是否可以在写入特定地址时使 x86 cpu 中断?
我想要一个硬件机制来监控一些地址的变化。
解决方法
我想知道是否可以在写入特定地址时使x86 cpu中断??
这是可能的。
您将调试寄存器之一(level = math.floor( xp / (2000 + (math.floor( xp / 2000) * 200)))
到 DR0
)设置为要监视的地址,然后将 DR4
中的相应标志配置为“全局断点,中断只写数据,1 字节大小”。一旦完成,该 CPU 完成的任何正常数据写入都将触发调试异常(中断 1),并且调试异常处理程序可以弄清楚发生了什么并执行您想要的任何操作(例如向用户报告写入?)。
然而,有一些限制——你不能在用户空间自己做这件事,需要依赖内核的支持;内核的支持希望包括在任务切换期间保存/恢复调试寄存器(这样当您的任务在另一个 CPU 上运行时,您的断点不会停止工作,并且您的断点不会导致其他任务出现问题)。因此(除非您完全控制计算机/CPU - 例如您正在编写自己的内核)通常您必须依赖操作系统提供的任何 API。
如果其他东西修改了内存(例如磁盘控制器或网卡),它也不会工作。