中斷向量表
存放中斷服務程序的首地址
中斷源的識別標誌,可用來形成相應的中斷服務程序的入口地址或存放中斷服務程序的首地址稱為中斷向量。在Pc/AT中由硬體產生的中斷標識碼被稱為中斷類型號(當然,中斷類型號還有其他的產生方法,如指令中直接給出、CPU自動形成等),即在中斷響應期間8259A產生的是當前請求中斷的最高優先順序的中斷源的中斷類型號。中斷類型號和中斷向量之間有下面的關係:中斷類型號×4=存放中斷向量的首地址 有了存放中斷向量的首地址,從該地址開始的4個存儲單元中取出的就是中斷服務程序的入口。
是指中斷服務程序入口地址的偏移量與段基值,一個中斷向量佔據4位元組空間。中斷向量表是8088系統內存中最低端1K位元組空間,它的作用就是按照中斷類型號從小到大的順序存儲對應的中斷向量,總共存儲256個中斷向量。在中斷響應過程中,CPU通過從介面電路獲取的中斷類型號(中斷向量號)計算對應中斷向量在表中的位置,並從中斷向量表中獲取中斷向量,將程序流程轉向中斷服務程序的入口地址。
80x86系統是把所有的中斷向量集中起來,按中斷類型號從小到大的順序存放到存儲器的某一區域內,這個存放中斷向量的存儲區叫做中斷向量表,即中斷服務程序入口地址表。
由於中斷向量表可以在操作系統層面靈活修改,因此,不同的系統的中斷向量表可能是不同的。此外,intel在CPU的保護模式下,佔用了0x00 ~ 0x1F共32個中斷號,在Linux下,是從0x20開始用於系統自身的中斷的,包括8259晶元的中斷重置。
BIOS(實模式)的中斷向量表如下:
I/O ADDR | INT TYPE(16進位) | FUNCTION |
00 ~ 03 | 除法溢出中斷 | |
04 ~ 07 | 1 | 單步(用於DEBUG) |
08 ~ 0B | 2 | 非屏蔽中斷(NMI) |
0C ~ 0F | 3 | 斷點中斷(用於DEBUG) |
10 ~ 13 | 4 | 溢出中斷 |
14 ~ 17 | 5 | 列印屏幕 |
18 ~ 1F | 6/7 | 保留 |
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) |
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 | 日時鐘 |
I/O ADDR | INT TYPE(16進位) | FUNCTION |
6C ~ 6F | 1B | Ctrl - Break 控制的軟中斷 |
70 ~ 73 | 1C | 定時器控制的軟中斷 |
74 ~ 77 | 1D | 視頻參數塊 |
78 ~ 7B | 1E | 軟盤參數塊 |
7C ~ 7F | 1F | 圖形字元擴展碼 |
在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 中斷 |
在Linux下(保護模式),沒有使用BIOS設置的中斷向量表,0x00 ~ 0x1F是CPU保護模式下的默認中斷向量,而0x20開始,都是被Linux系統重新設置的。
X86佔用的中斷向量表如下:
向量號 | 助記符 | 說明 | 類型 | 錯誤號 | 產生源 |
#DE | 除出錯 | 故障 | 無 | DIV或IDIV指令。 | |
1 | #DB | 調試 | 故障/陷阱 | 無 | 任何代碼或數據引用,或是INT 1指令。 |
2 | -- | NMI中斷 | 中斷 | 無 | 非屏蔽外部中斷。 |
3 | #BP | 斷點 | 陷阱 | 無 | INT 3指令。 |
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浮點異常 | 故障 | 無 |
Linux自己設置的中斷以後再添加。