跳轉到內容

x86 彙編/全域性描述符表

來自 Wikibooks,開放書籍,開放世界

全域性描述符表 (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 的指標。

華夏公益教科書