MSR CPSR_C,#0x13 不能使用 ARM 程序集?

Posted

技术标签:

【中文标题】MSR CPSR_C,#0x13 不能使用 ARM 程序集?【英文标题】:MSR CPSR_C, #0x13 doesn't work using ARM assembly? 【发布时间】:2013-12-18 08:27:50 【问题描述】:

我正在为 ARM Cortex A9 处理器编写裸机代码(无操作系统)。

我需要读取一个只能在主管模式下访问的寄存器(多处理器关联寄存器,MPIDR)。

当我处于用户模式并尝试使用调试器逐步执行以下指令(进入超级用户模式)时,没有任何反应。

MSR CPSR_C, #0x13

如果我尝试读取 MPIDR 寄存器,我的程序会进入未定义模式

请问你知道我错过了什么吗?

当我使用调试器窗口时,将 CPSR 寄存器的前五位强制为 b10011,它可以工作,我转到主管。

【问题讨论】:

您确定写信给CPSR_C 不是特权操作吗?保护东西没有多大意义,如果打破保护那么容易...... 我不确定,当我强制使用调试器并进入 irq 模式,然后执行相同的指令时,它可以工作。 但是如果是特权操作,我怎么能从用户模式进入超级用户模式,这不可能吗? @rony 您确实执行了“svc #0”并从用户模式执行并将执行更改为主管模式。 在此基础上进行扩展,使用来自用户的 svc/swi 指令是通往主管处理程序的直接路径,在该处理程序中,您可以做任何您想做的事情。与应用程序层和内核层不同,您必须或应该在内核中做一些事情,其他事情可以在您选择的任何地方完成。当然,您将需要编写一个 svc/swi 处理程序,并且有一种方法可以与处理程序通信您希望它做什么(因为它是一个处理程序并且您可能希望它做多件事情)立即是诱人的但是最好只使用寄存器,例如 r0。 【参考方案1】:

您不能使用直接写入 CPSR 的指令在模式之间切换 用户模式中的模式位。正确的方法是使用svc(主管调用)并执行请求的必要指令。

【讨论】:

【参考方案2】:

使用cps指令,例如

# Disable ABT, IRQ, FIQ and set SVC mode
cpsid aif, #0x13

【讨论】:

请提供一些解释,为什么您认为您提出的解决方案可能对 OP 有所帮助。

以上是关于MSR CPSR_C,#0x13 不能使用 ARM 程序集?的主要内容,如果未能解决你的问题,请参考以下文章

令状态寄存器访问指令(MRS,MSR)

x86 MSR 名称的 IA32 与 MSR 前缀

arm中的几个公式的比较

ARM 中的 VMNNM 指令

如何验证我的硬件预取器是不是已禁用

arm 汇编指令