是否可以设置在 cpu 写入特定地址时中断的中断?
Is that possible to set interrupt that breaks when cpu write to an specific address?
是否可以在写入特定地址时使 x86 cpu 中断?
我想要一个硬件机制来监控一些地址的变化。
I would like to know if it is possible to make x86 cpu intrrupt when specific address is being written??
有可能。
你将其中一个调试寄存器(DR0
到DR4
)设置为你想要监控的地址,然后将DR7
中的相应标志配置为“全局断点, 中断数据只写,1 字节大小”。完成后,CPU 完成的任何正常数据写入都将触发调试异常(中断 1),调试异常处理程序可以弄清楚发生了什么并执行您想要的任何操作(例如,向用户报告写入?)。
但是,有一些限制——你不能自己在 user-space 中做这件事,需要依赖内核的支持;并且内核的支持希望在任务切换期间包括 saving/restoring 调试寄存器(这样当您的任务在另一个 CPU 上 运行 时您的断点不会停止工作,并且您的断点不会' 导致其他任务出现问题)。因此(除非您完全控制 computer/CPU - 例如,您正在编写自己的内核)通常您必须依赖 API OS 提供的任何内容。
如果其他东西修改了内存(例如磁盘控制器或网卡),它也不会工作。
是否可以在写入特定地址时使 x86 cpu 中断?
我想要一个硬件机制来监控一些地址的变化。
I would like to know if it is possible to make x86 cpu intrrupt when specific address is being written??
有可能。
你将其中一个调试寄存器(DR0
到DR4
)设置为你想要监控的地址,然后将DR7
中的相应标志配置为“全局断点, 中断数据只写,1 字节大小”。完成后,CPU 完成的任何正常数据写入都将触发调试异常(中断 1),调试异常处理程序可以弄清楚发生了什么并执行您想要的任何操作(例如,向用户报告写入?)。
但是,有一些限制——你不能自己在 user-space 中做这件事,需要依赖内核的支持;并且内核的支持希望在任务切换期间包括 saving/restoring 调试寄存器(这样当您的任务在另一个 CPU 上 运行 时您的断点不会停止工作,并且您的断点不会' 导致其他任务出现问题)。因此(除非您完全控制 computer/CPU - 例如,您正在编写自己的内核)通常您必须依赖 API OS 提供的任何内容。
如果其他东西修改了内存(例如磁盘控制器或网卡),它也不会工作。