本文為組合語言保護模式教程系列第三部分,聚焦任務切換、調用門機制、特權級變換中的參數傳遞與別名技術,附完整實例程式(ASM5.ASM)演示兩任務切換與任務內特權級轉換。
邏輯功能:任務切換後顯示原任務掛起點 (EIP) 值。
涉及兩任務:
CR0.PE=1)LTR)DemoBeginJMP FAR Selector:Offset 中 Selector 指向可用 TSS 描述符。處理器:
CR0.TS=1(協處理器上下文切換標誌)關鍵差異:任務切換時 SS:ESP 直接從 TSS 載入,不使用內層堆疊保存區,這與調用門特權轉換不同。
任務門在 IDT/GDT/LDT 中,Selector 指向 TSS 描述符。JMP/CALL 指向任務門時,偏移被忽略。特權檢查:CPL ≤ 任務門 DPL,RPL ≤ 任務門 DPL。不檢查目標 TSS DPL。
演示任務 (CPL=2) CALL 調用門 ToSubR (DPL=3) → 目標代碼段 DPL=0 → 發生 2→0 特權轉換。調用門 DCount=2 指定複製 2 個雙字參數從 2 級堆疊到 0 級堆疊。內層堆疊建立流程:
返回時 RET 8 同時清理內外層堆疊參數。
DemoLDTD (系統段描述符) 描述 LDT 供 LLDT 載入;LDT 中 ToDLDT (資料段描述符) 描述同一 LDT 區域,供程式以資料段方式存取調用門結構修改 DCount。ToTTSS 描述臨時任務 TSS 為資料段,演示任務切換前修改臨時任務 TSS 中的段暫存器映射,實現切換後自動載入規範資料段選擇子。| 觸發方式 | 鏈結/解鏈 | NT 標誌 | 原任務狀態 | 目標任務狀態 |
|---|---|---|---|---|
| JMP 任務切換 | 無 | 不變 | 可用 | 忙 |
| CALL 任務切換 | 鏈結 | 置 1 | 忙 | 忙 |
| 中斷/異常任務切換 | 鏈結 | 置 1 | 忙 | 忙 |
| IRET 任務切換 | 解鏈 | 清 0 | 可用 | 忙 |
任務切換不可遞歸。
程式包含:GDT 段、演示任務 LDT 段(含堆疊/代碼/資料/調用門/任務門描述符)、演示任務 TSS(初始化 CPL=2 入口)、0/2 級堆疊段、資料段、子程序代碼段 (SubRB, 0 級)、演示代碼段 (2 級)、臨時任務 TSS/代碼段、實模式啟動/結束段。初始化流程:InitGDT → InitLDT → 載入 GDTR → 進入保護模式 → 臨時任務載入 TR → JMP 演示任務 TSS。
此實例完整展示了 x86 保護模式下最核心的控制轉移機制:
是理解作業系統核心調度、上下文切換、保護機制的最佳教材級範例。