Skip to main content

AArch64异常模型

出于安全考虑,现代处理器架构往往存在权限的概念。比如说我们不希望用户能够直接修改内核代码以免造成内核崩溃,又需要给予用户一定的配置内核功能的能力。此时我们需要权限,赋予用户特权,以实现功能隔离。

1. 权限、异常级别

1.1 异常级别

AArch64 中权限的名称为异常级别,通常缩写为 EL。

异常级别为编号,通常缩写为 EL<x>,其中 <x> 为介于 0 到 3 之间的数字。权限级别越高,数字越高。例如,最低级别的权限称为EL0。

通常来说,EL对应的级别随着系统抽象层级的提升而降低。

异常级别只能在特定的事件发生时改变。

  1. 发生异常(Taking an exception)
  2. 从异常返回(Returning from an exception)
  3. 处理器复位(Processor reset)
  4. 在调试状态期间(During Debug state)
  5. 退出调试状态(Exiting from Debug state)

1.2 特权类型

AArch64 Exception 模型有两种类型的权限:

  1. 内存系统中的权限
  2. 从访问处理器资源的角度来看是特权

两种类型的权限都受当前特权异常级别的影响。

如下图是AArch64特权类型图:

异常类型处理的寄存器:

处理异常的关键寄存器说明:

寄存器实际可用级别说明
ELR_ELxEL1, EL2, EL3异常链接寄存器,每个级别独立
ESR_ELxEL1, EL2, EL3异常综合征寄存器,每个级别独立
FAR_ELxEL1, EL2, EL3故障地址寄存器,每个级别独立
HCR_ELxEL2仅EL2可用,控制虚拟化
SCR_ELxEL3仅EL3可用,控制安全状态
SCTLR_ELxEL1, EL2, EL3系统控制寄存器,每个级别独立
SPSR_ELxEL1, EL2, EL3保存程序状态寄存器,每个级别独立
VBAR_ELxEL1, EL2, EL3向量基地址寄存器,每个级别独立

2. 执行与安全状态

Armv8-A 或 Armv9-A 处理器的当前状态由异常级别和当前执行状态决定。

当前执行状态定义了通用寄存器的标准宽度和可用的指令集。

Armv8-A 和 Armv9-A 支持两个执行语句(说明图可见于指令集那一章节):

  1. AArch32 是一个 32 位执行状态。在此状态下的操作与先前的架构具有向后兼容。它支持 T32 和 A32 指令集。标准寄存器宽度为32位。
  2. AArch64 是一个 64 位执行状态。它支持A64指令集。标准寄存器宽度为64位。

2.1 更改执行状态

执行状态切换规则如下:

2.2 安全状态

安全状态是TrustZone技术的一部分,用于将系统划分为安全世界(Secure world)和非安全世界(Non-secure world,也称为正常世界)。在ARMv9-A中,还引入了领域管理扩展(RME),增加了两个新的安全状态:领域状态(Realm state)和根状态(Root state)。

安全状态决定了处理单元(PE)可以访问哪些物理地址空间和系统寄存器。安全状态的变化必须经过EL3(最高异常级别)的控制。

2.3