目录
一、异常
1.1异常等级的定义
1.2异常的种类
1.2.1同步异常和异步异常
1.3改变异常等级
1.4异常后的处理
1.4.1异常处理相关寄存器
1.4.2系统调用
1.4.3对EL2/EL3的系统调用
1.4.4异常返回
1.4.5异常处理流程
二、安全状态
三、执行状态
本文介绍以下内容:
- 四个异常级别:EL0~EL3
- 两种安全状态:安全、非安全
- 两种执行状态:AArch64、AArch32
一、异常
在ARMv8架构中,异常是指CPU在执行指令时遇到的一些特殊情况,例如访问非法地址、除以零、硬件故障等。这些事件会打断正在执行的程序,并且需要处理器转而执行一些特定的代码来处理这些事件。为了处理这些异常情况,ARMv8架构定义了一套异常处理机制,其中每个异常都有一个预定义的处理程序。
1.1异常等级的定义
在 ARMv8 中,程序执行发生在四个异常级别中的一个。在AArch64中,异常级别决定了权限级别。因此在ELn执行对应于权限PLn。同样,数字越小,异常越低,权限越低。异常级别提供了软件执行权限的逻辑分离,适用于ARMv8架构的所有操作状态。它类似于并支持计算机科学中常见的分层保护域的概念。
以下是在每个异常级别上运行的软件的典型例子:
- EL0 : 普通用户应用程序。
- EL1 : 操作系统内核通常被描述为有特权的。
- EL2 : 虚拟化管理程序。
- EL3 : 低级别的固件,包括Secure Monitor。
一般来说,一个软件,如应用程序、操作系统的内核或管理程序,只占用一个异常级别。这一规则的一个例外是内核内的管理程序,如KVM,它在EL2和EL1之间运行。ARMv8-A提供两种安全状态:安全和非安全。非安全状态也被称为 "正常世界"。这使得操作系统(OS)可以在同一硬件上与受信任的操作系统并行运行,并提供对某些软件攻击和硬件攻击的保护。ARM TrustZone技术使系统可以在正常世界和安全世界之间进行划分。与ARMv7-A架构一样,安全监视器作为网关在正常世界和安全世界之间移动。
1.2异常的种类
- 中断
在ARM中,FIQ的优先级要高于IRQ,在SOC内部会有一个中断控制器负责中断优先级调度,然后发送中断信号给处理器。中断属于异步模式的异常。
- 中止
中止异常分为数据中止和指令中止,MMU(Memory Management Unit)能够捕获错误并汇报给处理器。
- 复位
复位是处理器中优先级最高的异常,通常分为上电复位和软件复位。
- 软件产生的异常
ARMv8提供了3种软件产生的异常,发生此异常的原因是软件企图进入更高的异常等级。
a) SVC是Supervisor Call的缩写,可以允许用户模式下的程序请求操作系统(OS)服务。当用户模式下的程序需要执行特权指令或者需要访问受保护的资源时,就会触发SVC异常。此时处理器会切换到特权模式,操作系统会接收到该异常并执行相应的服务。
b) HVC是Hypervisor Call的缩写,是一种虚拟化技术中的指令。在虚拟化环境中,HVC指令可以用来切换虚拟机和宿主机之间的控制权,从而实现虚拟机和宿主机之间的交互。当客户机需要执行特权指令或者需要访问主机上受保护的资源时,就会触发HVC异常。此时处理器会切换到虚拟化模式,并将该异常传递给主机上运行的虚拟化软件进行处理。
c) SMC是Secure Monitor Call的缩写,可以允许普通世界(非安全世界)中运行的程序请求安全服务。当普通世界中运行的程序需要执行受保护指令或者需要访问受保护资源时,就会触发SMC异常。此时处理器会切换到安全世界,并将该异常传递给安全监控程序进行处理。
1.2.1同步异常和异步异常
同步异常必须等待cpu处理完当前异常才可以继续执行指令。
常见的同步异常:
a) 访问其他等级的寄存器,比如当前是EL1,如果访问EL2的寄存器就会出现异常
b) SP(Stack Pointer,栈指针)未对齐
c) SVC、HVC和SMC
d) 地址翻译错误/地址权限
常见的异步异常:
a) 物理中断 IRQ、FIQ和系统错误SError
b) 虚拟中断 vIRQ、vFIQ、vSError
1.3改变异常等级
在ARMv7架构中,处理器模式可以在特权软件控制下或在发生异常时自动改变。当异常发生时,内核会保存当前的执行状态和返回地址,进入所需的模式,并可能禁用硬件中断。 这在下面的表格中进行了总结。应用程序在最低的权限水平上运行,即PL0,以前的非特权模式。操作系统在PL1运行,而在具有虚拟化扩展的系统中的管理程序在PL2运行。安全监控器,作为在安全和非安全(正常)世界之间移动的网关,也在PL1运行。
在AArch64中,处理器模式被映射到Exception级别上,如下图所示。如同在ARMv7(AArch32)中,当出现异常时,处理器会改变到支持处理异常的异常级别(模式)。
异常级别之间的切换遵循以下规则:
- 移动到更高的异常级别,例如从EL0到EL1,表示软件执行权限的增加。
- 一个异常不能被带到较低的异常级别。
- 在EL0层没有异常处理,异常必须在更高的异常层处理。
- 一个异常会导致程序流程的改变。异常处理程序的执行在高于EL0的异常级别开始,从一个定义的向量开始,与所发生的异常有关。异常包括:
- 中断,如IRQ和FIQ。
- 内存系统中止。
- 未定义的指令。
- 系统调用。这些允许无特权的软件对操作系统进行系统调用。 操作系统的系统调用。
- 安全监控器或管理程序陷阱。
- 结束异常处理并返回到上一个异常级别是通过执行ERET指令进行的。
- 从异常中返回可以停留在同一个异常级别或进入一个较低的异常级别。它不能移动到更高的异常级别。
- 安全状态会随着异常级别的改变而改变,除了从EL3返回到非安全状态时。
1.4异常后的处理
1.4.1异常处理相关寄存器
a) 异常综合寄存器(ESR_ELn)
b) 故障地址寄存器(FAR_ELn):
为异常处理程序提供关于同步异常原因的信息。ESR_ELn保存了异常原因,而FAR_ELn保存了所有同步指令和数据中止以及对齐故障的故障虚拟地址。
c) 异常链接寄存器ELR_ELn:
保存了导致中止数据访问的指令的地址(对于数据中止)。这些在内存故障后被更新,但在其他情况下也会被设置,例如,通过分支到错位的地址。如果一个异常从AArch32中的异常级别进入使用AArch64的异常级别,并且该异常写入了与目标异常级别相关的故障地址寄存器。
d) 异常综合寄存器ESR_ELn:
包含了允许异常处理程序确定异常原因的信息。它只对同步异常和SError进行更新。它不对IRQ或FIQ进行更新,因为这些中断处理程序通常从通用中断控制器(GIC)的寄存器中获取状态信息。
图.ESR_ELn寄存器
Bit[31:26](ESR_ELn.EC)表示异常类别,它使处理程序能够区分各种可能的异常原因(如未分配的指令,从MCR或MRC到CP15的异常,FP操作的异常,SVC、HVC或SMC的执行,数据中止,以及对齐异常)。例如,EC=101111是一个SError中断。
Bit[25](ESR_ELn.IL)表示被困指令的长度(16位指令为0,32位指令为1),并对某些异常类别进行设置。
Bit[24:0] (ESR_ELn.ISS)构成指令特定综合症(ISS)字段,包含该异常类型的特定信息。例如,当一个系统调用指令(SVC、HVC或SMC)被执行时,该字段包含与操作码相关的即时值,如SVC为0x123456。
注:被困指令是一种特殊的指令,用于在处理器执行过程中发生异常或错误时,将处理器状态(当前的程序计数器和程序状态寄存器等关键寄存器的值保存到内存中)保存到内存中,以确保系统在出现异常或错误时能够正确地响应,并避免进一步的损坏或数据丢失。
1.4.2系统调用
一些指令或系统功能只能在特定的异常级别进行。例如,如果运行在较低Exception级别的代码必须执行一个特权操作,例如当应用程序代码(EL0)向内核(EL1)请求功能时。一种方法是通过使用SVC指令来实现。这允许应用程序产生一个异常。参数可以在寄存器中传递,或者在系统调用中编码。
1.4.3对EL2/EL3的系统调用
SVC指令可以用来从EL0的用户应用程序调用到EL1的内核。HVC和SMC系统调用指令以类似的方式将处理器移动到EL2和EL3。
注意:当处理器在EL0(应用程序)执行时,它不能直接调用管理程序(EL2)或安全监视器(EL3)。这只有在EL1和以上的地方才有可能。因此,应用程序必须使用SVC来调用内核,并允许内核代表它们调用更高的异常级别。
在操作系统内核(EL1),软件可以用HVC指令调用管理程序(EL2),或用SMC指令调用安全监视器(EL3)。
同样,从管理程序代码(EL2)中,程序可以用SMC指令调用安全监视器(EL3)。如果在EL3时进行SMC调用,它仍然会在同一个异常级别上引起一个同步异常,该异常级别的处理程序可以决定如何响应。
1.4.4异常返回
当操作系统的异常处理完成后,执行一条 ERET 指令即可从异常返回。
ERET 指令会自动完成以下动作。 - 从 ELR_ELx 寄存器中恢复 PC 指针 - 从 SPSR_ELx 寄存器恢复 PSTATE 处理器的状态。
当中断发生时,CPU 会将 PSTATE 寄存器的值保存到对应的目标异常等级的 SPSR_ELx 中, 并且把 PSTATE 寄存器里的 D,A,I, F 标志位都设置为1, 这相当于把本地 CPU 的中断关闭。
当中断完成后,操作系统调用 ERET 指令返回中断现场,并且会把 SPSR_ELx 恢复到 PSTATE 寄存器中,这相当于把中断打开。
异常入口和返回的流程如下图:
异常入口和返回的流程示意图
当异常处理结束之后,调用了 ERET 指令返回时是否需要切换执行模式,需要查看 SPSR 寄存器。
SPSR.M[3:0] 字段记录了返回哪个异常等级
SPSR.M[4] 字段记录了返回哪个执行状态
0:表示 AArch64 执行状态
1:表示 AArch32 执行状态
1.4.5异常处理流程
异常处理流程主要包括以下几个步骤:
1. 异常产生:当处理器执行指令时,如果遇到了错误或者特殊情况,就会产生异常。例如,访问非法地址、除零操作、外部中断等。
2. 中断响应:当CPU检测到一个异常时,从异常向量表读取预定义的地址,执行对应的处理程序。
3. 异常处理:每个类型的异常都有自己独立的处理例程。当CPU跳转到对应的预定义地址后,它会执行相应类型的处理例程来完成具体操作。例如,对于外部中断,可以保存当前现场状态并跳转到中断服务程序;对于非法指令,则可以直接终止程序并输出错误信息。
4. 中断返回:CPU完成对异常进行处理后,需要返回到原来被打断的指令继续执行。ARMv8架构定义了一套异常返回机制,可以在处理程序中使用。
二、安全状态
ARMv8‑A 提供两种安全状态,安全和非安全。使用ns表示。(注:目前扩展为2bit: ns,nse)
为什么分安全状态和非安全状态?
在ARMv8-A中,每个处理器核心都可以同时运行多个操作系统或应用程序。为了保证各个操作系统或应用程序之间的隔离和安全性,ARMv8-A提供了两种不同的处理器状态:安全状态和非安全状态。
安全状态是一种特殊的处理器模式,它可以访问所有的系统资源,包括内存、寄存器和外设等。在这种状态下,可以执行所有的指令,并且可以访问所有的内存地址空间。但是,在安全状态下运行的软件需要满足一定的安全要求,比如必须经过认证、授权等。
非安全状态是一种普通的处理器模式,它不能访问系统中的所有资源。在这种状态下运行的软件只能访问被分配给它们的资源和内存地址空间。这样可以保证系统中不同软件之间互相隔离,从而提高了系统的安全性和稳定性。
通过使用这两种不同的处理器状态,ARMv8-A能够提供更高的系统安全性和隔离性。
PS:特权组件是指只能被特权级别高于或等于当前执行级别的软件访问的组件。这些特权组件是ARM体系结构中重要的组成部分,可以提供强大的功能支持和保护机制。
Normal World(对应于非安全状态)具有以下特权组件:
1. Guest OS kernels。此类内核包括在非安全 EL1 中运行的 Linux 或 Windows。在管理程序下运行时,操作系统内核可以作为来宾或主机运行,具体取决于管理程序模型。
2. Hypervisor。在EL2上运行,它始终是非安全的。虚拟机管理程序在存在并启用时,可为操作系统内核提供虚拟化服务。
Secure World具有以下特权组件:
1. Secure firmware。在应用处理器上,该固件必须是在启动时运行的第一件事。它提供了多种服务,包括平台初始化、可信操作系统的安装以及安全监视器调用的路由。
2. Trusted OS 受信任的操作系统为普通世界提供安全服务,并为执行安全或受信任的应用程序提供运行时环境。
在ARM处理器中,正常世界和安全世界之间通过一些特殊的接口进行通信,例如SMC(Secure Monitor Call)和HVC(Hypervisor Call)等。这些接口可以确保正常世界和安全世界之间的数据传输是安全可靠的。
三、执行状态
ARMv8 架构定义了两种执行状态:
- AArch64:执行A64 指令集
- AArch32:执行A32/T32 指令集
下图显示了 AArch64 和 AArch32 中异常级别的组织。
AArch64:
AArch32:
在 AArch32 状态下,Trusted OS 软件在 Secure EL3 中执行,而在 AArch64 状态下,它主要在Secure EL1 中执行。
ARMv7的五个特权级别:
1. 用户模式(User Mode):最低特权级别,用于运行普通应用程序。
2. FIQ模式(FIQ Mode):比用户模式高一级的特权级别,用于处理快速中断请求。
3. IRQ模式(IRQ Mode):比FIQ模式高一级的特权级别,用于处理标准中断请求。
4. 监管者模式(Supervisor Mode):比IRQ模式高一级的特权级别,用于执行系统管理任务和操作系统内核代码。
5. 系统模式(System Mode):最高特权级别,可访问所有资源和硬件设备,并可以执行所有指令。
在ARMv7中,每个特权级别都有自己的寄存器集合和访问权限。这些权限包括对内存、设备和其他资源的读写权限、对指令集的使用权限以及对其他特权级别的切换权限等。通过这些不同的特权级别,ARMv7能够实现多任务操作系统和安全性保护等功能。
参考链接:
【ARMv8基础篇】异常等级_arm异常等级-CSDN博客
超详细的ARM处理器异常处理(含视频教学~) - 知乎
ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)-CSDN博客
ARM64简介 - 知乎