代码之家  ›  专栏  ›  技术社区  ›  Demiurg

显式访问ARM上的存储寄存器

arm
  •  8
  • Demiurg  · 技术社区  · 16 年前

    根据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。

    3 回复  |  直到 9 年前
        1
  •  3
  •   Carl Norum    16 年前

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

    你犯的错误是因为它不明白 sp_svc ,所以它认为你正在尝试立即 压敏电阻 ,如下所示:

    mov r2, #0x14
    

    所以它说“需要前缀”。

        2
  •  6
  •   artless-noise-bye-due2AI    9 年前

    正确的语法是 mrs r2,sp_svc 或 mrs r3, sp_usr . 这是新的 ARMV7 延伸。代码可以在ARM Linux KVM源文件中看到。 interrupt_head.S . 这个 气体 这个的binutils补丁 instruction support 马修·格雷顿·丹恩。它需要 虚拟化扩展 据我所知。

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

    有关说明的文档可在 ARMV7A 第节下的TRM Revc B9.3.9 MRS(银行登记簿) .

    对于其他Cortex-A(和ARMV6)CPU,您可以使用 cps 切换模式并将银行注册转移到非银行注册(R0-R7)的指令,然后切换回。明显的困难在于 用户模式 . 正确的处理方法是 ldm rN, {sp,lr}^ ;用户模式没有返回特权模式的简单方法。

    对于所有较旧的CPU,dwelch提供的信息将起作用。主要使用 mrs/msr 改变模式。

    这是上下文切换的一个重要指令(vms做了很多)。

        3
  •  2
  •   old_timer    16 年前

    您可以使用MRS和MSR通过更改CPSR中的位来更改模式,然后正常使用R13。

    从手臂上

    MRS R0,CPSR
    BIC R0,R0,#0x1F
    ORR R0,R0,#0x13
    MSR CPSR_c,R0
    

    然后

    mov sp,#0x10000000
    

    或者如果你需要更多的即时信息

    ldr sp,=0x12345600
    

    或者,如果您不希望汇编程序放置您的数据,您可以自己放置它。

    ldr sp,svc_stack
    b 1f
    svc_stack: .word 0x12345600
    1:
    

    您将看到典型的ARM启动代码,其中应用程序将支持中断、中止和其他异常,设置您需要的所有堆栈指针,更改模式,设置sp,更改模式,设置sp,设置sp,更改模式…