在 PowerPC 上实现断点 Read/Write
Implementing Breakpoint Read/Write on PowerPC
breakpoint read/write
implemented? Note that this is different from breakpoint execute
.
怎么样
这个想法是从数据内存地址开始,然后找到 read/write from/to 该地址的汇编指令。理论上,我们必须检查寄存器和下一条正在执行的指令(考虑位移偏移量)才能确定这是否属实。假设当前指令是 "store word": stw r0, 4 (r31)
所以它写入地址 r31 + 4
。我们可以通过读取 r31
中的值,添加 4
并检查它是否等于初始数据地址来确定是否中断。
但是,这似乎是不可行的,因为我相信使用 C 编程您无法监视汇编中的每条指令执行。一般或特定于 PowerPC 是如何做到这一点的?是否有任何特殊的汇编指令或调试寄存器可以简化这个?
分页是否开启?如果是,您可以将带有变量的页面标记为不可写,捕获由此产生的保护错误,检查它是否是对变量的写入,如果是则停止执行。不过,当页面包含其他常用变量时,这可能会有点慢。
在 PowerPC 中,与所有其他具有此类功能的 CPU 一样,这是通过硬件支持完成的。有一个特殊的寄存器 "Data Address Breakpoint" (DABR),您可以在其中设置应检查的内存地址以及是否应读取 and/or 写入访问等
当某些指令对给定地址执行读取或写入时,CPU 将触发中断(数据存储中断)。从 ISR 中,您只需检查 return 地址,看看您是如何到达那里的,然后您就可以得到导致中断的指令的程序地址。
详情请查看PowerISA手册。 (他们的网站 http://www.power.org/ 似乎已关闭 atm)
breakpoint read/write
implemented? Note that this is different from breakpoint execute
.
这个想法是从数据内存地址开始,然后找到 read/write from/to 该地址的汇编指令。理论上,我们必须检查寄存器和下一条正在执行的指令(考虑位移偏移量)才能确定这是否属实。假设当前指令是 "store word": stw r0, 4 (r31)
所以它写入地址 r31 + 4
。我们可以通过读取 r31
中的值,添加 4
并检查它是否等于初始数据地址来确定是否中断。
但是,这似乎是不可行的,因为我相信使用 C 编程您无法监视汇编中的每条指令执行。一般或特定于 PowerPC 是如何做到这一点的?是否有任何特殊的汇编指令或调试寄存器可以简化这个?
分页是否开启?如果是,您可以将带有变量的页面标记为不可写,捕获由此产生的保护错误,检查它是否是对变量的写入,如果是则停止执行。不过,当页面包含其他常用变量时,这可能会有点慢。
在 PowerPC 中,与所有其他具有此类功能的 CPU 一样,这是通过硬件支持完成的。有一个特殊的寄存器 "Data Address Breakpoint" (DABR),您可以在其中设置应检查的内存地址以及是否应读取 and/or 写入访问等
当某些指令对给定地址执行读取或写入时,CPU 将触发中断(数据存储中断)。从 ISR 中,您只需检查 return 地址,看看您是如何到达那里的,然后您就可以得到导致中断的指令的程序地址。
详情请查看PowerISA手册。 (他们的网站 http://www.power.org/ 似乎已关闭 atm)