Assembly RISC管道对设置断点的影响?

Assembly RISC管道对设置断点的影响?,assembly,pipeline,breakpoints,cpu-architecture,powerpc,Assembly,Pipeline,Breakpoints,Cpu Architecture,Powerpc,在说明中包括5个步骤。 我有一个关于管道是否会影响设置断点的问题 示例: 假设下面的二进制文件正在运行,$pc位于第1行 line1: lwz r11 8(r31) <= PC @ here line2: lwz r0, 0(r31) line3: cmpwi cr7, r10, 0 line4: lwz r9, 4(r31) line5: stw r11, 0xA0(r1) line1:lwz r11 8(r31)管道阶段不是体系结构阶段(例如,高性能PowerPC CPU可以

在说明中包括5个步骤。
我有一个关于管道是否会影响设置断点的问题

示例:
假设下面的二进制文件正在运行,
$pc
位于
第1行

line1: lwz r11 8(r31)     <= PC @ here
line2: lwz r0, 0(r31)
line3: cmpwi cr7, r10, 0
line4: lwz r9, 4(r31)
line5: stw r11, 0xA0(r1)

line1:lwz r11 8(r31)管道阶段不是体系结构阶段(例如,高性能PowerPC CPU可以有更长的管道,而无需更改任何可见的软件)。这不是单步执行的一部分,除非您使用软件模拟器查看指令通过模拟CPU

如果在设置另一个断点或单个步骤时在断点处停止,则正在调试的代码中的任何指令都不会在管道中运行。CPU将处于休眠状态或运行调试器的代码

此外,PowerPC没有一致的指令缓存,因此运行
stw
指令的自修改代码在其自身之后修改了一些指令,这不一定会导致新指令被提取,即使它是5条以上的指令。为了可靠地实现这一点,您需要一组指令,如
dcbf
msync
将d-cache刷新到更高的级别,然后
icbi
使I-cache的行无效,然后
msync
isync
确保在获取指令之前发生。例如,在第2.2节“指令缓存一致性”中记录了您应该做什么,至少对于PowerPC的特定实现是这样。(我认为飞思卡尔的PowerQUICC™ III是一台PowerPC;这个文档是google发现的。)

奇怪的是,GNUC
\uuuuuuuuuuuuuuuuuuuuuuu内置的清除缓存(开始,结束)
对GCC没有任何作用。可能是因为推荐的过程涉及到将页面标记为不可执行,如果没有系统调用,您无法从用户空间执行此操作


调试器本身在进程未运行时修改其内存更容易;操作系统已经必须确保加载到内存或使用
ptrace
修改的页面可以安全地执行代码。因此,它可以将大部分刷新留给操作系统


当内核在被调试的进程中返回到用户空间时,如果第一条或任何后续指令是调试陷阱/软件断点指令,它将陷阱。

管道阶段不是体系结构(例如,高性能PowerPC CPU可以有更长的管道,而不改变任何可见的软件)。这不是单步执行的一部分,除非您使用软件模拟器查看指令通过模拟CPU

如果在设置另一个断点或单个步骤时在断点处停止,则正在调试的代码中的任何指令都不会在管道中运行。CPU将处于休眠状态或运行调试器的代码

此外,PowerPC没有一致的指令缓存,因此运行
stw
指令的自修改代码在其自身之后修改了一些指令,这不一定会导致新指令被提取,即使它是5条以上的指令。为了可靠地实现这一点,您需要一组指令,如
dcbf
msync
将d-cache刷新到更高的级别,然后
icbi
使I-cache的行无效,然后
msync
isync
确保在获取指令之前发生。例如,在第2.2节“指令缓存一致性”中记录了您应该做什么,至少对于PowerPC的特定实现是这样。(我认为飞思卡尔的PowerQUICC™ III是一台PowerPC;这个文档是google发现的。)

奇怪的是,GNUC
\uuuuuuuuuuuuuuuuuuuuuuu内置的清除缓存(开始,结束)
对GCC没有任何作用。可能是因为推荐的过程涉及到将页面标记为不可执行,如果没有系统调用,您无法从用户空间执行此操作


调试器本身在进程未运行时修改其内存更容易;操作系统已经必须确保加载到内存或使用
ptrace
修改的页面可以安全地执行代码。因此,它可以将大部分刷新留给操作系统


当内核在被调试的进程中返回到用户空间时,如果第一条或任何后续指令是调试陷阱/软件断点指令,它将陷阱。

在真正的微处理器上,这取决于您是否

  • 。。。使用JTAG调试器
    (这意味着当中断点被激活时,某些外部硬件正在停止CPU 到达)

    在这种情况下,当CPU在断点处停止时,如果更改行“2”或“3”,会发生什么情况取决于CPU。可能有CPU在从断点继续后再次读取内存,而其他CPU不这样做

    我不知道PowerPC微控制器(如MPC57xx)的行为

    然而,我猜想,在大多数微控制器中,硬件(有意地)设计成在断点情况下管道不“正常”工作的方式:在到达断点后,从内存中重新读取“第1行”到“第3行”

  • 。。。或者如果您正在执行片上调试
    (这意味着调试软件与正在调试的软件在同一CPU上运行)

    在这种情况下,输入断点时会输入一些异常

    对于PowerPC,使用
    rfdi
    或(对于较旧的控制器)
    rfci
    指令返回异常

    这意味着调试器使用
    rfdi
    指令继续正在调试的程序

    rfdi
    rfi
    rfci
    是跳转/分支指令。跳转/分支后,CPU必须重新读取管道

    这意味着CPU肯定会再次从内存中读取“第1行”,因此您甚至可以修改
    line1: lwz r11 8(r31)     <= execution (because PC is at here)
    line2: lwz r0, 0(r31)     <= decode
    line3: cmpwi cr7, r10, 0  <= fetch
    line4: lwz r9, 4(r31)
    line5: stw r11, 0xA0(r1)