概念介紹
中斷標識碼(中斷類型號):
由硬體(通常是中斷控制器)產生,以標識不同的中斷源。
中斷向量:
中斷服務程式的入口地址。在某些計算機中,中斷向量的位置存放一條跳轉到中斷服務程式入口地址的跳轉指令。
中斷向量地址:
存儲中斷向量的存儲單元地址
中斷
存放
存放中斷服務程式的入口地址
來存放中斷向量(共256個),稱這一片記憶體區為中斷向量表,地址範圍是0~3FFH,如圖所示。
在PC/AT中由硬體產生的中斷標識碼被稱為中斷類型號(當然,中斷類型號還有其他的產生方法,如指令中直接給出、CPU自動形成等),即在中斷回響期間8259A產生的是當前請求中斷的最高優先權的中斷源的中斷類型號。中斷類型號和中斷向量之間有下面的關係:
中斷類型號×4=存放中斷子程式首地址的存儲區首地址=中斷向量地址
有了存放中斷向量的首地址,從該地址開始的4個存儲單元中取出的就是中斷服務程式的入口。
跳轉
跳轉到中斷服務程式的入口地址
在AVR或ARM微處理器中,中斷向量的大小也是4個位元組,但其中存放的不是中斷程服務程式的入口地址,而是可執行的代碼。當回響中斷時,硬體自動執行相應中斷向量處的跳轉代碼,然後跳轉到具體的中斷服務程式的入口地址。
向量表
CPU是根據中斷號獲取中斷向量值,即對應中斷服務程式的入口地址值。因此為了讓CPU由中斷號查找到對應的中斷向量,就需要在記憶體中建立一張查詢表,即中斷向量表(在32位保護模式下該表稱為中斷描述符表)。80x86微機支持256箇中斷,對應每箇中斷需要安排一個中斷服務程式。在 80x86實模式運行方式下,每箇中斷向量由4位元組組成。這4位元組指明了一個中斷服務程式的段值和段內偏移值。因此整個向量表的長度為1KB。當 80x86微機啟動時,ROM BIOS中的程式會在物理記憶體開始地址0x0000:0x0000處初始化並設定中斷向量表,而各中斷的默認中斷服務程式則在BIOS中給出。由於中斷向量表中的向量是按中斷號順序排列,因此給定一個中斷號N,那么它對應的中斷向量在記憶體中的位置就是0x0000:N×4,即對應的中斷服務程式入口地址保存在物理記憶體0x0000:N×4位置處。
在BIOS執行初始化操作時,它設定了兩個8259A晶片支持的16個硬體中斷向量和BIOS提供的中斷號為0x10~0x1f的中斷調用功能向量等。對於實際沒有使用的向量則填入臨時的啞中斷服務程式的地址。以後在系統引導載入作業系統時會根據實際需要修改某些中斷向量的值。例如,對於DOS作業系統,它會重新設定中斷0x20~0x2f的中斷向量值。而對於Linux系統,除了在剛開始載入核心時需要用到BIOS提供的顯示和磁碟讀操作中斷功能,在核心正常運行之前則會在setup.s程式中重新初始化8259A晶片並且在head.s程式中重新設定一張中斷向量表(中斷描述符表)。完全拋棄了BIOS所提供的中斷服務功能。
當Intel CPU運行在32位保護模式下時,需要使用中斷描述符表(Interrupt Descriptor Table,IDT)來管理中斷或異常。IDT是Intel 8086~80186 CPU中使用的中斷向量表的直接替代物。其作用也類似於中斷向量表,只是其中每箇中斷描述符項中除了含有中斷服務程式地址以外,還包含有關特權級和描述符類別等信息。Linux作業系統工作於80x86的保護模式下,因此它使用中斷描述符表來設定和保存各中斷的"向量"信息。下面是80X86中斷向量表各個地址表示的中斷用途。
記憶體地址(十六進制) | 對應向量號(十六進制) | 中斷用途 |
BASIC中斷向量 | ||
0x3C4-0x3FF | F1-FF | 未使用 |
0x218-0x3C3 | 86-F0 | BASIC程式運行時提供給BASIC解釋程式作用 |
0x200-0x217 | 80-85 | 為BASIC保留 |
0x1E0-0x1FF | 78-7F | 未使用 |
0x1DC-0x1DF | 77 | 硬體中斷15 |
0x1D8-0x1DB | 76 | 硬體中斷14 |
0x1D4-0x1D7 | 75 | 硬體中斷13 |
0x1D0-0x1D3 | 74 | 硬體中斷12 |
0x1CC-0x1CF | 73 | 硬體中斷11 |
0x1C8-0x1CB | 72 | 硬體中斷10 |
0x1C4-0x1C7 | 71 | 硬體中斷9 |
0x1C0-0x1C3 | 70 | 硬體中斷 |
0x1A0-0x1BF | 68-6F | 未使用 |
0x180-0x19F | 60-67 | 為用戶程式保留的單元 |
0x128-0x17F | 4A-5F | 保留 |
0x124-0x127 | 49 | 指向鍵盤增強服務變換表 |
0x120-0x123 | 48 | PC機使用,用於把PC機的鍵盤代碼變換為標準的鍵盤代碼 |
0x11C-0x11F | 47 | 保留 |
DOS中斷向量 | ||
0x118-0x11B | 46 | 第二硬碟參數塊 |
0x114-0x117 | 45 | 保留 |
0x110-0x113 | 44 | PC機使用,用於指向低分辯率圖形字元參數表 |
0x108-0x10F | 42-43 | 未使用 |
0x104-0x107 | 41 | 硬碟參數塊 |
0x0C0-0x0CB | 34-40 | 未使用 |
0x0CC-0x0CF | 33 | 滑鼠中斷 |
0x0C0-0x0CB | 30-32 | 未使用 |
0x0BC-0x0BF | 2F | 多路服務中斷 |
0x0B8-0x0BB | 2E | 基本SHELL程式裝入 |
0x0AC-0x0B7 | 2B-2D | 未使用 |
0x0A8-0x0AB | 2A | Microsoft網路接口 |
0x0A4-0x0A7 | 29 | 快速寫字元 |
0x0A0-0x0A3 | 28 | DOS安全使用 |
0x09C-0x09F | 27 | 終止並駐留程式 |
0x098-0x09B | 26 | 絕對磁碟寫功能 |
0x094-0x097 | 25 | 絕對磁碟讀功能 |
0x090-0x093 | 24 | 嚴重錯誤處理(用戶不能直接調用) |
0x08C-0x08F | 23 | Ctrl+Break處理地址(用戶不能直接調用) |
0x088-0x08B | 22 | 程式中止時DOS返回地址(用戶不能直接調用) |
0x084-0x087 | 21 | DOS系統功能調用 |
0x080-0x083 | 20 | DOS中斷返回 |
數據表指針 | ||
0x07C-0x07F | 1F | 圖形字元擴展碼 |
0x078-0x07B | 1E | 軟碟參數塊 |
0x074-0x077 | 1D | 視頻參數塊 |
提供給用戶的中斷 | ||
0x070-0x073 | 1C | 定時器控制的軟中斷 |
0x06C-0x06F | 1B | Ctrl+Break控制的軟中斷 |
BIOS中斷 | ||
0x068-0x06B | 1A | 時鐘管理 |
0x064-0x067 | 19 | 引導裝入程式--系統自舉 |
0x060-0x063 | 18 | BASIC入口代碼--ROMBASIC入口代碼 |
0x05C-0x05F | 17 | 印表機輸出 |
0x058-0x05B | 16 | 鍵盤I/O |
0x054-0x057 | 15 | 盒式磁帶I/O |
0x050-0x053 | 14 | RS-232串列通訊口I/O |
0x04C-0x04F | 13 | 磁碟I/O |
0x048-0x04B | 12 | 測定存儲器容量 |
0x044-0x047 | 11 | 設備檢驗 |
0x040-0x043 | 10 | 螢幕顯示I/O |
8259中斷向量 | ||
0x03C-0x03F | F | LPT2控制器中斷--並行印表機(IRQ7) |
0x038-0x03B | E | 磁碟控制器中斷--軟磁碟(IRQ6) |
0x034-0x037 | D | LPT2控制器中斷--硬磁碟(並行口)(IRQ5) |
0x030-0x033 | C | 異步通信(primary)--串列通信接口1(IRQ4) |
0x02C-0x02F | B | 異步通信(secondary)--串列通信接口2(IRQ3) |
0x028-0x02B | A | 彩色/圖形(IRQ2) |
0x024-0x027 | 9 | 鍵盤(IRQ1) |
0x020-0x023 | 8 | 定時器(IRQ0) |
8088中斷向量 | ||
0x01C-0x01F | 7 | 保留 |
0x018-0x01B | 6 | 保留 |
0x014-0x017 | 5 | 列印螢幕 |
0x010-0x013 | 4 | 溢出 |
0x00C-0x00F | 3 | 斷點指令 |
0x008-0x00B | 2 | 非禁止中斷 |
0x004-0x007 | 1 | 單步(用於DEBUG) |
0x000-0x003 | 0 | 除以零 |
中斷向量地址和中斷向量
中斷向量:中斷服務程式的入口地址
中斷向量地址:記憶體中存放中斷服務程式入口地址的地址