一、ARM异常等级及切换

目录

  • [1 ARM异常](#1 ARM异常)
    • [1.1 异常等级总览](#1.1 异常等级总览)
      • [1.1.1 EL3](#1.1.1 EL3)
      • [1.1.2 EL2](#1.1.2 EL2)
      • [1.1.3 EL1](#1.1.3 EL1)
      • [1.1.4 EL0](#1.1.4 EL0)
    • [1.2 异常等级的切换](#1.2 异常等级的切换)
      • [1.2.1 上去(到更高的EL)](#1.2.1 上去(到更高的EL))
      • [1.2.1 下来(到更低的EL)](#1.2.1 下来(到更低的EL))
    • [1.3 异常](#1.3 异常)
      • [1.3.1 同步异常](#1.3.1 同步异常)
      • [1.3.2 异步异常](#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(系统错误)。

相关推荐
XMAIPC_Robot1 天前
深度无人机自动驾驶仪,中小型无人机硬件在环仿真飞行
运维·arm开发·人工智能·fpga开发·无人机·边缘计算
番茄灭世神1 天前
Vscode开发/调试ARM单片机最新教程
c语言·arm开发·vscode·stm32·嵌入式·gd32
猫猫的小茶馆2 天前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
霞姐聊IT2 天前
x86程序移植到arm平台的四种场景及解决方案简介
arm开发
楼兰公子2 天前
《深入理解Linux网络技术内幕》配套学习大纲 + 源码Demo + 进阶实战实例
linux·arm开发·学习
lljss20202 天前
Arm GNU 工具链 命名规则
服务器·arm开发·gnu
底层开发智库3 天前
无需硬件开发板,从零构建并运行ARM aemfvp-a-rme软件栈
arm开发·arm
HMS工业网络3 天前
主从结合,安全互联:Anybus工业通信解决方案全栈升级
arm开发
XINVRY-FPGA3 天前
XC7Z010-2CLG400I Xilinx Zynq-7000 FPGA
arm开发·嵌入式硬件·算法·fpga开发·硬件工程·dsp开发·fpga
Emtronix英创4 天前
RK3568 CAN驱动测试及使用说明
linux·arm开发·rk3568·全国产主板