80386 保護模式的核心在於分段管理機制。本文系統闡述段定義參數、描述符結構、GDT/LDT 組織、選擇子格式、描述符快取寄存器,以及虛擬地址到線性地址的完整轉換流程。
每個段由三參數定義:
G 決定單位:
G=0:位元組粒度,1B~1MBG=1:4KB 頁粒度,4KB~4GB,實際界限 LIMIT = (Limit << 12) + 0FFFH地址轉換:線性地址 = 基地址 + 段內偏移。偏移必須在有效範圍內,否則觸發異常 (GP/SS)。
擴展方向 (ED):
ED=0 (向上擴展):偏移 0~Limit 有效,基地址→基地址+LimitED=1 (向下擴展,堆疊段):**偏移 Limit+1 ~ 最大值有效**,基地址為高端,向低位擴展Byte 7 6 5 4 3 2 1 0
+-------+---+---+---+---+---+---+---+
| Base31-24 | G | D | 0 |AVL|Lim19-16| P | DPL |1| TYPE | Base23-16 | Base15-0 | Lim15-0 |
+-------+---+---+---+---+---+---+---+
關鍵欄位:
| 欄位 | 位置 | 說明 |
|---|---|---|
| Base | 0-15, 16-23, 24-31 | 32-bit 基地址,分三段存放 |
| Limit | 0-15, 16-19 | 20-bit 界限,分兩段存放 |
| P | Byte 5, bit 7 | 存在位:1=在記憶體, 0=不在 (觸發 #NP) |
| DPL | Byte 5, bit 5-6 | 描述符特權級 (0-3) |
| DT (S) | Byte 5, bit 4 | 1=儲存段描述符 (代碼/資料), 0=系統段/門 |
| TYPE | Byte 5, bit 0-3 | 段具體屬性 (見下表) |
| G | Byte 6, bit 7 | 界限粒度 |
| D | Byte 6, bit 6 | 預設大小:代碼段=32/16-bit;堆疊段=ESP/SP;向下擴展段上界 4GB/64KB |
| AVL | Byte 6, bit 4 | 軟體可用位,處理器忽略 |
| 資料段 (E=0) | 代碼段 (E=1) | ||
|---|---|---|---|
| 值 | 屬性 | 值 | 屬性 |
| 0 | 唯讀 | 8 | 唯執行 |
| 1 | 唯讀, 已存取 | 9 | 唯執行, 已存取 |
| 2 | 讀/寫 | A | 執行/讀 |
| 3 | 讀/寫, 已存取 | B | 執行/讀, 已存取 |
| 4 | 唯讀, 向下擴展 | C | 唯執行, 一致碼段 |
| 5 | 唯讀, 向下擴展, 已存取 | D | 唯執行, 一致, 已存取 |
| 6 | 讀/寫, 向下擴展 | E | 執行/讀, 一致 |
| 7 | 讀/寫, 向下擴展, 已存取 | F | 執行/讀, 一致, 已存取 |
已存取位 (A, TYPE bit 0):處理器載入選擇子到段寄存器時自動置 1,OS 可掃描判斷段使用情況。
一致碼段 (C, TYPE bit 2):允許低特權程式以當前 CPL 執行高特權代碼 (不改變 CPL),用於共用庫。
每表最多 8192 條描述符 (13-bit 索引 × 8 bytes = 64KB)。虛擬空間 = 4GB × 8192 × 2 (GDT+LDT) = 64TB。
15 3 2 1 0
+----------------------+-+-+-+
| Index (13) |T|RPL|
+----------------------+-+-+-+
空選擇子:Index=0, TI=0, RPL=任意。載入資料段寄存器不報錯,但後續存取觸發 #GP。GDT[0] 永遠不被使用,通常全 0。
每個段寄存器 (CS/SS/DS/ES/FS/GS) 內建不可見快取,載入選擇子時自動從描述符表讀取描述符資訊 (基地址、界限、屬性) 存入快取。後續存取直接用快取,**不再查表**。
快取內容:32-bit 基地址、32-bit 界限 (已按 G 展開)、P、DPL、A、G、ED、R、W、X、D/B (堆疊大小)、C (一致)。
關鍵含義:修改記憶體中描述符後,**必須重新載入段寄存器** 更新快取,否則舊屬性繼續生效。
Selector:Offset此機制提供了硬體層面的記憶體保護、特權隔離、虛擬記憶體基礎,是現代作業系統核心架構的基石。