登录后台

页面导航

本文编写于 509 天前,最后修改于 450 天前,其中某些信息可能已经过时。

Exception Level

在 arm v8架构中定义了一组异常等级,从el0到el3。

  • 从el0到el3,软件执行权限依次上升。el0称为无特权执行
  • el2为虚拟化提供了非安全操作的支持
  • el3为安全与非安全状态之间的切换提供了支持

在具体的设计实现中并不一定需要包含el0到el3所有的异常等级。但是必须包括el0和el1,el2与el3是可选的。同时exception level不一定需要是连续的,例如可以设计为只包含el0、el1与el3。

在AArch64状态下,执行异常等级的切换只会发生在处理异常或者异常返回的时候

  • 当处理异常的时候,异常等级只能上升或者保持不变
  • 当异常返回的时候,异常等级只能下降或者保持不变

当处理异常的时候切换到的异常等级或者保持不变的异常等级被称为目标异常等级。el0不能作为目标异常等级。

安全状态

arm v8架构提供了两种安全状态:

  • 安全状态:当处于这种状态时,PE可以访问安全物理地址空间和非安全物理地址空间
  • 非安全状态:当处于这种状态时,PE只能访问非安全物理地址空间。并且不能访问安全系统控制的资源

如果在具体设计实现时系统包含el3以及两种安全状态:

  • el3只存在于安全状态
  • 从安全状态与非安全状态之间的切换只能通过异常的触发与返回,经过el3才能完成切换
  • el2只存在于非安全状态

2023-05-15T12:11:55.png

异常等级相关寄存器

Stack Pointer Register SP_ELx

在AArch64系统中,针对每一个异常等级都会有自己的栈指针寄存器——SP_ELx

当执行在el0时,PE使用el0的栈指针——SP_EL0

当执行在其他异常等级时,PE可以被配置为是使用SP_EL0还是使用SP_ELx。在默认情况下,触发异常时会选择与目标异常等级相一致的栈指针寄存器。

Saved Program Status Registers SPSR_ELx

saved program status register用来在触发异常时保存PE状态。由于异常目标等级不能为EL0,所以没有SPSR_EL0寄存器。当触发一个异常时,选取与异常目标等级相一致的SPSR寄存器,用来保存PSTATE寄存器中的值。

保存PE的状态意味着异常处理可以:

  • 在异常返回时,通过SPSR寄存器恢复PE的状态
  • 测试异常触发时PSTATE的值

SPSR寄存器中的DAIF位表示了PSTATE寄存器中的DAIF位的值。同时M[3:0]表示了栈指针寄存器的选择。

2023-05-15T12:12:28.png

ELR寄存器保存了异常返回的地址。ELR寄存器的选择与目标异常等级相匹配。

Exception Syndrome Register ESR_ELx

用于保存异常等级切换时的相关信息。

EC字段(exception class)用于保存异常的类型

ISS字段(instruction specific syndrome)称为指令特异性。这个字段可以为每一个定义的异常类型而独立定义。然而在实际应用中,一些ISS编码被用于多个异常类型。

在异常等级切换的系统调用中:

2023-05-15T12:12:47.png

ISS字段保存了SVC、HVC和SMC指令后面的立即数。例如asmvolatile (“svc #0x4”);

Process state PSTATE

在arm 架构中 PSTATE是对当前执行状态信息的提取。

  • EL位:当前异常等级
  • SP位:stack pointer register选择位
  • D位:debug异常屏蔽位
  • A、I、F位:SError、IRQ、FIQ中断屏蔽位

在AArch64状态下,PSTATE寄存器的字段可以通过特殊的寄存器进行访问,这些寄存器可以通过MRS与MSR指令直接进行读写操作。

2023-05-15T12:13:13.png

2023-05-15T12:13:28.png

异常入口

当在AArch64状态下触发异常,会执行以下操作:

  1. 将PE的状态保存到目标异常等级对应的SPSR_ELx
  2. 将异常返回地址保存到目标异常等级对应的ELR_ELx
  3. 将PSTATE寄存器中的DAIF位置1,屏蔽所有异常
  4. 如果是一个同步异常或者是一个SError中断,引起异常的原因会被保存在目标异常等级对应的ESR_ELx寄存器中
  5. 移动到目标异常等级,并且跳转到异常向量表的地址
  6. 根据目标异常等级选择栈指针寄存器SP
  7. 对于物理的SError异常,它的pending状态会被清除。对于虚拟的SError异常,保存在HCR_EL2寄存器中的VSE位表示它的pending状态,会被清除

异常向量表

2023-05-15T12:13:42.png

异常返回

异常返回往往用于

  • 返回之前的执行流程
  • 进入一个新的执行流程。例如初始化一个虚拟机或者初始化一个操作系统、从虚拟机或者操作系统进入应用。

ERET指令会使异常返回。在ELx执行ERET指令,PC会从ELR_ELx寄存器中恢复值,并且从SPSR_ELx寄存器中恢复PSTATE寄存器的值。