ARM64体系的异常与中断(1)
一、ARM64 体系中的异常
在计算机术语中,异常通常指在程序运行过程中发生的异常事件[1]。ARM64 体系中的异常可以分为同步异常和异步异常。同步异常是由正在运行的指令或指令运行的结果造成的异常[3],而异步异常则不必由运行的指令造成从而可以在程序运行中的任意时刻发生。
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行[2]。在 ARM64 体系中中断包含外部中断请求(IRQ)和快速中断请求(FIQ)。外部中断请求是普通优先级的中断请求,快速中断请求是高优先级的中断请求。
外部中断请求和快速中断请求属于异步异常的范畴,除此之外异步异常还包含系统错误(SError)。系统错误是由硬件错误出发的异常,例如将脏数据从缓存行写回内存时异步触发的数据中止异常[3]。
软件中断是一类特殊的中断,它是一条 CPU 指令,用以陷入中断[4]。软件中断指令可以用于实现用户模式中对操作系统中特权模式的程序的调用,如 ARM 的 SWI 指令。软件中断常用于实现系统调用。
在异常发生时,CPU 将保存异常现场和下一条将执行的指令的地址。然后 CPU 跳转到异常处理程序的入口处并运行异常处理程序。异常处理程序运行完成之后,CPU 会恢复之前保存的异常现场,并跳转到异常发生时的下一条指令或异常发生的指令处继续执行。
ARM 体系的主要异常中断如下表所示[3,5]:
异常中断种类 |
含义 |
复位(reset) | 在系统加电或系统复位时,系统产生复位异常中断,程序跳转到复位中断处理程序处执行。 |
未定义指令(Undefined Instruction) | ARM 处理器或协处理器遇到未定义指令时产生未定义指令异常中断。未定义指令异常中断可以用于仿真浮点向量运算。 |
系统调用(System Call) | 在ARM64 体系中,异常级别 EL0 使用 svc 指令陷入异常级别 EL1;异常级别 EL1 使用 hvc 指令陷入异常级别 EL2;异常级别 EL2 使用smc指令陷入异常级别 EL3。 |
指令预取中止(Prefetch Abort ) | 当处理器预取指令时,若被预取指令的虚拟地址没有映射到物理地址或处理器没有访问被预取指令的地址的权限,则发生指令预取中止异常中断。 |
数据访问中止(Data Abort) | 当数据访问指令访问的虚拟地址没有映射到物理地址或该指令对其访问的地址没有访问权限时,将会产生数据访问中止异常中断。 |
外部中断请求(IRQ) | 当处理器的外部中断请求引脚有效,而且 CPSR 寄存器的I控制位被清除时( ARMv8-A 架构中 CPSR 寄存器被 PSTATE 替代,PSTATE 的I位为IRQ Mask Bit),处理器产生外部中断请求(IRQ)异常中断。 |
快速中断请求(FIQ) | 当处理器的快速中断请求引脚有效,而且 CPSR 寄存器的F控制位被清除时( ARMv8-A 架构中 CPSR 寄存器被 PSTATE 替代,PSTATE 的F位为FIQ Mask Bit),处理器产生外部快速中断请求(FIQ)异常中断。 |
存储异常处理程序的内存位置称为异常向量,通常把所有异常向量放在一张表中,该表称为异常向量表。ARM64 处理器的异常级别 EL1、EL2 和 EL3 分别有自己的异常向量表,异常向量表的起始虚拟地址则放在向量基准地址寄存器 VBAR_ELn 中。ARM64 异常级别 n 的异常向量表如下表所示[3]:
偏移地址(以VBAR_ELn中地址为基址的偏移) | 异常类型 | 说明 |
0x000 | 同步异常 | 当前异常级别生成的异常,使用异常级别0的栈指针寄存器SP_EL0。 |
0x080 | 外部中断请求 | |
0x100 | 快速中断请求 | |
0x180 | 系统错误 | |
0x200 | 同步异常 | 当前异常级别生成的异常,使用当前异常级别的栈指针寄存器SP_ELn。 |
0x280 | 外部中断请求 | |
0x300 | 快速中断请求 | |
0x380 | 系统错误 | |
0x400 | 同步异常 | 64位应用程序在异常级别(n-1)生成的异常。 |
0x480 | 外部中断请求 | |
0x500 | 快速中断请求 | |
0x580 | 系统错误 | |
0x600 | 同步异常 | 32位应用程序在异常级别(n-1)生成的异常。 |
0x680 | 外部中断请求 | |
0x700 | 快速中断请求 | |
0x780 | 系统错误 |
二、结语
本期我们介绍了ARM64体系中的异常,下一期我们将介绍ARM64体系中的中断和ARM的通用中断控制器。
- 点赞
- 收藏
- 关注作者
评论(0)