根据ARM手册,应该可以访问特定CPU模式的分组寄存器,例如"r13_svc".当我尝试这样做时,gcc对我大吼大叫,出现以下错误:
立即表达需要#前缀 - "mov r2,sp_svc"
怎么了?
更新.ARMv5和ARMv6的ARM体系结构参考手册中的以下文本让我相信它是可能的,第A2.4.2节:
寄存器R13和R14各有6个存储物理寄存器.一个用于用户和系统模式,其余五个中的每一个用于五种异常模式之一.如果需要具体说明所引用的版本,则使用以下形式的名称:R13_mode R14_mode其中mode是usr,svc(对于Supervisor模式),abt,und,irq和fiq中的适当的一个.
正确的语法是mrs r2,sp_svc或mrs r3, sp_usr.这是一个新的armv7扩展.该代码可以在ARM Linux KVM源文件interrupt_head.S中看到.由Matthew Gretton-Dann提供的指令支持的气体 binutils补丁.它需要虚拟化扩展,据我所知.
根据我的理解,LPAE(大型物理地址扩展)意味着虚拟化扩展.因此,Cortex-A7,Cortex-A12,Cortex-A15和Cortex-A17可能能够使用此扩展.但是,Cortex-A5,Cortex-A8和Cortex-A9不能.
有关该指令的文档可以在ARMv7a TRM revC的B9.3.9 MRS(Banked register)部分找到.
对于其他Cortex-A(和ARMv6)CPU,您可以使用该cps指令切换模式并将存储寄存器传输到非存储寄存器(R0-R7),然后切换回来.显而易见的困难在于用户模式.处理这个问题的正确方法是ldm rN, {sp,lr}^:用户模式没有简单的方法回到特权模式.
对于所有旧CPU,Dwelch提供的信息都可以使用.主要mrs/msr用于改变模式.
这是上下文切换的重要指令(VM做了很多工作).
我认为按照指令这是不可能的mov;至少根据我正在阅读的 ARM 架构参考手册。你有什么文件?有一种变体ldm可以从特权模式加载用户模式寄存器(使用^)。您唯一的其他选择是切换到 SVC 模式,执行mov r2, sp,然后切换回您正在使用的任何其他模式。
您收到的错误是因为它不理解sp_svc,所以它认为您正在尝试执行立即操作mov,如下所示:
mov r2, #0x14
Run Code Online (Sandbox Code Playgroud)
这就是为什么它说“需要 # 前缀”。
| 归档时间: |
|
| 查看次数: |
7962 次 |
| 最近记录: |