在 Intel 80386 處理器的保護模式下,中斷與異常的處理方式與實模式截然不同。實模式沿用 8086 的中斷向量表(IVT),而保護模式引入了功能更強大、支援特權檢查的中斷描述符表(IDT)。本文將系統性地剖析 80386 在保護模式下響應中斷、處理異常的完整流程,包括 IDT 結構、各類門描述符的角色、特權級轉移規則、任務門機制以及中斷返回的細節。
IDT 是保護模式下中斷/異常處理的核心數據結構。系統中僅存在一張 IDT,其基址與界限存放於 IDTR 寄存器中。處理器依據中斷向量號(0~255)作為索引,每個描述符佔 8 位元組,因此 IDT 最大長度為 2 KB。IDT 僅能包含三類門描述符:
門描述符內含 48 位元完整指標(16 位選擇子 + 32 位偏移),指向處理程序的代碼段入口。雙字計數字段對這三類門無意義。
異常處理額外步驟:確定返回點、構造錯誤碼(若適用)、將錯誤碼以 32 位值壓入堆疊(保證雙字對齊)。
此路徑將控制權轉移給當前任務內的處理程序,允許特權級提升(CPL → 更高優先級的數值更小的級別)。硬體自動執行以下序列:
堆疊佈局差異:特權級是否改變、是否有錯誤碼,形成四種堆疊幀;外層堆疊指標(SS:ESP)僅在特權級提升時壓入內層堆疊。
任務門選擇子指向 GDT 中的可用 TSS 描述符(286/386 TSS)。切換流程類似 CALL 指令經任務門呼叫,差異在於:
任務門提供硬體級的自動任務調度,繞過作業系統軟體排程器,實現快速隔離的處理程序環境。
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 中斷/陷阱門(同任務) | 延遲極低、可直接訪問當前任務狀態 | 處理程序需自行保存/恢復寄存器;每任務需包含處理程序 | 高頻、低延遲中斷(時鍵、鍵盤);共享異常處理程序(除零、頁面錯誤) |
| 任務門(獨立任務) | 完整隔離、自動保存上下文、適合錯誤碼異常(如無效 TSS) | 切換開銷大、訪問原任務狀態複雜 | 頁面錯誤、雙重錯誤、無效 TSS 等需獨立環境的異常 |
關鍵約束:處理程序特權級必須 ≥ 當前任務最高特權級代碼段的 DPL。中斷處理程序通常置於特權級 0;任務門除外(可從任意級切換)。
IRET 依 EFLAGS.NT 位分兩種路徑:
帶錯誤碼的異常處理程序,必須手動彈出錯誤碼後再執行 IRET,處理器不自動移除。
80386 的中斷/異常架構以 IDT 為核心,靈活結合中斷門、陷阱門、任務門,在效率、隔離性與特權保護之間取得平衡。理解其硬體自動化流程、堆疊佈局變化與特權檢查規則,是編寫穩健作業系統核心、裝置驅動程式與底層系統軟體的基石。