1. 程式人生 > >GDT全局描述符表

GDT全局描述符表

位操作 不能 glob 全局 建立 數據加載 ... 內存地址 信息

GDT全局描述符表

什麽是GDT全局描述符表

GDT全稱為Global Descriptor Table,全局描述符表。

保護模式的尋址方式不在使用寄存器分段的方式直接尋址方式了。而采用的是使用GDT(全局分段描述表)來尋址。從而使用更多的內存地址。

創建GDT全局描述符表使用到一個48位的寄存器:GDTR寄存器。

1)首先,在內存中劃分一些內存段,並且每個內存段賦予一個索引。

2)然後,使用lgdt指令,設置GDT的索引和表信息的內存地址到GDTR寄存器。

3)進入保護模式,指令跳轉,從實模式分段方式尋址切換到使用GDT分段方式尋址。

4) GDT可以被放在內存的任何地方,只要提供內存地址給GDTR寄存器就可以了。

GDT格式

GDT全局描述符表

  • 表基地址,表基地址位GDT段表在內存的地址,GDT段表是一個列表,存儲了多個 GDT段描述符。
  • 表界限:GDT段表的空間信息,以字節為單位。

技術分享圖片

GDT全局描述符表 = GDT段表基地址 | 16位表界限

GDT段表 =  GDT段描述符 |  GDT段描述符 | GDT段描述符 ...

表界限 = GDT字節數 - 1 (表示 0 - 0x...)

GDT段描述符

技術分享圖片

GDT段描述符,用來描述在GDT方式在內存中分配的一個段信息,總共8字節64位。

GDT段描述符結構

為了兼容以前的CPU,GDT段描述符的信息被分割成幾個部分,格式如下:

GDT段描述符 = 

段基址 (8位)| 段描述符(4位) | 段界限(4位) | 段描述符(8位) 段基址 (8位)

段基址 (16位) | 段界限(16位)

段描述符定義

  • 段基址:規定段的起始地址,長度32位.
  • 段界限:規定段的大小,長度20位。段界限可以是以4KB或者1B為單元大小
  • 段屬性:確定段的各種性質.長度(12位)

段屬性:

  • G 粒度位: 段界限的單位大小,G=1表示段界限以4KB為單元單位,G=0表示段界限以1B為單元單位
  • D/B 表示操作數為多少位, 0表示16位操作數,1表示32位操作數
  • L : 0 表示非64位代碼段,1表示64位代碼段
  • AVL :可用字段,暫時沒什麽用
  • P 段存在位:通常為1,表示段存在於內存中,0則此段為非法的,不能被用來實現地址轉換
  • DPL 特權級(2位): 用來實現保護機制
  • S 為0表示系統段,為1表示非系統段
  • type 類型(4位): 用於區別不同類型的描述符。內存段或者門的子類型

type值

Type位 說明 取值
代碼段時
X:3位 代碼段值為1 0:為數據段
1:為代碼段
C:2位 訪問位 0:為普通段
1:為一致碼段
R:1位 是否可讀 0:只執行
1:可讀
A:0位 訪問位. 該段是否被訪問過 0 :未訪問
1:已訪問
數據段時
X:3位 數據段值為1 0:為數據段
1:為代碼段
E:2位 擴展方向 0:向高位擴展
1:向低位擴展
W:1位 是否可寫 0:只讀
1:可寫
A:0位 訪問位 0: 未訪問
1:已訪問

段界限:

段界限邊界值 = (描述符的段界限值 + 1) × (段界限顆粒讀:4Kb 或者 1b) -1

反之:
描述符的段界限值 = (段界限邊界值 + 1) /(段界限顆粒讀:4Kb 或者 1b)

例如:

16MB的段界限值 = 0x1000000 /(段界限顆粒讀:4Kb 或者 1b - 1)= 0x0fff

段選擇子

段選擇子包括三部分:描述符索引(index)、TI、請求特權級(RPL)

GDTR寄存器

在內存中建立完成GDT信息後,CPU會將GDT的內存地址 和 段界限 數據加載入GDTR寄存器

GDTR寄存器數據(48位):

GDTR定義數據(48位) = GDT全局描述符表的大小(16位) + GDT全局描述符表的地址(32位)

lgdt指令

lgdt GDTR定義數據

其中GDT全局描述符表數據格式如下

GDT全局描述符表 = GDT段描述符(64位) | GDT段描述符(64位) | GDT段描述符(64位) ...

GDT段描述符 = 段基址 (8位)| 段描述符(4位) | 段界限(4位) | 段描述符(8位) | 段基址 (8位) | 段基址 (16位) | 段界限(16位)

其中,第一個GDT段的數據為空。

GDT全局描述符表