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

80386 保護模式全景解析:記憶體管理、虛擬記憶體與多重任務保護機制

     編輯:組合語言

前言:為何需要保護模式?

80386 擁有實模式、保護模式、虛擬 8086 模式三種工作模式。唯有保護模式才能釋放 32 位元架構的全部潛能:32 條位址線支援 4 GB 物理記憶體;分段與分頁機制提供硬體級記憶體保護、共享與虛擬記憶體支援;四級特權環(Ring 0~3)實現核心與應用、任務間的嚴格隔離;內建任務切換硬體加速多任務調度。本文系統梳理 80386 保護模式的核心子系統。

一、記憶體管理單元(MMU)與兩級位址轉換

1. 位址空間層級

  • 虛擬地址空間:程式員視角,由「選擇子:偏移」組成的二維地址,總容量 64 TB(16,384 段 × 4 GB)。
  • 線性地址空間:分段機制輸出的一維 32 位地址,4 GB,與物理地址空間一一對應(未啟用分頁時)。
  • 物理地址空間:實際記憶體匯流排地址,4 GB 上限。

2. 兩階段轉換流程

  1. 分段轉換(必選):選擇子 → GDT/LDT 描述符 → 基址 + 偏移 = 線性地址。段描述符記錄基址、界限、屬性(DPL、類型、P 位等)。
  2. 分頁轉換(可選):線性地址 → 頁目錄 → 頁表 → 物理頁框。啟用 CR0.PG=1 後生效。頁大小固定 4 KB,支援「存在/不存在」位實現虛擬記憶體換頁。

兩機制相互獨立:段表存放於線性空間(可被分頁重定位),頁表存放於物理空間。分段擅長邏輯模組隔離與保護;分頁擅長物理記憶體框架管理與虛擬記憶體實現。

二、虛擬記憶體硬體支援

虛擬記憶體讓程式「以為」擁有遠超物理 RAM 的空間。MMU 以兩種方式協作:

  1. 需求分頁:頁表項 P=0 標記非駐留頁;存取時觸發頁面錯誤(PF,向量 14),OS 從磁碟讀入頁框、更新頁表、重新執行故障指令。
  2. 存取/髒位統計:處理器自動置位 A/D 旗標,OS 掃描統計以實現 LRU/Clock 等換頁演算法,決定犧牲哪些頁框。

三、多層次保護機制

1. 任務隔離(虛擬地址空間分離)

  • 每任務擁有獨立 LDT、頁目錄(CR3),任務切換時自動切換映射函數。
  • 全局地址空間:GDT 映射的區域,所有任務共享相同虛擬→物理映射(如核心代碼、共享庫)。
  • 局部地址空間:LDT 映射區域,任務私有,相同虛擬地址映射至不同物理頁框,實現隔離。

2. 特權級保護(Ring 0~3)

  • 數值越小特權越高:Ring 0(核心)、Ring 1/2(驅動/中介層)、Ring 3(應用)。術語用「內層/外層」避免大小混淆。
  • 資料段存取:只能訪問 DPL ≥ CPL 的段(同級或外層),嘗試訪問內層段觸發 GPF。
  • 代碼段轉移:呼叫門、中斷門、任務門受控轉移;一致代碼段(C-bit=1)允許外層直接呼叫內層而不提權。
  • 堆疊隔離:每級特權擁有獨立堆疊(TSS 存放 SS0~SS2:ESP),特權轉移自動切換堆疊,防止堆疊溢位攻擊。

3. 典型部署

Ring 0:核心核心(調度、中斷、記憶體管理);Ring 1/2:裝置驅動、檔案系統;Ring 3:用戶進程。Windows 9x 僅用 Ring 0/3 以便移植至雙特權級 RISC 架構。

四、任務管理與硬體切換

  • TSS(任務狀態段):保存任務完整上下文(通用暫存器、段暫存器、EIP、EFLAGS、CR3、LDTR、I/O 許可位圖、前任務鏈接)。
  • 切換觸發:JMP/CALL 任務門或 TSS 描述符、IRET(NT=1)、中斷/異常經任務門。
  • 切換流程:保存當前狀態至舊 TSS → 載入新 TSS 選擇子至 TR → 從新 TSS 恢復暫存器 → 載入 CR3/LDTR 更新地址映射。
  • 忙/可用位:防止重入同一任務;嵌套任務鏈由 TSS 鏈接字段與 EFLAGS.NT 維護。

五、I/O 權限位圖與精細 I/O 保護

TSS 擴展區可包含 8 KB I/O 許可位圖(每埠 1 位),CPL=3 任務執行 IN/OUT 時,處理器檢查對應位;位=1 觸發 GPF,實現逐埠授權,無需完全攔截 I/O 指令。

結語

80386 保護模式以分段、分頁、四級特權、硬體任務切換、I/O 位圖五大支柱,為現代作業系統(Linux、Windows NT 族、BSD 等)提供了堅實的硬體信任基石。理解這些機制的交互細節,是系統程式開發者、安全研究者與嵌入式工程師的必修課。

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