80386 引入的保護模式架構,核心在於四組 32 位元控制暫存器 (CR0-CR3) 與四組系統位址暫存器 (GDTR, IDTR, LDTR, TR)。它們共同管控:模式切換、分頁機制、協處理器協調、描述符表定位、任務切換。本文完整解析每個暫存器的位定義、功能、程式設計介面與實務操作指南。
| 暫存器 | 位範圍 | 關鍵位 | 主要功能 |
|---|---|---|---|
CR0 | 31..0 | PG(31), ET(4), TS(3), EM(2), MP(1), PE(0) | 模式控制、分頁啟用、協處理器管理 |
CR1 | - | 保留 | 未來擴充,80386 讀寫觸發 #UD |
CR2 | 31..0 | Page Fault Linear Address | 頁錯誤線性位址紀錄 |
CR3 | 31..12 | Page Directory Base (PDBR) | 頁目錄表物理基址 (低 12 位保留=0) |
CR0:
31 30-5 4 3 2 1 0
PG 0...0 ET TS EM MP PE
0=Real Mode, 1=Protected Mode。啟用分段保護機制。0=Disable Paging, 1=Enable Paging。啟用分頁機制 (線性位址→物理位址轉換)。| PG | PE | 模式 |
| 0 | 0 | Real Mode |
| 0 | 1 | Protected Mode, 無分頁 |
| 1 | 0 | 非法 → #GP |
| 1 | 1 | Protected Mode + Paging |
1 = 系統有數學協處理器 (80387)。影響 WAIT 指令行為。1 = 無協處理器,浮點指令觸發 #NM (Device Not Available) 由軟體模擬處理;0 = 硬體執行。TS=1 時,浮點指令觸發 #NM,讓 OS 決定是否儲存/恢復協處理器狀態 (Lazy Save/Restore)。1=80387, 0=80287 或無。指示協處理器介面類型。WAIT:若 MP=1 且 TS=1 → #NM;MP=0 → 忽略 TS。EM=1 → #NM;EM=0 且 TS=1 → #NM (Lazy context switch)。CR2。CR2 判斷缺頁位址,決定:配置實體頁面、載入換頁檔、存取違例終止程序等。每個暫存器包含 可見部分 (程式設計師可讀寫) 與 隱藏快取部分 (處理器自動載入描述符內容)。
GDTR (48-bit):
31-0: Base Linear Address (GDT 線性基址)
15-0: Limit (界限, 位元組為單位)
LGDT [mem] 載入,SGDT [mem] 存回。8*N - 1 (N = 描述符數)。7FFh。LIDT / SIDT 載入/存回。LLDT selector → 選擇子必指向 GDT 中 Type=LDT 的系統段描述符 (TI=0)。
; 讀取 CR0
mov eax, cr0
; 寫入 CR0 (啟用保護模式)
mov eax, cr0
or eax, 1
mov cr0, eax
; 讀取 CR2 (頁錯誤處理常式)
mov eax, cr2
; 設定 CR3 (切換頁目錄)
mov cr3, eax ; EAX = 新頁目錄物理基址 (低 12 位=0)
; 系統位址暫存器需用特定指令
lgdt fword ptr [gdtr_ptr] ; GDTR
lidt fword ptr [idtr_ptr] ; IDTR
lldt ax ; LDTR (AX=selector)
ltr ax ; TR (AX=selector)
sgdt fword ptr [gdtr_ptr] ; 存回
sidt fword ptr [idtr_ptr]
sldt ax ; LDTR → AX
str ax ; TR → AX
PDESC STRUC
LIMIT DW 0
BASE DD 0
PDESC ENDS
; 使用範例
gdtr_ptr PDESC
lgdt fword ptr [gdtr_ptr]
| 操作 | 關鍵點 |
|---|---|
| 啟用保護模式 | 1. 建立 GDT/IDT 2. LGDT/LIDT 3. CR0.PE=1 4. 遠跳轉清空管線 (JMP FAR) |
| 啟用分頁 | 1. 建立頁目錄/頁表 (Identity Mapping 含目前代碼) 2. CR3=頁目錄基址 3. CR0.PG=1 |
| 任務切換 | 使用 TSS + TR + JMP/CALL FAR 到 TSS 選擇子,或軟體模擬 (現代 OS 多用軟體切換) |
| CR3 寫入 | 必須確保新頁目錄已建立且包含當前執行代碼映射,否則立即 Triple Fault |
| TLB 管理 | INVLPG (單頁失效)、寫 CR3 (全域失效)、PCID (Process Context ID, 後續架構) |
控制暫存器 (CR0-CR3) 與系統位址暫存器 (GDTR/IDTR/LDTR/TR) 是 x86 保護模式與分頁機制的指揮中樞。CR0 掌管模式與協處理器,CR2/CR3 服務分頁,四大系統暫存器定位描述符表與任務狀態。深入理解其位定義、交互約束、載入指令與副作用 (TLB 刷新、任務切換行為),是作業系統核心開發、Hypervisor 編寫、裝置驅動程式調試的必修內功。