首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

深入解析 80386 保護模式下的中斷與異常轉移機制

     編輯:組合語言

前言

在 Intel 80386 處理器的保護模式下,中斷與異常的處理方式與實模式截然不同。實模式沿用 8086 的中斷向量表(IVT),而保護模式引入了功能更強大、支援特權檢查的中斷描述符表(IDT)。本文將系統性地剖析 80386 在保護模式下響應中斷、處理異常的完整流程,包括 IDT 結構、各類門描述符的角色、特權級轉移規則、任務門機制以及中斷返回的細節。

一、中斷描述符表(IDT)核心架構

IDT 是保護模式下中斷/異常處理的核心數據結構。系統中僅存在一張 IDT,其基址與界限存放於 IDTR 寄存器中。處理器依據中斷向量號(0~255)作為索引,每個描述符佔 8 位元組,因此 IDT 最大長度為 2 KB。IDT 僅能包含三類門描述符:

  • 中斷門:用於硬體中斷,進入處理程序時自動清除 IF 旗標,屏蔽可屏蔽中斷。
  • 陷阱門:用於異常與軟體中斷,不改變 IF 旗標。
  • 任務門:觸發硬體任務切換,進入獨立的任務執行處理程序。

門描述符內含 48 位元完整指標(16 位選擇子 + 32 位偏移),指向處理程序的代碼段入口。雙字計數字段對這三類門無意義。

二、中斷響應與異常處理的硬體自動化步驟

  1. 界限檢查:向量號 × 8 + 7 是否超出 IDT 界限,否則觸發通用保護故障(GPF),錯誤碼 = 向量號 × 8 + 2。
  2. 描述符取樣與屬性驗證:必須為任務門、286/386 中斷門、286/386 陷阱門之一,否則 GPF。
  3. 特權檢查(僅 INT n/INTO 指令):要求 CPL ≤ 門 DPL,防止用戶程式濫用硬體中斷向量。
  4. 段存在性檢查:門 P 位必須為 1,否則段不存在故障(NPF)。
  5. 依門類型分派:中斷/陷阱門 → 同任務內處理程序(可能改變 CPL);任務門 → 任務切換。

異常處理額外步驟:確定返回點、構造錯誤碼(若適用)、將錯誤碼以 32 位值壓入堆疊(保證雙字對齊)。

三、通過中斷門/陷阱門的轉移細節

此路徑將控制權轉移給當前任務內的處理程序,允許特權級提升(CPL → 更高優先級的數值更小的級別)。硬體自動執行以下序列:

  1. 檢查選擇子非空,否則 GPF(錯誤碼 0)。
  2. 讀取目標代碼段描述符,必須為可執行代碼段,否則 GPF(含選擇子)。
  3. 非一致代碼段且 DPL < CPL 時,切換至內層堆疊(從 TSS 取得 SS:ESP)。
  4. 將選擇子 RPL 強制置 0(內部調整),僅比較代碼段 DPL 與 CPL。
  5. 載入 CS 快取寄存器(含描述符屬性),執行類似呼叫門的載入檢查。
  6. 驗證入口偏移不超出段界限,否則 GPF(錯誤碼 0)。
  7. 依序壓入 EFLAGS、CS、EIP(各 4 位元組)。
  8. 清除 TF(禁止單步)、NT(標示非嵌套任務)。
  9. 中斷門額外清除 IF;陷阱門保持 IF 不變。
  10. 若有錯誤碼,壓入堆疊。
  11. 跳轉至處理程序入口。

堆疊佈局差異:特權級是否改變、是否有錯誤碼,形成四種堆疊幀;外層堆疊指標(SS:ESP)僅在特權級提升時壓入內層堆疊。

四、任務門與硬體任務切換

任務門選擇子指向 GDT 中的可用 TSS 描述符(286/386 TSS)。切換流程類似 CALL 指令經任務門呼叫,差異在於:

  • 異常錯誤碼在任務切換完成後,壓入新任務堆疊。
  • 不壓入返回地址與外層堆疊指標至新任務。
  • 新任務 TSS 的 NT 位置 1,IRET 時沿 TSS 鏈接字段返回前一任務。

任務門提供硬體級的自動任務調度,繞過作業系統軟體排程器,實現快速隔離的處理程序環境。

五、三種轉移方式的工程權衡

方式優點缺點適用場景
中斷/陷阱門(同任務)延遲極低、可直接訪問當前任務狀態處理程序需自行保存/恢復寄存器;每任務需包含處理程序高頻、低延遲中斷(時鍵、鍵盤);共享異常處理程序(除零、頁面錯誤)
任務門(獨立任務)完整隔離、自動保存上下文、適合錯誤碼異常(如無效 TSS)切換開銷大、訪問原任務狀態複雜頁面錯誤、雙重錯誤、無效 TSS 等需獨立環境的異常

關鍵約束:處理程序特權級必須 ≥ 當前任務最高特權級代碼段的 DPL。中斷處理程序通常置於特權級 0;任務門除外(可從任意級切換)。

六、中斷返回(IRET)機制

IRET 依 EFLAGS.NT 位分兩種路徑:

  • NT=1(嵌套任務):讀取當前 TSS 鏈接字段的前任務 TSS 選擇子,執行任務切換返回。發生於任務門進入的處理程序。
  • NT=0(同任務):彈出 EIP、CS、EFLAGS。若返回選擇子 RPL > CPL(外層),彈出外層 SS:ESP;若 RPL < CPL 則 GPF。CS 選擇子必須指向代碼段描述符。

帶錯誤碼的異常處理程序,必須手動彈出錯誤碼後再執行 IRET,處理器不自動移除。

結語

80386 的中斷/異常架構以 IDT 為核心,靈活結合中斷門、陷阱門、任務門,在效率、隔離性與特權保護之間取得平衡。理解其硬體自動化流程、堆疊佈局變化與特權檢查規則,是編寫穩健作業系統核心、裝置驅動程式與底層系統軟體的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved