发生非常:Taking an exception,产生非常能让非常品级增长或者保持稳固,但绝不大概通过产生非常进入到一个更低品级的非常。
从一个非常返回:Returning from an exception。从一个非常返回能让非常品级降低或者保持稳固,但绝不大概通过非常品级返回进入到一个更高品级的非常。
处理器发生reset:Processor reset
处于调试状态:During Debug state
离开调试状态:Exiting from Debug state
二,特权的范例
有两种与AArch64非常模型相干的特权范例:
内存体系的特权
来自访问处理器资源的视角的特权
这两个特权范例都受到当前非常品级的影响。
2.1 内存特权
ARM架构的A处理器系列实现了一个虚拟内存体系:内存管理单位,Memory Management Unit (MMU),MMU允许软件对不同的内存区域分配不同的内存属性。这些属性包罗读/写权限,可以设置为允许对特权访问和非特权访问的单独访问权限。
当处理器在EL0中执行时启动的内存访问将根据无特权的访问权限进行检查。来自EL1、EL2和EL3的内存访问将按照特权访问权限进行检查。
由于这种内存设置是由软件使用MMU的translation tables来控制的,以是我们应该思量编辑这些table时的特权品级。由于MMU的设置是存储在处理器体系寄存器里的,而控制访问这些寄存器的权限也来自于当前的非常品级。
在ARM架构中,处理器的寄存器主要分成两大类:
提供体系控制(system control)和状态表现(status reporting)的寄存器
用于指令处理的寄存器,比如结果累计以及非常处理。
2.2 访问寄存器的特权
AArch64处理器的设置被保存在一系列的体系寄存器当中,体系控制寄存器中的各种设置的组合决定了当前处理器的上下文(context)。并且,访问体系寄存器的权限也由当前处理器的非常品级决定。
ARM架构里有许多概念上有相似功能的寄存器,它们仅仅是非常品级后缀名不同,比如AArch 64中的VBAR(Vector Base Address Register)寄存器存在VBAR_EL1,VBAR_EL2以及VBAR_EL3,这些寄存器是相互独立的存在,在指令会合有不同的解码,以及在硬件中独立的实现。这些寄存器名字相同是由于他们的功能相似,但是它们是完全独立的寄存器,具有它们自己的访问语义。体系寄存器名称的后缀表现可以从中访问该寄存器的最低非常级别。
比如AArch64处理器中的体系控制寄存器,System Control Register (SCTLR),为每个非常品级都实现了一个SCTLR。每个寄存器控制着当前非常品级的一些架构级别的特性,比如MMU,cache以及对齐访问检查功能等:
RegisterNameDescriptionException Link RegisterELR_ELx非常链接寄存器,保存着导致非常发生的那条指令的所在Exception Syndrome RegisterESR_ELx非常综合寄存器,保存着非常发生的原因相干的信息Fault Address RegisterFAR_ELx错误所在寄存器,保存着非常发生时的非常错误所在Secure Configuration RegisterSCR_ELx安全设置寄存器, 控制着安全状态,以及进入EL3的非常Hypervisor Configuration RegisterHCR_ELx控制着虚拟化设置,以及进入EL2的相干非常System Control RegisterSCTLR_ELx体系控制寄存器,控制着标准内存,体系设置,以及为已实现的相干功能提供状态信息。Saved Program Status RegisterSPSR_ELx当非常发生,并切换到ELx时,保存着处理器的相干状态Vector Base Address RegisterVBAR_ELx当非常发生时,处于ELx,保存着ELx的非常向量表的基址 三,执行状态和安全状态
上文提到过,AArch64 架构支持4种非常品级,除了非常品级,它还支持两种执行状态(AArch32和AArch64),以及两种安全状态(secure和non-secure)。 以是对于Armv8-A 或者Armv9-A的处理器,它们的当前状态,取决于当前的执行状态以及非常品级。
3.1 执行状态 Execution states
在ARMv8.0 A中,EL2只支持Non-secure状态,这是由于Secure 状态下不支持虚拟化扩展。从ARMv8.4-A开始,增长了 S.EL2作为一个可选的属性,并附带一个使能 bit : SCR_EL3.EEL2,以提供向后的兼容性。在Armv9-A中,如果实现了EL2,那么必须要支持两种安全状态(secure和non-secure),并且也提供了一个disable bit。
Armv8-A系列的处理器可以为每个非常品级选择哪些执行状态有效,并且这也是详细的实现界说的。如果AArch32被运行执行在某个非常品级,那么也必须可以执行在比当前更低的非常品级。比如EL3可以跑AArch32,那么EL2,EL1以及EL0肯定都可以跑。
很多处理器的详细实现会把所有的安全状态以及所有的非常品级都打开,但是仍存在着一些限制,比如:
Cortex-A35 支持AArch32和AArch64在所有的非常品级
Cortex-A32 只支持 AArch32.
Neoverse-N2只支持AArch32跑在EL0,其他非常品级只能跑AArch64.
AArch32提供对老的32-bit 架构(比如ARMv7)的向后兼容性,但是从ARMv9开始,AArch32被限制在只能跑在EL0,并且还只是可选的实现,同时全方便支持AArch64(所有非常品级都支持)。这意味着ARMv9固然支持32-bit,但是也只限于一些应用程序,像操作体系内核、hypervisor,虚拟化程序以及firmware固件都接纳64-bit。
参考链接: Learn the architecture - AArch64 Exception
Model