在ARMv7-A处理器上,我正在寻找一种从任何模式确定处理器当前模式(用户,主管,IRQ等)的简单方法。这将允许我动态决定是否执行某些操作,例如进行主管呼叫或直接执行操作。
乍一看,这看起来很简单。CPSR
包含(M
)模式位,用于确定处理器模式。
ARMv7-A架构参考手册的修订版C.b的第1150页的B1.3.3节(程序状态寄存器)声明:
此字段只能在PL1或更高版本上写入。它的值可以在任何模式下读取,但ARM不推荐在PL0执行的软件使用它的值,或试图改变它。
因此,在用户模式下不推荐使用CPSR.M
位,但应该可以使用。
然而,继续使用MRS
实际阅读CPSR(这是我所知道的唯一方式)。 ARM的第1988页B9.3.8节(MRS)声明:
在用户模式下执行并访问CPSR的MRS返回的UNKNOWN值 CPSR。{E,A,I,F,M}字段。
由于这些字段未知,似乎没有办法从用户模式读取模式位。是否有其他方法可以从用户模式读取CPSR,或者某种替代方式来确定正在执行哪种模式代码?
我可能会检测未定义的指令异常,并在用户模式下尝试非法指令,但我希望有更好的方法。