linxu-kernel-interrupt
参考文章
中断
CPU在正常运行期间,由外部或者内部引起的事件,让CPU停下当前正在运行的程序,转而去执行触发他的中断所对应的程序,处理完中断对应的程序以后在回来继续执行。这个就是中断。举例:同学A现在正在厨房做饭,突然电话响了,然后A关火去接电话。接完电话在回去开火继续做饭。这个过程就是一个中断的一个过程。
中断类型
-
同步中断由CPU本身产生,又称为内部中断。这里同步是指中断请求信号与代码指令之间的同步执行,在一条指令执行完毕后,CPU才能进行中断,不能在执行期间。所以也称为异常(exception)。
-
异步中断是由外部硬件设备产生,又称为外部中断,与同步中断相反,异步中断可在任何时间产生,包括指令执行期间,所以也被称为中断(interrupt)。
-
异常又可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。而中断可分为故障(fault)、陷阱(trap)、终止(abort)三类。
中断子系统框架
- CPU
- 中断控制器
- 外设
- 中断向量表
- 中断号
- Linux内核中断子系统
- 中断编程接口
没那么简单
学操作系统或者单片机时候都知道中断是重点,而且也能自己分析和配置中断程序并执行,但是在Linux内核中中断的实现复杂的多
中断大致可以分为以下几个步骤:
- 当前正在执行的程序
- 保存被打断的上下文
- 中断向量表
- 找到发生中断的设备
- 中断服务程序
- 退出中断,调度程序运行
- 恢复被打断的上下文
- 回到被打断的程序,继续执行…
- 恢复高优先级的进程的上下文
- 切换到高优先级的程序执行…
在C语言的函数调用中,也常常需要保存上下文信息到栈帧当中,可能是某些寄存器或者状态寄存器的信息,函数调用完成之后需要返回
但在中断中,每次中断位置不固定,编译过程中不会像函数调用一样保存上下文,中断过程中需要自己存
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 若水の博客!
评论