GDT(Global Descriptor Table)全局描述符表


 

  在IA32下,CPU有兩種工作方式:實模式和保護模式。當我們按下開機按鈕以后,CPU是工作在實模式下的,經過某種機制以后才進入保護模式。

 

  Intel 8086是16為的CPU,有16為的寄存器、16位的數據總線以及20位的地址總線,因此它有1M的尋址空間,一個地址是又段和偏移兩部分組成的,物理地址計算方法是:

 

 

      Physical Address = (Segment) * 16 + Offset  (Statement:  Segment和Offset都是16位的)

 

  從80386開始,Intel進入了32位的時代。80386有32位地址線,尋址空間達到4G。這個時候保護模式出現了,保護模式並沒有拋棄實模式下Seg:Offset這樣的尋址方式,只是對Seg的解釋發生了變化。實模式下段值可以看作是地址的一部分,而保護模式下,段寄存器還是原來的16位,但它僅僅只是一個索引,它指向一個數據結構的一個表項,這個數據結構就是大名鼎鼎的GDT,GDT定義了段的起始地址、界限和屬性。

 

 

 

  簡而言之,GDT的作用是用來提供段式存儲機制,這種機制是通過寄存器和GDT中的描述符共同提供的。下面詳細分析GDT的結構。

 

  GDT中的一個描述符一共有8個字節組成:

  

  

; 說明:
;
; (1) P: 存在(Present)位。
; P=1 表示描述符對地址轉換是有效的,或者說該描述符所描述的段存在,即在內存中;
; P=0 表示描述符對地址轉換無效,即該段不存在。使用該描述符進行內存訪問時會引起異常。
;
; (2) DPL: 表示描述符特權級(Descriptor Privilege level),共2位。它規定了所描述段的特權級,用於特權檢查,以決定對該段能否訪問。
;
; (3) S: 說明描述符的類型。
; 對於存儲段描述符而言,S=1,以區別與系統段描述符和門描述符(S=0)。
;
; (4) TYPE: 說明存儲段描述符所描述的存儲段的具體屬性。
;
;
; 數據段類型 類型值 說明
; ----------------------------------
; 0 只讀
; 1 只讀、已訪問
; 2 讀/寫
; 3 讀/寫、已訪問
; 4 只讀、向下擴展
; 5 只讀、向下擴展、已訪問
; 6 讀/寫、向下擴展
; 7 讀/寫、向下擴展、已訪問
;
;
; 類型值 說明
; 代碼段類型 ----------------------------------
; 8 只執行
; 9 只執行、已訪問
; A 執行/讀
; B 執行/讀、已訪問
; C 只執行、一致碼段
; D 只執行、一致碼段、已訪問
; E 執行/讀、一致碼段
; F 執行/讀、一致碼段、已訪問
;
;
; 系統段類型 類型編碼 說明
; ----------------------------------
; 0 <未定義>
; 1 可用286TSS
; 2 LDT
; 3 忙的286TSS
; 4 286調用門
; 5 任務門
; 6 286中斷門
; 7 286陷阱門
; 8 未定義
; 9 可用386TSS
; A <未定義>
; B 忙的386TSS
; C 386調用門
; D <未定義>
; E 386中斷門
; F 386陷阱門
;
; (5) G: 段界限粒度(Granularity)位。
; G=0 表示界限粒度為字節;
; G=1 表示界限粒度為4K 字節。
; 注意,界限粒度只對段界限有效,對段基地址無效,段基地址總是以字節為單位。
;
; (6) D: D位是一個很特殊的位,在描述可執行段、向下擴展數據段或由SS寄存器尋址的段(通常是堆棧段)的三種描述符中的意義各不相同。
; ⑴ 在描述可執行段的描述符中,D位決定了指令使用的地址及操作數所默認的大小。
; ① D=1表示默認情況下指令使用32位地址及32位或8位操作數,這樣的代碼段也稱為32位代碼段;
; ② D=0 表示默認情況下,使用16位地址及16位或8位操作數,這樣的代碼段也稱為16位代碼段,它與80286兼容。可以使用地址大小前綴和操作數大小前綴分別改變默認的地址或操作數的大小。
; ⑵ 在向下擴展數據段的描述符中,D位決定段的上部邊界。
; ① D=1表示段的上部界限為4G;
; ② D=0表示段的上部界限為64K,這是為了與80286兼容。
; ⑶ 在描述由SS寄存器尋址的段描述符中,D位決定隱式的堆棧訪問指令(如PUSH和POP指令)使用何種堆棧指針寄存器。
; ① D=1表示使用32位堆棧指針寄存器ESP;
; ② D=0表示使用16位堆棧指針寄存器SP,這與80286兼容。
;
; (7) AVL: 軟件可利用位。80386對該位的使用未左規定,Intel公司也保證今后開發生產的處理器只要與80386兼容,就不會對該位的使用做任何定義或規定。

 

  前面說過在保護模式下,Seg相當於一個索引,而這個索引就是選擇子(Selector),結構如下:

 

 

 

 

 

 

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM