2015-08-03 54 views
2

我是ARMv8架构的新手。我在脑海中有以下基本问题:什么是当前执行模式/异常级别等?

  1. 如何知道当前执行模式AArch32或AArch64是什么?我应该阅读CPSR还是SPSR来确定?

  2. 什么是当前异常级别EL0/1/2/3?

  3. 一旦发生异常,我可以读取任何寄存器以确定我是否处于Serror/Synchronous/IRQ/FIQ异常处理程序。

TIA。

+2

“我怎么知道当前的执行模式AArch32或AArch64?” - 我想如果代码试图检查模式是编译为64位,模式是64位;如果它编译为32位,则该模式为32位。 – JimmyB

回答

3
  1. 对于32位和64位,汇编指令及其二进制编码完全不同。因此,您目前所处的模式是编译器在编译过程中需要了解的信息。在运行时检查它们是没有意义的。为C,C++检查可以在编译时(#ifdef)通过像由armclang提供的那些编译器提供的宏完成:__aarch64__为64位,__arm__为32位
  2. 依赖于执行模式:
    • aarch32: MRS <Rn>, CPSR将当前状态读入寄存器编号n。然后提取包含当前模式的位3:0。
    • aarch64:MRS <Xn>, CurrentEL读取当前EL到寄存器个数n
  3. 答案很简单:你不能。长答案:假设是通过代码的结构和任何用户定义的变量的状态,你已经知道你在做什么。即您是否通过常规代码或异常来到代码中。
+0

对于第二点,通过读取CPSR寄存器,我可以在EL1,EL2或EL3模式下找到当前模式。但是,如果我在EL0模式下读取cpsr会导致异常。 – chetan

+0

@chetan:“如果我在EL0模式下读取cpsr会导致异常。” AFAIK,这当然是整个重点! EL0是非特权的“应用程序”模式;应用程序不能/不能有权访问这样的信息。因此,我的理解是,编写一个内核模块来读取寄存器值。它应该在EL1中运行,如果不是EL2。 – kaiwan