x86 彙編/全域性描述符表
外觀
< X86 彙編
全域性描述符表 (GDT) 是記憶體中定義處理器記憶體段的表格。GDT 設定段暫存器的行為,並有助於確保保護模式順利執行。
GDT 由 x86 晶片中的一個特殊暫存器指向,即 GDT 暫存器,簡稱為 GDTR。GDTR 長度為 48 位。低 16 位指示 GDT 的大小,而高 32 位指示 GDT 在記憶體中的位置。以下是 GDTR 的佈局
|LIMIT|----BASE----|
LIMIT 是 GDT 的大小,而 BASE 是起始地址。LIMIT 比表格長度小 1,因此如果 LIMIT 的值為 15,則 GDT 長度為 16 位元組。
要載入 GDTR,使用 LGDT 指令
lgdt [gdtr]
其中 gdtr 是指向包含所需 GDTR 值的 6 位元組記憶體的指標。請注意,要完成載入新 GDT 的過程,需要重新載入段暫存器。必須使用遠跳轉來載入 CS 暫存器
flush_gdt:
lgdt [gdtr]
jmp 0x08:complete_flush
complete_flush:
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
ret
GDT 表包含許多稱為 段描述符 的條目。每個條目長度為 8 位元組,包含有關段的起始點、段的長度和段的訪問許可權的資訊。
以下 NASM 語法程式碼表示單個 GDT 條目
struc gdt_entry_struct limit_low: resb 2 base_low: resb 2 base_middle: resb 1 access: resb 1 granularity: resb 1 base_high: resb 1 endstruc
每個獨立程式將從作業系統接收多個用於的不同的記憶體段。每個本地記憶體段的特性都儲存在一個稱為 本地描述符表 (LDT) 的資料結構中。GDT 包含指向每個 LDT 的指標。