全局描述符表
全局描述符表 (GDT) 是一個從 Intel x86-系列處理器 80286 開始用於界定不同內存區域的特徵的數據結構。 全局描述表位於內存中。全局描述表的條目描述及規定了不同內存分區的各種特徵,包括基地址、大小和訪問等特權如可執行和可寫等。 在 Intel 的術語中,這些內存區域被稱為 段 。
全局描述表用於內存地址的轉換。所有程序的內存訪問都需要用到GDT中的有關內存區域即x86內存分段的信息。訪問GDT需要使用segment selector和segment offset。處理器使用segment selector為索引查找GDT的條目。當適當的條目找到後,處理器將會做一系列的檢查,包括檢查segment offset嘗試訪問區間是否在此內存分段內,代碼是否有權限訪問此內存分段(檢查分級保護域權限)等。[1]
為了加速全局描述表的訪問,往segment寄存器里載入segment的值會使得GDT的特定條目被讀入處理器內部的緩存中。之後的內存訪問將會通過緩存進行處理。
GDT作用
編輯GDT的是提供內存保護。在80286之前的處理器中只有實模式,所有程序都可訪問任意內存。GDT是保護模式下限制非法內存訪問的一種方式。
GDT 結構
編輯GDT description structure
編輯GDT description structure描述了GDT的位置及大小(並非GDT的一部分)。儲存於GDTR 寄存器中。可通過LGDTR指令從內存中往GDTR中加載GDT description structure。
- Size: GDT的大小(bytes) - 1
- Offset: GDT的線性地址
GDT
編輯GDT實例
編輯gdt:
.long 0
.long 0
code_seg:
.long 0x0000FFFF
.long 0x00CF9A00
data_seg:
.long 0x0000FFFF
.long 0x00CF9200
gdt_ptr:
.short 0x100
.long gdt
參考文獻
編輯- ^ GDT Tutorial - OSDev Wiki. wiki.osdev.org. [2019-08-12]. (原始內容存檔於2019-08-12).