全局描述符表

全局描述符表 (GDT) 是一個從 Intel x86-系列處理器 80286 開始用於界定不同內存區域的特徵的數據結構。 全局描述表位於內存中。全局描述表的條目描述及規定了不同內存分區的各種特徵,包括基地址、大小和訪問等特權如可執行和可寫等。 在 Intel 的術語中,這些內存區域被稱為  。

全局描述表用於內存地址的轉換。所有程序的內存訪問都需要用到GDT中的有關內存區域即x86內存分段的信息。訪問GDT需要使用segment selector和segment offset。處理器使用segment selector為索引查找GDT的條目。當適當的條目找到後,處理器將會做一系列的檢查,包括檢查segment offset嘗試訪問區間是否在此內存分段內,代碼是否有權限訪問此內存分段(檢查分級保護域權限)等。[1]

為了加速全局描述表的訪問,往segment寄存器里載入segment的值會使得GDT的特定條目被讀入處理器內部的緩存中。之後的內存訪問將會通過緩存進行處理。

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

參考文獻 編輯

  1. ^ GDT Tutorial - OSDev Wiki. wiki.osdev.org. [2019-08-12]. (原始內容存檔於2019-08-12).