中断
中断是 CPU 处理外部突发事件的技术,解决了早期 CPU 需要与慢速设备并行工作的问题,对中断的响应行为的固化在 CPU 内部的逻辑,按照 中断源 分为下面两类:
硬中断
指由外设(鼠标、键盘、时钟、硬盘等)产生的电信号,通过总线发送给中断控制器,再通知 CPU 停下手头的工作,保护现场,在 中断向量表 中,找到对应的中断程序入口,进行中断处理,一般是分发到对应的驱动程序。
中断向量表是内核与 CPU 约定好的一块内存区域,存放中断号与中断处理程序入口。硬中断可以嵌套,可以被屏蔽。硬中断分为 可屏蔽中断 INTR(Interrupt Require) 与 不可屏蔽中断 NMI(Nonmaskable Interrupt),CPU 必须无条件立即响应不可屏蔽中断。
注意中断处理程序不等于驱动程序,中断发生后,会关中断(屏蔽其他的中断),所以中断处理程序必须能够快速返回。因此人们将中断处理程序分为两个部分,称为 上半部 和 下半部。上半部进行一些必要紧急的硬件操作后(开中断),剩下的耗时操作交由下半部执行,下半部执行时可以响应新的硬中断。下半部是使用软中断实现的。
中断还可以分为 内部中断 和 外部中断,这个内外是相对于处理器而言的。外部中断是由外设引起的中断,而内部中断是指由硬件出错(掉电、校验错误、总线超时)、运算出错(除以零、溢出、越界、缺页等)引起的中断。内部中断也是通过软中断实现,内部中断也称为 异常。注意,大部分异常都发生在用户态,缺页中断是唯一发生在内核态的异常(?)。
举例:
- 时钟中断,由处理器内部的计时器产生,允许操作系统以一定规律执行函数;
- IO 中断,输入输出设备产生的中断;
- 硬件故障中断,由掉电、存储器校验错等硬件故障引起,这就是一类不可屏蔽中断。
软中断
指由当前正在运行的程序,执行中断指令产生的中断,不可被屏蔽。软中断不会去打断 CPU 的手头工作,只会阻塞当前的程序(进程/线程),因为软中断就是当前正在执行的程序引起的。
软中断不是真正的中断,而是用来处理一些特殊任务的一般的可调用程序,一般是事先定义好的。内部中断(异常)与中断处理程序的下半部就使用软中断实现。
举例:
- 系统调用;
- 内部中断(异常)。
小结
- 按中断源分类
- 硬中断,可被中断(嵌套),可被屏蔽。与 CPU 异步,CPU 必须随时能够响应,即会打断 CPU。
- 软中断,不可被中断,不可被屏蔽。与 CPU 同步,本质是可被调用的一般程序,不会打断 CPU,只会打断当前程序。
- 按产生地点分类(相对于 CPU)
- 外部中断,即硬中断。
- 内部中断,是由软中断实现的,大部分发生在用户态。
- 参考