目录
一、基本术语
- 中断源:引起中断的事件称为中断源
- 中断号:唯一标识每个特定的中断类型
- 中断向量:中断服务程序的入口地址(就是函数)
- 中断向量表:存储着中断向量的表。就是一个函数指针数组,下标是中断号,值是函数指针
- 断点:被中断打断的地点
- 保护现场:保存程序当前断点的寄存器和相关数据
二、总流程
- 中断控制器接收中断信号、识别中断号
- 控制器通知CPU,CPU关中断、保存断点和识别中断源
- 根据中断向量表跳转到对应的中断服务程序
- 先保护现场,然后再执行服务程序
- 恢复现场,返回断点,重新打开中断
1、中断控制器接收中断信号、识别中断号
每个能产生中断的外设会连接到中断控制器的一条中断信号线,控制器会监视信号线(监视电平)。外设产生中断后控制器识别到对应中断号的信号线有信号,就确定了中断号
2、控制器通知CPU,CPU关中断、保存断点和识别中断源
控制器通知CPU发生了中断,CPU关闭中断,保存断点程序计数器和识别中断源。只有一个中断请求时,CPU直接获取中断号。但是有多个同时的中断请求时,CPU需要判断并获取优先级最高的中断号
3、根据中断向量表跳转到对应的中断服务程序
CPU根据中断号在中断向量表中找到对应的中断处理入口并跳转。进入中断服务函数后会关闭中断,防止中断嵌套问题。此外我问了一下GPT,在关了中断执行中断服务函数的过程中,如果出现异常要怎么跳转到异常服务函数。它的回答是中断服务函数执行期间会使用专门的异常堆栈来处理异常,确保异常处理程序能正确执行
4、先保护现场,然后再执行服务程序
进入中断服务函数后,要保护现场。就是把栈(就是把当前栈指针压栈)和一些寄存器(比如状态寄存器和通用寄存器)保存起来,保证中断服务程序结束后能回到原来的状态。
5、恢复现场,返回断点,重新打开中断
执行完逻辑代码后,恢复现场然后返回断点并打开中断
三、软中断和硬中断
Linux中断分为软中断和硬中断。硬中断是由硬件产生的中断,是短时间的、快速的操作。由于硬中断只能快速运行,所以就需要有软中断的机制,来完成硬中断做不了的、需要较长运行时间的任务。软中断通常在硬中断结束后开始,会将任务放入任务队列,在CPU没那么紧张时进行处理。
软中断分为两种,一种是简单的延时处理,就是在硬中断之后紧跟着进行处理,不会被其他进程中断。一种是工作队列,这种其实就和进程差不多,会跟其他进程一起参与进程的调度
四、补充
这篇文章讲的是Linux系统的中断流程,和单片机裸机的中断流程有一些区别。比如说Linux是不支持中断嵌套的,而单片机可以中断嵌套。所以单片机的中断流程会有更多开关中断操作、还需要手动设置中断屏蔽字。
参考
1、【中断】你对中断究竟有多了解?试着把中断的触发流程整理了一遍... (qq.com)
2、嵌入式基础知识-中断处理过程 - 知乎 (zhihu.com)
3、GPT