AArch64异常模型
出于安全考虑,现代处理器架构往往存在权限的概念。比如说我们不希望用户能够直接修改内核代码以免造成内核崩溃,又需要给予用户一定的配置内核功能的能力。此时我们需要权限,赋予用户特权,以实现功能隔离。
1. 权限、异常级别
1.1 异常级别
AArch64 中权限的名称为异常级别,通常缩写为 EL。
异常级别为编号,通常缩写为 EL<x>,其中 <x> 为介于 0 到 3 之间的数字。权限级别越高,数字越高。例如,最低级别的权限称为EL0。
通常来说,EL对应的级别随着系统抽象层级的提升而降低。
异常级别只能在特定的事件发生时改变。
- 发生异常(Taking an exception)
- 从异常返回(Returning from an exception)
- 处理器复位(Processor reset)
- 在调试状态期间(During Debug state)
- 退出调试状态(Exiting from Debug state)
1.2 特权类型
AArch64 Exception 模型有两种类型的权限:
- 内存系统中的权限
- 从访问处理器资源的角度来看是特权
两种类型的权限都受当前特权异常级别的影响。
如下图是AArch64特权类型图:
异常类型处理的寄存器:
处理异常的关键寄存器说明:
| 寄存器 | 实际可用级别 | 说明 |
|---|---|---|
ELR_ELx | EL1, EL2, EL3 | 异常链接寄存器,每个级别独立 |
ESR_ELx | EL1, EL2, EL3 | 异常综合征寄存器,每个级别独立 |
FAR_ELx | EL1, EL2, EL3 | 故障地址寄存器,每个级别独立 |
HCR_ELx | EL2 | 仅EL2可用,控制虚拟化 |
SCR_ELx | EL3 | 仅EL3可用,控制安全状态 |
SCTLR_ELx | EL1, EL2, EL3 | 系统控制寄存器,每个级别独立 |
SPSR_ELx | EL1, EL2, EL3 | 保存程序状态寄存器,每个级别独立 |
VBAR_ELx | EL1, EL2, EL3 | 向量基地址寄存器,每个级别独立 |
2. 执行与安全状态
Armv8-A 或 Armv9-A 处理器的当前状态由异常级别和当前执行状态决定。
当前执行状态定义了通用寄存器的标准宽度和可用的指令集。
Armv8-A 和 Armv9-A 支持两个执行语句(说明图可见于指令集那一章节):
- AArch32 是一个 32 位执行状态。在此状态下的操作与先前的架构具有向后兼容。它支持 T32 和 A32 指令集。标准寄存器宽度为32位。
- AArch64 是一个 64 位执行状态。它支持A64指令集。标准寄存器宽度为64位。
2.1 更改执行状态
执行状态切换规则如下:
2.2 安全状态
安全状态是TrustZone技术的一部分,用于将系统划分为安全世界(Secure world)和非安全世界(Non-secure world,也称为正常世界)。在ARMv9-A中,还引入了领域管理扩展(RME),增加了两个新的安全状态:领域状态(Realm state)和根状态(Root state)。
安全状态决定了处理单元(PE)可以访问哪些物理地址空间和系统寄存器。安全状态的变化必须经过EL3(最高异常级别)的控制。