【问题标题】:Why am I getting garbage in my CPSR when I switch to user-mode?为什么当我切换到用户模式时,我的 CPSR 中会出现垃圾?
【发布时间】:2014-12-30 03:34:24
【问题描述】:

在启动玩具内核时,我使用此代码切换到用户模式:

  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 中出现了随机垃圾,而不是我设置的用户模式 ​​CPSR 值 (0x10)。为什么会这样?

【问题讨论】:

    标签: assembly embedded arm kernel


    【解决方案1】:

    我在这个问题上猛烈抨击了非常非常 [1] 很长一段时间!最后我找到了问题的原因。在 ARM 架构参考手册中(只有最新的 ARMv7A -R 版本!)[2],是这样的:

    在系统模式下执行的 MSR(寄存器)是 UNPREDICTABLE 如果它 尝试更新 SPSR。

    (对于带有立即数的MSR 也是如此)。

    解决方案是在设置 SPSR 之前切换回主管(或其他特权)模式。

    [1] 非常

    [2] 您可以在此处获取 ARMv7-ARM(您需要注册):http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html

    【讨论】:

    • FWIW,较旧的 ARM ARM 也有此信息,只是在不同的位置。在 v6 和 v5 中,“程序员模型”一章,第 2.5 节“程序状态寄存器”有这样的注释:“用户模式和系统模式没有 SPSR,因为它们不是异常模式。所有读或写的指令SPSR 在用户模式或系统模式下执行时是不可预测的。” v4 在等效部分的末尾有类似的声明。猜猜它在 v7 的早期版本中丢失了。
    • 您还应该指定完整的feilds。就像msr CPSF_fsxc,r1 一样,至少一些汇编程序将默认为单个字段(控件);最好是明确的。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2013-01-07
    • 1970-01-01
    • 2021-11-02
    • 2013-12-18
    • 2012-11-21
    相关资源
    最近更新 更多