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 程序集?的主要内容,如果未能解决你的问题,请参考以下文章