【问题标题】:Implementing Breakpoint Read/Write on PowerPC在 PowerPC 上实现断点读/写
【发布时间】:2017-03-29 11:24:55
【问题描述】:

breakpoint read/write 是如何实现的?请注意,这与breakpoint execute 不同。

这个想法是从一个数据存储器地址开始,然后找到从该地址读/写的汇编指令。理论上,我们必须检查寄存器和正在执行的下一条指令(考虑位移偏移)才能确定这是否正确。假设当前指令是“存储字”:stw r0, 4 (r31),所以它写入地址r31 + 4。我们可以通过读取r31中的值,添加4并检查这是否等于初始数据地址来确定这是否中断。

但是,这似乎是不可行的,因为我相信使用 C 编程您无法监控汇编中的每条指令执行。这是如何在一般情况下或特定于PowerPC 完成的?是否有任何特殊的汇编指令或调试寄存器可以简化这一点?

【问题讨论】:

  • 确实是“调试寄存器”。所有现代非平凡处理器都内置了断点等硬件。借助多核、流水线和其他功能/优化,硬件协助调试至关重要。

标签: c assembly powerpc


【解决方案1】:

在 PowerPC 中,与所有其他具有此类功能的 CPU 一样,这是通过硬件支持完成的。有一个特殊的寄存器“数据地址断点”(DABR),您可以在其中设置应该检查哪个内存地址以及是否应该读取和/或写入访问等。

然后,当某些指令对给定地址执行读取或写入操作时,CPU 将触发中断(数据存储中断)。从 ISR 中,您只需要检查返回地址,看看您是如何到达那里的,然后您就可以得到导致中断的指令的程序地址。

有关详细信息,请查看 PowerISA 手册。 (他们的网站http://www.power.org/ 似乎已关闭)

【讨论】:

  • 由于站点仍然关闭,还有其他链接可以获取大量文档吗?
  • @BullyWiiPlaza 显然他们现在托管在这里:openpowerfoundation.org。他们喜欢每年左右彻底更改名称,这样他们就不会冒自己的商标太受欢迎或太成功的风险。
【解决方案2】:

是否打开分页?如果是,您可以将带有变量的页面标记为不可写,捕获由此产生的保护错误,检查它是否是对变量的写入,如果是则停止执行。但是,当页面包含其他常用变量时,这可能会有点慢。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多