Arm 手臂。从主管模式访问用户R13和R14

Arm 手臂。从主管模式访问用户R13和R14,arm,supervisor-mode,Arm,Supervisor Mode,如何访问进入主管模式时保存的用户R13和R14?我使用的是ARM7TDMI 也就是说,我不想访问现在包含用户模式返回地址的监管器R14,而是想访问用户模式链接寄存器的值。这是我正在编写的调试器的一部分 这些寄存器是否有特殊别名 谢谢我将为您的具体问题描述答案,但同样的方法也适用于其他模式 您需要通过将CPSR中的模式位更改为系统模式来更改处理器模式。这将允许您访问用户模式的SP/LR(R13和R14)。请记住,系统模式是特权模式,但其R13和R14与用户模式的R13和R14相同 进入系统模式后,

如何访问进入主管模式时保存的用户R13和R14?我使用的是ARM7TDMI

也就是说,我不想访问现在包含用户模式返回地址的监管器R14,而是想访问用户模式链接寄存器的值。这是我正在编写的调试器的一部分

这些寄存器是否有特殊别名


谢谢

我将为您的具体问题描述答案,但同样的方法也适用于其他模式

您需要通过将CPSR中的模式位更改为系统模式来更改处理器模式。这将允许您访问用户模式的SP/LR(R13和R14)。请记住,系统模式是特权模式,但其R13和R14与用户模式的R13和R14相同

进入系统模式后,阅读R13和R14,并将它们放在需要的地方。然后只需将模式位切换回您以前的模式(我相信在您的示例中这是主管模式),就可以开始了

请注意,我们没有从主管模式切换到用户模式。如果您从主管切换到用户,则无法返回主管模式。(否则将无法保护用户代码升级权限)。这就是为什么我们使用系统模式——系统模式是特权模式,但寄存器与用户模式相同

通过操纵CPSR中的模式位,您可以随意在任何特权模式之间切换。我认为它们是低5位?我正在路上&我手边没有这些信息。否则,我会为您提供我上面描述的汇编代码。事实上,如果你想把头发放在胸前,就拿我上面给你的东西,实施它,测试它,然后把它贴回这里-D

(我应该为“一般情况”(您的情况非常具体)添加一件事——您可以检查SPSR以查看“您来自何处”——并使用它来确定需要切换到哪种模式。)


顺便说一句,我最近刚为我的一位客户做了这件事。。。。我想世界很小。

我发现了一个更好的方法:-

在执行STM时,如果r15不是操作数之一,则^允许访问用户模式寄存器。然而,在指令中自动递增似乎不起作用,如果您想访问寄存器库,那么之后需要nop

差不多

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer

哇,谢谢。我从未注意到用户模式和系统模式共享相同的寄存器!我会破解密码的。恐怕我不能把它贴在这里,因为这是一个课程,但我认为你已经很好地描述了原理,这更重要。嗨,丹,如果ARM处于hyp模式,并且必须阅读PL1 NS=1模式(SVC)的R13/r14,那么它将如何实现?该^仅在ARMv6和更新版本IIRC中可用。这是一个伟大的发现!不过,根据《美国参考》的说法,这种用法“已被弃用”。我真的不确定是否需要关心它。@CarlNorum不,这可以一直使用到ARMv1。