GDT全局描述符表
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全局描述符表