Assembly 确定ARMv7-A上当前处理器模式的简单方法

Assembly 确定ARMv7-A上当前处理器模式的简单方法,assembly,arm,armv7,Assembly,Arm,Armv7,在ARMv7-A处理器上,我正在寻找一种从任何模式确定处理器当前模式(用户、主管、IRQ等)的简单方法。这将允许我动态地决定是否执行某些操作,例如拨打主管电话或直接执行操作 乍一看,这似乎很简单。CPSR包含(M)模式位,用于确定处理器模式 ARMv7-A体系结构参考手册修订版C.b第1150页B1.3.3节(程序状态寄存器)规定: 此字段只能在PL1或更高级别写入。它的值可以在任何模式下读取,但ARM不赞成在PL0上执行的软件使用它的值,或试图更改它 所以,在用户模式下不推荐使用CPSR.M位

在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将为 CPSR.{E,A,I,F,M}字段

由于这些字段未知,因此似乎没有从用户模式读取模式位的方法。是否有其他方法从用户模式读取CPSR,或其他方法确定正在执行的模式代码


我可能会检测未定义的指令异常,并尝试在用户模式下执行非法指令,但我希望有更好的方法。

是否存在这种情况,即“我是什么模式的代码”可以在任何地方运行?基本上,你需要知道你在哪种模式,为什么你需要知道你在哪种模式?我的用例是针对那些可以从操作系统内核或用户空间调用的函数。如果从用户空间调用,他们需要进行服务调用。如果从内核调用,他们可以跳过服务调用并直接执行生成的操作。从技术上讲,我可以通过在内核和用户空间之间拆分所有函数或使服务调用工作来解决此问题,即使是在内核中发起的。哪个操作系统?它是否有定义的内核/用户空间内存映射,以便您可以检查调用方(或您自己的)地址并从中计算出来?我感觉内核代码和用户代码调用同一个函数,并在运行时确定是进行SVCall还是直接调用可能会打开安全漏洞。