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

保護模式控制轉移進階:任務切換、調用門與特權級變換實戰

     編輯:組合語言

本文為組合語言保護模式教程系列第三部分,聚焦任務切換、調用門機制、特權級變換中的參數傳遞與別名技術,附完整實例程式(ASM5.ASM)演示兩任務切換與任務內特權級轉換。

實例五:任務切換與特權級變換綜合演示

邏輯功能:任務切換後顯示原任務掛起點 (EIP) 值。

涉及兩任務:

  • 臨時任務:特權級 0,16-bit 代碼,負責初始化、模式切換、最終返回實模式
  • 演示任務:特權級 2,32-bit 代碼,擁有獨立 LDT、TSS、多級堆疊,演示調用門跨特權調用與參數複製

核心實現步驟

  1. 實模式初始化 GDT、LDT、TSS、IDT(本例無 IDT)
  2. 切換保護模式(CR0.PE=1)
  3. 載入 TR 指向臨時任務 TSS(LTR)
  4. JMP 直接切換到演示任務 TSS → CPL=2,進入演示代碼 DemoBegin
  5. 演示任務壓入參數,CALL 經調用門呼叫 0 級子程序 SubRB → 自動切換 0 級堆疊、複製 2 個雙字參數
  6. 子程序處理參數(顯示原任務 EIP),RET 返回 2 級代碼 → 自動清理參數、恢復 2 級堆疊
  7. 修改臨時任務 TSS 中段暫存器映射為規範資料段
  8. JMP 經任務門切換回臨時任務 → 恢復臨時任務現場
  9. 臨時任務清理、切換回實模式

關鍵技術深度解析

1. 直接通過 TSS 任務切換

JMP FAR Selector:Offset 中 Selector 指向可用 TSS 描述符。處理器:

  1. 檢查目標 TSS 界限 ≥ 103
  2. 保存當前任務現場到當前 TSS(通用暫存器、段暫存器、EIP、EFLAGS,不含 LDTR/CR3)
  3. 載入目標 TSS Selector 到 TR,更新 TR 快取
  4. 從目標 TSS 恢復現場(含 CR3、LDTR)
  5. 處理鏈結:JMP 不鏈結,原任務標「可用」,目標標「忙」
  6. 設 CR0.TS=1(協處理器上下文切換標誌)
  7. 載入 CS/SS/DS/ES/FS/GS 及快取

關鍵差異:任務切換時 SS:ESP 直接從 TSS 載入,不使用內層堆疊保存區,這與調用門特權轉換不同。

2. 通過任務門任務切換

任務門在 IDT/GDT/LDT 中,Selector 指向 TSS 描述符。JMP/CALL 指向任務門時,偏移被忽略。特權檢查:CPL ≤ 任務門 DPL,RPL ≤ 任務門 DPL。不檢查目標 TSS DPL。

3. 調用門實現特權級變換與參數複製

演示任務 (CPL=2) CALL 調用門 ToSubR (DPL=3) → 目標代碼段 DPL=0 → 發生 2→0 特權轉換。調用門 DCount=2 指定複製 2 個雙字參數從 2 級堆疊到 0 級堆疊。內層堆疊建立流程:

  1. 從 TSS 讀取 0 級 SS:ESP,建立空堆疊
  2. 壓入外層 SS:ESP(用於返回恢復)
  3. 複製 DCount 指定數量的雙字參數
  4. 壓入返回地址 (CS:EIP)

返回時 RET 8 同時清理內外層堆疊參數。

4. 別名技術應用

  • LDT 別名:GDT 中 DemoLDTD (系統段描述符) 描述 LDT 供 LLDT 載入;LDT 中 ToDLDT (資料段描述符) 描述同一 LDT 區域,供程式以資料段方式存取調用門結構修改 DCount。
  • TSS 別名:LDT 中 ToTTSS 描述臨時任務 TSS 為資料段,演示任務切換前修改臨時任務 TSS 中的段暫存器映射,實現切換後自動載入規範資料段選擇子。

5. 任務嵌套與鏈結規則

觸發方式鏈結/解鏈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 保護模式下最核心的控制轉移機制:

  • 任務切換(TSS 直跳 / 任務門)
  • 調用門跨特權調用與自動參數複製
  • 任務狀態保存/恢復 (TSS/TR)
  • 別名技術突破描述符類型限制
  • 任務嵌套與 NT 標誌管理

是理解作業系統核心調度、上下文切換、保護機制的最佳教材級範例。

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