一、ARM异常等级及切换
目录
- 1 ARM异常
- 1.1 异常等级总览
- 1.1.1 EL3
- 1.1.2 EL2
- 1.1.3 EL1
- 1.1.4 EL0
- 1.2 异常等级的切换
- 1.2.1 上去(到更高的EL)
- 1.2.1 下来(到更低的EL)
- 1.3 异常
- 1.3.1 同步异常
- 1.3.2 异步异常
1 ARM异常
1.1 异常等级总览
在 Arm A-profile 的 AArch64 执行状态下,CPU 权限被划分为四个异常等级(EL0~EL3),数字越大权限越高。EL0 面向应用程序,EL1 面向操作系统内核,EL2面向虚拟化管理器(Hypervisor),EL3面向安全监控器与早期固件。不同 EL 拥有各自的寄存器集和异常向量表(VBAR_ELx),通过硬件强制的边界实现权限隔离和控制转移,是整个系统安全与稳定的“层级骨架”。
1.1.1 EL3
EL3 是最高特权层,主要承担世界切换(Secure/Non-secure)的仲裁与策略落地,并为下层提供安全服务(如 PSCI 电源管理接口、SMC 调用分发等)。常见的 BL1/BootROM 和 TF-A 的 BL31 就运行在 EL3:它们在启动早期初始化关键寄存器(如 SCR_EL3、SCTLR_EL3),验证并移交控制权给下一阶段镜像,运行期则作为“安全门卫”处理来自低 EL 的安全监控调用(SMC),再通过 ERET 将控制权返回到目标 EL/世界。
1.1.2 EL2
EL2 负责虚拟化,管理来宾操作系统(Guest OS)并提供二阶段地址转换(Stage-2),从而把来宾看见的“物理地址”再映射到真正的宿主物理地址;这让 Hypervisor 能强隔离多个来宾系统并进行资源控制。典型实现包括 KVM/Hypervisor,支持 VHE 的场景下部分宿主能力可在 EL2 直接运行以降低陷入开销。若某 SoC 未实现虚拟化,系统通常直接在 EL1 运行操作系统而不涉 EL2。
1.1.3 EL1
EL1 是传统意义上的“内核态”,负责进程调度、内存管理、驱动与中断处理,并通过一阶段地址转换(Stage-1)为 EL0 提供进程级虚拟内存隔离。Linux、BSD 等常见操作系统在非安全世界的 EL1 运行(NS-EL1),而可信操作系统(如 OP-TEE)可运行在安全世界的 EL1(S-EL1)。当需要调用更高特权或安全服务时,EL1 会通过 HVC(到 EL2)或 SMC(到 EL3)发起受控陷入。
1.1.4 EL0
EL0 承载普通应用程序的执行,不能直接访问特权指令或内核资源;应用通过系统调用触发 SVC 陷入到 EL1,由内核代表完成文件、网络、进程等操作。EL0 的地址空间、权限位与异常路径均由 EL1 的页表与策略控制,从而在硬件层面限制应用越权并隔离不同进程的内存。
1.2 异常等级的切换
1.2.1 上去(到更高的EL)
SVC:EL0 → EL1(应用→内核,系统调用)
HVC:EL1 → EL2(内核→虚拟化管理器)
SMC:任意较低 → EL3(进入安全监控器/固件,含世界切换)
同步异常(指令/数据访存异常、未定义指令)和异步异常(IRQ/FIQ/SError)也会把控制权送到当前或更高的 EL(由路由位决定)。
1.2.1 下来(到更低的EL)
统一用 ERET。高 EL 在保存了目标状态(SPSR_ELx)和返回地址(ELR_ELx)后执行 ERET,“带着”指定的位宽/中断屏蔽/目标 EL 返回。
1.3 异常
1.3.1 同步异常
由当前正在执行的指令“当场”触发,异常与这条指令存在一一对应关系(精确异常)。
典型来源:SVC/HVC/SMC 指令、未定义指令、对齐/权限/页表错误(Instr/Data abort)、断点、Watchpoint、FP/PC 错误等。
1.3.2 异步异常
典型来源:IRQ(普通中断)、FIQ(快速中断)、SError(系统错误)。