中断在linux驱动中占有很重要的地位,所以也一定要好好分析一下。还是一样的套路,先讲一下基本的概念,然后分析源码再来加深理解。
中断门与其他三个门(调用门、陷阱门、任务门)一起是操作系统里的四扇门。它们之间的区别以后再补充,今天重点分析中断门。
那么什么是门呢?门其实就是一中描述符,直观来看这个描述符描述了由一个选择子和一个偏移所指定的线性地址,程序正是通过这个地址进行转移的。中断描述符放在中断描述符表里(IDT),也就是这个IDT将中断向量和中断服务程序联系起来,他们之间的关系如下图:
那中断向量怎么来得呢,其实每一种中断(异常)都会对应一个中断向量号,具体有哪些中断向量,可以看下面这张图:
向量号 | 助记符 | 描述 | 类型 | 出错码 | 源 |
0 | #DE | 除法错 | Fault | 无 | DIV和IDIV指令 |
1 | #DB | 调试异常 | Fault/Trap | 无 | 任何代码和数据的访问 |
2 | — | 非屏蔽中断 | Interrupt | 无 | 非屏蔽外部中断 |
3 | #BP | 调试断点 | Trap | 无 | 指令INT 3 |
4 | #OF | 溢出 | Trap | 无 | 指令INTO |
5 | #BR | 越界 | Fault | 无 | 指令BOUND |
6 | #UD | 无效(未定义)操作码 | Fault | 无 | 指令UD2或无效指令 |
7 | #NM | 设备不可用(无数学协处理器) | Fault | 无 | 浮点或WAIT/FWAIT指令 |
8 | #DF | 双重错误 | Abort | 有(0) | 所有能产生异常或NMI或INTR 的指令 |
9 | 协处理器段越界(保留) | Fault | 无 | 浮点指令(386后不再处理此 异常) | |
10 | #TS | 无效TSS | Fault | 有 | 任务切换或访问TSS时 |
11 | #NP | 段不存在 | Fault | 有 | 加载段寄存器或访问系统段时 |
12 | #SS | 堆栈段错误 | Fault | 有 | 堆栈操作或加载SS时 |
13 | #GP | 常规保护错误 | Fault | 有 | 内存或其他保护检验 |
14 | #PF | 页错误 | Fault | 有 | 内存访问 |
15 | — | Intel保留,未使用 | |||
16 | #MF | x87FPU浮点错(数学错) | Fault | 无 | x87FPU浮点指令或WAIT/FWAIT指令 |
17 | #AC | 对齐检验 | Fault | 有(0) | 内存中的数据访问(486开始支持) |
18 | #MC | Machine Check | Abort | 无 | 错误码(若有的话)和源依赖于 具体模式(奔腾CPU开始支持) |
19 | #XF | SIMD浮点异常 | Fault | 无 | SSE和SSE2浮点指令(奔腾三 开始支持) |
20~31 | — | Inter保留,未使用 | |||
32~255 | — | 用户定义中断 | Interrupt | 外部中断或int n指令 |