显式访问ARM上的银行寄存器

显式访问ARM上的银行寄存器,arm,Arm,根据ARM手册,应该可以访问特定CPU模式的存储寄存器,例如“r13_svc”。当我尝试这样做时,gcc会对我大喊大叫,并出现以下错误: 立即表达式需要一个#前缀--'mov r2,sp#svc' 怎么了 更新。以下来自ARMv5和ARMv6的ARM体系结构参考手册的文本使我相信,在第A2.4.2节中,这是可能的: 寄存器R13和R14有六个存储组 物理寄存器。一个是使用 在用户和系统模式下,以及 其余五个用于其中一个 五种异常模式。在哪里 有必要具体说明 正在引用的版本,请使用 表格名称:R1

根据ARM手册,应该可以访问特定CPU模式的存储寄存器,例如“r13_svc”。当我尝试这样做时,gcc会对我大喊大叫,并出现以下错误:

立即表达式需要一个#前缀--'mov r2,sp#svc'

怎么了

更新。以下来自ARMv5和ARMv6的ARM体系结构参考手册的文本使我相信,在第A2.4.2节中,这是可能的:

寄存器R13和R14有六个存储组 物理寄存器。一个是使用 在用户和系统模式下,以及 其余五个用于其中一个 五种异常模式。在哪里 有必要具体说明 正在引用的版本,请使用 表格名称:R13_模式 R14_模式,其中模式为 usr、svc中的适当一个(用于 主管模式)、abt、und、irq和 fiq


我认为这在
mov
指令中是不可能的;至少根据我正在阅读的ARM架构参考手册。你有什么文件?有一种
ldm
变体可以从特权模式加载用户模式寄存器(使用
^
)。您唯一的其他选择是切换到SVC模式,执行mov r2、sp,然后切换回您使用的任何其他模式

您遇到的错误是因为它不理解sp_svc,因此它认为您正在尝试立即执行
mov
,如下所示:

mov r2, #0x14

这就是为什么它说“需要一个#前缀”

您使用mrs和msr通过改变cpsr中的位来改变模式,然后正常使用r13

从手臂

MRS R0,CPSR BIC R0,R0,#0x1F ORR R0,R0,#0x13 MSR CPSR_c,R0 R0女士,CPSR BIC R0,R0,#0x1F ORR R0,R0,#0x13 MSR CPSR_c,R0 然后

mov sp,#0x10000000 或者,如果您需要更多的位在立即

ldr sp,=0x12345600 ldr sp,=0x12345600 或者,如果您不希望汇编程序放置数据,您可以自己放置

ldr sp,svc_stack b 1f svc_stack: .word 0x12345600 1: ldr sp、svc\U堆栈 b 1f svc_堆栈:。字0x12345600 1:
您将看到典型的arm启动代码,其中应用程序将支持中断、中止和其他异常,以设置您需要的所有堆栈指针,更改模式、设置sp、更改模式、设置sp、更改模式…

正确的语法是
mrs r2,sp_svc
mrs r3,sp_usr
。这是一个新的armv7扩展。代码可以在ARM Linux KVM源文件中看到。Matthew Gretton Dann的gas比努蒂尔斯补丁。据我所知,它需要虚拟化扩展

据我所知,LPAE(大型物理地址扩展)意味着虚拟化扩展。所以Cortex-A7、Cortex-A12、Cortex-A15和Cortex-A17可以使用这个扩展。然而,Cortex-A5、Cortex-A8和Cortex-A9不能

有关该指令的文档可在第B9.3.9节MRS(银行寄存器)下的ARMv7aTRM revC中找到

对于其他Cortex-A(和ARMv6)CPU,您可以使用
cps
指令切换模式,将存储寄存器转移到非存储寄存器(R0-R7),然后切换回。明显的困难在于用户模式。正确的处理方法是使用
ldmrn,{sp,lr}^
;用户模式无法简单地返回到特权模式

对于所有较旧的CPU,提供的信息将起作用。主要使用
mrs/msr
更改模式
mrs/msr
在整个ARM CPU类上工作,但需要多条指令,因此可能存在争用问题,需要中断和异常屏蔽,具体取决于上下文


这是上下文切换的一条重要指令(序列)(VM经常执行此操作)。

如果您查看mov的指令编码,目标寄存器有四位,刚好够0xD(r13或sp)使用。有6个不同的sp寄存器。如果可以指定模式,指令中还需要3位。我看不到这些位,因此无法在指令中指定模式。您必须使用cpsr修改指令(msr)更改cpsr。注意,不同的汇编程序(arm、gcc等)对msr/mrs和mrc/mcr指令使用不同的语法。所以arm语法可能是针对arm而不是gcc的。谢谢。您发布的代码可能会起作用。让我相信可以直接访问这些寄存器的是以下文本:寄存器R13和R14各有六个存储物理寄存器。。。如果需要具体说明所引用的版本,请使用以下格式的名称:R13_uuR14_uu其中是usr、svc(主管模式)、abt、und、irq和fiq中的适当名称。从ARM架构参考手册中,嗯,在ARM中这是一个非常混乱的部分,我不明白他们在暗示什么。也许他们的汇编程序为您添加了指令,除了可能Keil evals我再也不能使用arm工具了。这一部分暗示了与注册库相关的armv6的一些特殊之处,并继续展示了我在上面所展示的内容,从“armv6之前的架构版本”开始。如果r13_svc、r13_sys等在任何指令上都可用,那么每个指令的编码都需要空间,并且在编码中需要一个关于armv6是否已用完的注释……我也很困惑,老式的方法将(始终?)通过使用msr切换模式来工作,然后直接使用r13和r14。除非您有性能方面的原因(例如rev、sxtab),否则我发现使用移植到所有架构版本的代码(在编写汇编程序时)更容易。嗯,我假设armv4t和更高版本,我想因为bx lr比mov pc更便携,我所做的就是lr。我理解这一点。请参阅上面关于ARM架构参考中文本的更新Manual@Demiurg,该段不是指编写代码 ldr sp,svc_stack b 1f svc_stack: .word 0x12345600 1: