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