我对中断的理解:
中断,顾名思义,就是在遇到特殊的情况时,停下当前正在做的事情,转去干其他(根据特殊情况预先设计好的)事情,完成后(并不一定非要)再继续之前做的事情。
首先说说“去干其他(根据特殊情况预先设计好的)事情”。
我们可以预先设计好256件事情(处理函数),然后使用0~255这256个编号(中断向量号)表示代指。“事情”根据是否可以再次打断(中断),分为中断门(不可以被打断)和陷阱门(可以再次被打断)。
下面解释一下所谓的“遇到特殊的情况”,这个特殊的情况按照触发类型可以分为两类:
自动产生:自动产生的意思就是程序自己根据需要自己主动触发的中断,也就是使用int指令+中断号触发的。对于所有的256个中断,都可以使用int指令触发。
被动产生:被动产生,就是系统硬性规定的,在遇到某种指定的情况,就触发对应中断向量号的中断。
具体而言如下表:(摘自《自己动手写内核系列_skelix》天衣有缝,有稍微修改)
0x00 除零错
0x01 调试异常
0x02 非可屏蔽中断 (NMI)
0x03 断点 (INT 3 指令)
0x04 溢出 (INTO 指令)
0x05 越界 (BOUND 指令)
0x06 无效的指令
0x07 无协处理器
0x08 双重错误
0x09 协处理器越界
0x0A 无效的 TSS
0x0B 段不存在
0x0C 栈溢出
0x0D 通用保护异常(内存引用或其他检查保护),Windows 9x 蓝屏就是它的杰作
0x0E 页错误
0x0F Intel 保留
0x10 协处理器错误
0x11-0x19 Intel 保留
需要说明的有两点:
一.0x11~0x19这12个中断向量号, Intel预定了,但是并没有实际使用上,但将来可能会用到。因此我们可以在编写操作系统的使用直接拿来用,但是这样会有一定风险,要是Intel的下一代产品里使用了这些中断向量号,我们想要兼容它,就不得不修改代码将这几个中断向量号让出来。
二.上表中触发的原因,基本都是程序运行时发生错误产生的(0x02号中断除外),可以称之为内部中断。与之相对应的称作外部中断的东西,就是由于计算机硬件(键盘,鼠标等)触发的。这些中断是可以屏蔽掉(忽略掉)的。想要响应这些中断,也需要分配相应的中断向量号才行。具体的内容就是下面要讲到的可编程中断控制器8259A。
可编程中断控制器8259A:
8259A分自从两块,每一块都可以接收8个不同触发事件的信号,具体如下:(摘自《自己动手写操作系统》于源)
序号 触发源头
IRQ0 时钟
IRQ1 键盘
IRQ2 来自 从 8259A
IRQ3 串口2
IRQ4 串口1
IRQ5 LPT2
IRQ6 软盘
IRQ7 LPT1
从 8259A
IRQ8 实时