Interrupt Pipeline系列文章大纲-CSDN博客
在探索I-pipe(Interrupt Pipeline)中断流水线的代码之前,必须先搞清楚中断的相关概念。
中断机制,顾名思义,就是允许突发事件,打断CPU上原本处于执行过程中的程序,抢到CPU的使用权来处理突发事件。中断信号通常被分为同步中断和异步中断两大类。同步中断,一般是由程序的错误产生,或者是由内核必须处理的事件(例如系统调用)产生。异步中断一般是由I/O外设和时钟产生。
在不同的CPU架构中,对于中断机制的设计与实现不同,对中断信号的概念划分也有所不同。
在Intel 80x86 CPU手册中,同步中断和异步中断也被分别称为异常(Exception)和中断(Interrupt)。还有第三种触发中断的方式,就是INT n指令,也称为软件中断。无论是哪种方式,最终都是让CPU收到一个中断号,中断号的范围是0~255。CPU收到一个中断号n后,会去中断描述表IDT(Interrupt Descriptor Table)中,找到第n个中断描述符,从中断描述符中找到中断处理程序。中断描述表IDT(Interrupt Descriptor Table)也被称为中断向量表。
由中断描述表IDT这个名称可见,x86的中断机制的顶层概念是中断。
ARM64的中断机制的顶层概念是异常,同步中断和异步中断被分别称为同步异常和异步异常两种。
同步异常是指处理器需要等待异常处理的结果,然后再继续执行后面的指令,比如数据中止发生时我们知道发生数据异常的地址,因而可以在异常处理函数中修复这个地址。常见的同步异常如下。
- 系统调用(SVC)、HVC或SMC指令
- 因地址翻译或权限等导致的数据异常或指令异常
- 尝试执行没有定义(UNDEFINED)的指令
- 使用没有对齐的SP或执行没有对齐的PC指令
- 调试导致的异常,比如断点异常、观察点异常、软件单步异常等
I-pipe需要对系统调用SVC进行改造,确保实时内核触发的系统调用能够正确处理。其它同步异常发生时,意味着实时性已经被打破了,仍然可以交给Linux内核处理。
异步异常发生时,处理器正在处理的指令和异常是完全没有关系的,它们之间没有依赖关系,常见的异步异常包括物理中断和虚拟中断。这里只讨论物理中断:
- 中断IRQ,即普通优先级中断
- 快速中断FIQ,即高优先级中断(Linux中不使用FIQ,仅使用IRQ)
- 系统错误SError,由硬件错误触发的异常
I-pipe需要对物理中断IRQ的相关代码进行重点改造。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-CSDN博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!