启动玩具内核时,我使用此代码切换到用户模式:
mrs r1, CPSR @ Switch to System mode
orr r1, r1, #0xc
msr CPSR, r1
ldr sp, =gUsrStackBase @ Setup USR stack (shared with System mode)
mov r1, #0x10 @ Get user-mode CPSR into SPSR
msr SPSR, r1
movs pc, r0 @ Switch to USR mode and branch
但遵循movs
指令,而不是我设置的用户模式CPSR值(0x10),CPSR中存在随机垃圾。为什么会这样?
答案 0 :(得分:1)
我非常非常长时间地对抗这个问题!最后我找到了问题的原因。在ARM体系结构参考手册(只有最新的ARMv7A -R版本!)[2]中,是这样的:
如果是,则在系统模式下执行的MSR(寄存器)是不可预测的 尝试更新SPSR。
(立即MSR
也是如此。
解决方案是在设置SPSR之前切换回supervisor(或其他特权)模式。
[1]非常
[2]你可以在这里获得ARMv7-ARM(你需要注册):http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html