[译] ARMv8-A架构基础之改变异常级别

之前版本的ARM架构定义了基于处理器模式的异常模型。 对于每种异常类型,体系结构都定义了异常所采用的模式。 这种模式被称为异常的目标模式(target mode)。 然而可配置的陷入,使能和路由控制常常可以更改异常的目标模式。 ARMv8-A 的AArch32遵循此模型。

当处理器发生异常时:

  • 将当前程序状态保存在目标模式的SPSR中。
  • 保存异常的返回地址:
    • 如果目标模式不是Hyp模式,则在目标模式的链接寄存器(LR)中。
    • 如果目标模式是Hyp模式,则在ELR_hyp中。
  • 进入目标模式。 除非异常目标模式是Monitor模式,否则不会更改安全状态。

ARMv7-A体系结构使用从PL0到PL2的特权级别。 在ARMv8-A中,异常级别已经取代了权限级别,但本节将介绍如何对PL1继续进行特殊使用。 下表显示了包含虚拟化扩展和安全扩展的ARMv7-A处理器的全套处理器模式。 它还显示了ARMv7-A分配给每个模式的特权级别,这些模式定义了其执行权限。 执行权限是在每个安全状态中独立定义的。

模式 功能 安全状态 ARMv7-A特权级别
User (USR) 非特权模式(大多数应用程序都运行在该模式) Both PL0
FIQ FIQ中断异常时进入 Both PL1
IRQ IRQ中断异常时进入 Both PL1
Supervisor (SVC) 重置时进入或执行监督调用指令(SVC)时进入 Both PL1
Monitor (MON) 当执行SMC指令(安全监视器调用)时或处理器进入Monitor 模式异常用于支持安全状态和非安全状态之间的切换。 Secure only PL1
Abort (ABT) 内存访问异常时进入 Both PL1
Undef (UND) 在执行未定义的指令时进入 Both PL1
System (SYS) 特权模式,与用户模式共享寄存器视图 Both PL1
Hyp (HYP) 由Hypervisor调用和Hyp陷入异常时进入 Non-secure only PL2

在ARMv7-A体系结构中,处理器模式可以在特权软件控制下更改,或者在发生异常时自动更改。 当发生异常时,内核保存当前执行状态和返回地址,进入处理异常所需的模式,并可能禁用硬件中断。 在以前没有特权的用户模式,应用程序以最低级别的特权PL0运行。

操作系统在PL1上运行。 在具有虚拟化扩展的系统中,Hypervisor在PL2上运行。 安全监视器作为在安全世界和普通世界之间切换的网关,也在PL1上运行。

ARMv8-A不更改此异常模型,但添加了以下规则以涵盖ARMv7-A中不可能出现的情况:

  • 如果EL2正在使用AArch64,则任何以Hyp模式为目标的异常进入EL2也将使用AArch64。
  • 如果EL3正在使用AArch64,则任何以Monitor模式为目标的异常进入EL3也将使用AArch64。

在AArch64中,处理器模式被映射到的异常级别如下图所示。


aarch32-processor_modes .png

当发生异常时,处理器把异常级别切换到能处理该异常类型的异常级别(相当于ARMv7-A中的处理器模式)。 在AArch32中安全监视器(Secure monitor)在PL1上运行,而在AArch64中安全监视器在EL3上运行。

处理器模式映射到异常级别

安全状态下的异常级别取决于EL3是否使用AArch64。 这会影响处理器模式如何映射到异常级别。

下图显示了当EL3使用AArch64时,AArch32处理器模式如何映射到异常级别:


map_processor_modes_to_aarch64.png

ARMv7-A中使用的monitor模式在ARMv8-A中不存在。这是因为正在使用AArch64的EL3提供了Secure monitor功能。

当EL3使用AArch32时,AArch32处理器模式映射到异常级别如下:

map_processor_modes_to_aarch32.png

比较这两个图,在普通世界中映射没有变化,但是在安全世界中,Supervisor 模式,Abort 模式,IRQ模式,FIQ模式,Undefined 模式和System 模式从EL1升级到EL3。 这是因为:

  • EL3提供Secure Monitor功能。
  • ARMv6安全扩展将Monitor 模式定义为与下面这些模式为同一层级的安全状态模式:Supervisor 模式,Abort 模式,IRQ模式,FIQ模式,Undefined 模式和System 模式。 因此,这些模式和Secure Monitor功能一起表示为EL3。

这个重映射对处理器的操作没有影响。 在AArch32状态内的操作完全根据处理器模式之间的交互来定义,而不涉及任何关联的权限级别或异常级别。

ARMv8-A中的权限级别

当EL3使用AArch32时,这些模式集(Supervisor,Abort,IRQ,FIQ,Undefined,System)是处于安全状态的EL3模式,在所有其他情况下都是EL1模式。

为了避免这种复杂的描述,这些模式可以被描述为PL1模式,反映它们在ARMv7-A中的特权级别。 与此相关的是:

  • 在这两种安全状态下,这些模式下影响执行的控制可以被描述为PL1控制。
  • 在这些模式或用户模式下执行时,使用的转换系统称为PL1&0转换机制。

原文

https://developer.arm.com/products/architecture/a-profile/docs/100878/latest/changing-exception-levels

推荐阅读更多精彩内容