1. 中断向量表¶
中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为 中断向量 。
在 Pc/AT
中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、 CPU
自动形成等),
即在中断响应期间 8259A
产生的是当前请求中断的最高优先级的中断源的中断类型号。
中断类型号和中断向量之间有下面的关系:
中断类型号×4=存放中断向量的首地址
有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口
1.1. 简介¶
是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据 4
字节空间。
中断向量表是 8086
系统内存中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储 256
个中断向量。
在中断响应过程中, CPU
通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,
并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。
80x86
系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,
这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
由于中断向量表可以在操作系统层面灵活修改,因此,不同的系统的中断向量表可能是不同的。
此外, intel
在 CPU
的保护模式下,占用了 0x00~0x1F
共 32
个中断号,
在 Linux
下,是从 0x20
开始用于系统自身的中断的,包括 8259
芯片的中断重置。
1.2. BIOS
实模式¶
1.2.1. 中断向量表 80x86
¶
I/O ADDR |
INT TYPE(16进制) |
FUNCTION |
00 ~ 03 |
0 |
除法溢出中断 |
04 ~ 07 |
1 |
单步(用于DEBUG) |
08 ~ 0B |
2 |
非屏蔽中断(NMI) |
0C ~ 0F |
3 |
断点中断(用于DEBUG) |
10 ~ 13 |
4 |
溢出中断 |
14 ~ 17 |
5 |
打印屏幕 |
18 ~ 1F |
6/7 |
保留 |
1.2.2. 8259主片¶
I/O ADDR |
INT TYPE(16进制) |
FUNCTION |
20 ~ 23 |
8 |
定时器(IRQ0) |
24 ~ 27 |
9 |
键盘(IRQ1) |
28 ~ 2B |
A |
彩色/图形(IRQ2) |
2C ~ 2F |
B |
串行通信COM2(IRQ3) |
30 ~ 33 |
C |
串行通信COM1(IRQ4) |
34 ~ 37 |
D |
LPT2控制器中断(IRQ5) |
38 ~ 3B |
E |
磁盘控制器中断(IRQ6) |
3C ~ 3F |
F |
LPT1控制器中断(IRQ7) |
1.2.3. BIOS¶
I/O ADDR |
INT TYPE(16进制) |
FUNCTION |
40 ~43 |
10 |
视频显示 I/O |
44 ~ 47 |
11 |
设备检验 |
48 ~ 4B |
12 |
测定存储器容量 |
4C ~ 4F |
13 |
磁盘 I/O |
50 ~ 53 |
14 |
RS-232 串行口 I/O |
54 ~ 57 |
15 |
系统描述表指针 |
58 ~ 5B |
16 |
键盘 I/O |
5C ~ 5F |
17 |
打印机 I/O |
60 ~ 63 |
18 |
ROM BASIC 入口代码 |
64 ~ 67 |
19 |
引导装入程序 |
68 ~ 6B |
1A |
日时钟 |
1.2.4. 提供用户中断¶
I/O ADDR |
INT TYPE(16进制) |
FUNCTION |
6C ~ 6F |
1B |
Ctrl - Break 控制的软中断 |
70 ~ 73 |
1C |
定时器控制的软中断 |
74 ~ 77 |
1D |
视频参数块 |
78 ~ 7B |
1E |
软盘参数块 |
7C ~ 7F |
1F |
图形字符扩展码 |
1.2.5. DOS¶
在 DOS
系统(实模式)下,从 0x20
开始,用于操作系统本身。
I/O ADDR |
INT TYPE(16进制) |
FUNCTION |
80 ~ 83 |
20 |
DOS 中断返回 |
84 ~ 87 |
21 |
DOS 系统功能调用 |
88 ~ 8B |
22 |
程序中止时 DOS 返回地址(用户不能直接调用) |
8C ~ 8F |
23 |
Ctrl - Break 处理地址(用户不能直接调用) |
90 ~ 93 |
24 |
严重错误处理(用户不能直接调用) |
94 ~ 97 |
25 |
绝对磁盘读功能 |
98 ~ 9B |
26 |
绝对磁盘写功能 |
9C ~ 9F |
27 |
终止并驻留程序 |
A0 ~ A3 |
28 |
DOS安全使用 |
A4 ~ A7 |
29 |
快速写字符 |
A8 ~ AB |
2A |
Microsoft 网络接口 |
B8 ~ BB |
2E |
基本 SHELL 程序装入 |
BC ~ BF |
2F |
多路服务中断 |
CC ~ CF |
33 |
鼠标中断 |
104 ~ 107 |
41 |
硬盘参数块 |
118 ~ 11B |
46 |
第二硬盘参数块 |
11C ~ 3FF |
47 ~ FF |
BASIC 中断 |
1.3. 保护模式¶
在 Linux
下(保护模式),没有使用 BIOS
设置的中断向量表, 0x00~0x1F
是 CPU
保护模式下的默认中断向量,而 0x20
开始,都是被 Linux
系统重新设置的。
X86
占用的中断向量表如下:
向量号 |
助记符 |
说明 |
类型 |
错误号 |
产生源 |
---|---|---|---|---|---|
0 |
#DE |
除出错 |
故障 |
无 |
DIV或IDIV指令 |
1 |
#DB |
调试 |
故障/陷阱 |
无 |
任何代码或数据引用,或是INT 1指令 |
2 |
– |
NMI中断 |
中断 |
无 |
非屏蔽外部中断 |
3 |
#BP |
断点 |
陷阱 |
无 |
INT3指令 |
4 |
#OF |
溢出 |
陷阱 |
无 |
INTO指令 |
5 |
#BR |
边界范围超出 |
故障 |
无 |
BOUND指令 |
6 |
#UD |
无效操作码 |
故障 |
无 |
UD2指令或保留的操作码 |
7 |
#NM |
设备不存在 |
故障 |
无 |
浮点或WAIT/FWAIT指令 |
8 |
#DF |
双重错误 |
异常终止 |
有(0) |
任何可产生异常、NMI或INTR的指令 |
9 |
– |
协处理器段超越(保留) |
故障 |
无 |
浮点指令 |
10 |
#TS |
无效的任务状态段TSS |
故障 |
有 |
任务交换或访问TSS |
11 |
#NP |
段不存在 |
故障 |
有 |
加载段寄存器或访问系统段 |
12 |
#SS |
堆栈段错误 |
故障 |
有 |
堆栈操作或SS寄存器加载 |
13 |
#GP |
一般保护错误 |
故障 |
有 |
任何内存引用和其他保护检查 |
14 |
#PF |
页面错误 |
故障 |
有 |
任何内存引用 |
15 |
– |
(intel保留) |
无 |
||
16 |
#MF |
x87 FPU浮点错误 |
故障 |
无 |
|
17 |
#AC |
对齐检查 |
故障 |
有(0) |
对内存中任何数据的引用 |
18 |
#MC |
机器检查 |
异常终止 |
无 |
错误码(若有)和产生源与CPU类型有关 |
19 |
#XF |
SIMD浮点异常 |
故障 |
无 |