breakpoint read/write
如何实现?请注意,这与 breakpoint execute
不同。
想法是从一个数据存储地址开始,然后找到从该地址读取/写入该地址的汇编指令。从理论上讲,我们将必须检查寄存器和正在执行的下一条指令(考虑位移偏移),以查明这是否正确。假设当前指令是一个“存储字”:stw r0, 4 (r31)
,所以它写入地址r31 + 4
。我们可以通过读取r31
中的值,添加4
并检查其是否等于初始数据地址来找出是否中断。
但是,这似乎是不可行的,因为我相信使用C编程无法监视汇编中的每个指令执行。一般如何进行此操作或特定于PowerPC?是否有任何特殊的汇编指令或调试寄存器可以简化此操作?
最佳答案
在PowerPC中,就像所有其他具有此功能的CPU一样,这是通过硬件支持来完成的。有一个特殊的寄存器“数据地址断点”(DABR),您可以在其中设置应检查的存储器地址以及是否应该对其进行读取和/或写入访问等。
然后,当某些指令执行对该给定地址的读取或写入操作时,CPU将触发一个中断(数据存储中断)。从ISR,您只需要检查返回地址以了解您如何结束,然后获得导致中断的指令的程序地址。
有关详细信息,请参阅PowerISA手册。 (他们的网站http://www.power.org/似乎位于atm下方)