一、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(系统错误)。

相关推荐
szxinmai主板定制专家5 分钟前
JETSON orin+FPGA+GMSL+AI协作机器人视觉感知
网络·arm开发·人工智能·嵌入式硬件·fpga开发·机器人
无奈笑天下9 分钟前
银河麒麟高级服务器版本【更换bond绑定的网卡】操作方法
linux·运维·服务器·arm开发·经验分享
虚伪的空想家37 分钟前
arm架构TDengine时序数据库及应用使用K8S部署
服务器·arm开发·架构·kubernetes·arm·时序数据库·tdengine
hnlq16 小时前
基于dpdk的用户态协议栈的实现(一)—— dpdk原理
arm开发
碧海银沙音频科技研究院17 小时前
基于物奇wq7036与恒玄bes2800智能眼镜设计
arm开发·人工智能·深度学习·算法·分类
切糕师学AI19 小时前
ARM 架构中,R13栈指针(SP)是什么?
arm开发·寄存器·sp
贝塔实验室19 小时前
Altium Designer 集成库介绍
arm开发·数据库·驱动开发·硬件工程·射频工程·基带工程·精益工程
颜颜yan_20 小时前
跨越x86与ARM:openEuler全架构算力实战评测
java·arm开发·架构
神明常在1 天前
OS实验ARM配置过程
arm开发
努力进修1 天前
openEuler WSL嵌入式开发环境搭建:ARM交叉编译工具链配置全攻略
arm开发·openeuler