3. Changing Exception Levels
ARMv8-A相关历史文章:
ARM架构的早期版本定义了一个基于处理器模式的异常模型,针对每一个异常类型,体系结构都定义了接收异常的模式,称为异常的目标模式。针对一个异常,configurable traps,enables,routing controls能改变处理器的目标模式。ARMv8-A的AArch32遵循这个模型。
当处理器接收异常时:
- 保存当前程序的状态到目标模式的SPSR寄存器中;
- 保存异常的返回地址(如果不在Hyp模式,将地址保存到目标模式的LR寄存器中;如果在Hyp模式,将地址保存到ELR_hyp寄存器中);
- 跳转到目标模式执行,除非是在Monitor模式下,否则不会改变Security状态;
在ARMv7-A体系架构使用PL0-PL2三个特权级,在ARMv8-A中,Exception Levels取代了特权级,但是PL1还能继续发挥特殊作用。
下图将描述ARMv7-A处理器的全部模式,包括虚拟化扩展和安全扩展。ARMv7-A为每个模式分配了执行特权,其中执行特权的定义独立于安全状态。
在ARMv7-A体系架构中,处理器模式可以在特权软件的控制下进行切换,或者在异常发生的时候自动切换。当异常发生时,处理器会保存当前的执行状态和返回地址,然后进入处理异常的目标模式,可能会禁止硬件中断。
- 应用程序运行在PL0最低特权级下,也就是非特权级的用户模式;
- 操作系统运行在PL1;
- 虚拟化扩展和Hypervisor运行在PL2级别;
- Secure monitor运行在PL1,在Secure world和Normal world之间提供通道;
在ARMv8-A中,没有改变这种异常模型,但是增加了几条规则,来覆盖在ARMv7-A中不支持的case,规则如下:
- 如果EL2使用的是AArch64,那么任何针对Hyp模式的异常都将在EL2处理,并使用AArch64;
- 如果EL3使用的是AArch64,那么任何针对Monitor模式的异常都将在EL3处理,并使用AArch64;
在AArch64中,处理器模式和Exception levels的映射关系如下图所示:
当异常发生时,处理器将改变Exception Level(相当于ARMv7-A中的处理器模式)来处理异常类型。Secure monitor在AArch32中时处在PL1状态,在AArch64中处在EL3状态。
3.1 Mapping the processor modess onto the Exception levels
安全状态下的Exception level取决于EL3是否使用了AArch64,这个会影响处理器模式如何映射到Exception levels。
-
当EL3使用AArch64时,映射关系如下:
ARMv7-A中的Monitor模式,在ARMv8-A中不可用,原因是EL3提供了Secure Monitor的功能,而EL3使用的是AArch64。
-
当EL3使用的是AArch32时,映射关系如下:
比较两张图可以看出,在Normal world中的映射关系是一样的;在Secure world中,Supervisor mode、Abort mode、IRQ mode、FIQ mode、Undefined mode还有System mode从EL1提升到了EL3,这是因为:
- EL3提供了Secure Monitor功能;
- ARMv6 Security扩展将Monitor mode定义为安全状态模式,与Supervisor mode、Abort mode、IRQ mode、FIQ mode、Undefined mode和System mode同一级别。Secure Monitor在EL3中,这些模式也就与Secure Monitor就一起处在EL3的状态了。
这种重新映射对处理器的操作没有任何影响,AArch32状态内的操作完全按照处理器模式之间的交互来定义的,没有涉及到关联的特权级别或Exception levels。
3.2 Privilege levels in ARMv8-A
在Secure状态中,处理器模式(Supervisor、Abort、IRQ、FIQ、Undefined、Syste)在EL3使用AArch32时,是EL3模式;在其他情况下则是EL1模式。
为了避免这些复杂的描述,这些模式可以被描述为PL1模式,反映它们在ARMv7-A中的特权级别,与此相关的:
- 在这些模式下影响执行的控制,都称为PL1控制;
- 用于在这些模式或User mode中执行的转换系统,称为PL1&0 转换体制;