x86 - 是否可以设置在 cpu 写入特定地址时中断的中断?

标签 x86 x86-64 interrupt watchpoint

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

我想要一个硬件机制来监控一些地址的变化。

最佳答案

I would like to know if it is possible to make x86 cpu intrrupt when specific address is being written??

这是可能的。

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

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

如果其他东西修改了内存(例如磁盘 Controller 或网卡),它也不会工作。

关于x86 - 是否可以设置在 cpu 写入特定地址时中断的中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67127030/

相关文章:

制造商的 C 代码中断设置

assembly - 需要帮助理解 FF 间接调用指令 x86

assembly - 使用 SSE(IA32 程序集)执行简单的算术运算

c - 有256位整数类型吗?

web-services - Ubuntu 16.04服务器amd64安装失败

c++ - 为什么 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?

java - 线程和中断

interrupt - 如何知道接收到信号时正在执行哪一行代码

gcc 内联 asm bug - 忽略参数

c++ - 为什么 __fastcall assebmler 代码大于 MS C++ 中的 __stdcall 代码?