第二十七期-ARM64体系的异常与中断(1)
第二十七期-ARM64体系的异常与中断(1)
作者:罗宇哲,中国科学院软件研究所智能软件研究中心
上一章中我们介绍了与ARM体系结构有关的一些基础知识,这一章我们将介绍openEuler中异常与中断的相关知识。首先我们从处理器的视角出发,介绍一下ARM64体系中的异常与中断。
一、ARM64体系中的异常
在计算机术语中,异常通常指在程序运行过程中发生的异常事件1。 ARM64体系中的异常可以分为同步异常和异步异常。同步异常是由正在运行的指令或指令运行的结果造成的异常2,而异步异常则不必由运行的指令造成从而可以在程序运行中的任意时刻发生。
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行3。在ARM64体系中中断包含外部中断请求(IRQ)和快速中断请求(FIQ)。外部中断请求是普通优先级的中断请求,快速中断请求是高优先级的中断请求。
外部中断请求和快速中断请求属于异步异常的范畴,除此之外异步异常还包含系统错误(SError)。系统错误是由硬件错误出发的异常,例如将脏数据从缓存行写回内存时异步触发的数据中止异常4。
软件中断是一类特殊的中断,它是一条CPU指令,用以陷入中断5。软件中断指令可以用于实现用户模式中对操作系统中特权模式的程序的调用,如ARM的SWI指令。软件中断常用于实现系统调用。
在异常发生时,CPU将保存异常现场和下一条将执行的指令的地址。然后CPU跳转到异常处理程序的入口处并运行异常处理程序。异常处理程序运行完成之后,CPU会恢复之前保存的异常现场,并跳转到异常发生时的下一条指令或异常发生的指令处继续执行。
异常中断种类 | 含义 |
---|---|
复位(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的异常向量表如下表所示8:
偏移地址(以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的通用中断控制器。
-
https://baike.baidu.com/item/异常/5952477?fr=aladdin ↩︎
-
《Linux内核深度解析》,余华兵著,2019 ↩︎
-
《教师百科辞典》编委会.教师百科辞典:社会科学文献出版社 ,1987 ↩︎
-
《Linux内核深度解析》,余华兵著,2019 ↩︎
-
https://baike.baidu.com/item/中断/3933007#reference-1-5143456-wrap ↩︎
-
《Linux内核深度解析》,余华兵著,2019 ↩︎
-
https://baike.baidu.com/item/中断/3933007#reference-1-5143456-wrap ↩︎
-
《Linux内核深度解析》,余华兵著,2019 ↩︎