事實上,在GDT中存放的不僅僅是段描述符,還有其它描述符(百度百科)。
一,段描述符的結構
描述符中指定了32位的起始地址和20位的段邊界,
實模式下,段地址要左移4位,
32位保護模式下,段地址是32位的線性地址,如果未開啟分頁功能,該線性地址就是物理地址。
其他位的作用
G | 粒度位, | G位為0時,段界限以字節為單位,段的擴展范圍1B~1MB; G位為1時,段界限以4KB為單位,段的擴展范圍4KB~4GB. |
S | 指定描述符的類型 | S位為0時,表示系統段; S位為1時,表示代碼段或數據段,棧段也是特殊的數據段。 |
DPL | 特權級別 | 共有4種處理器支持的特權級別,0,1,2,3; 0是最高級別,3是最低級別; 描述符的特權級用於指定訪問該段所必須的最低特權級別,如果這里的數值為2,那么只有特權級別為0,1,2的程序才能訪問該段,特權級別為3的程序訪問該段時,將會被阻止。 |
P | 段存在位 | |
D/B | 默認的操作數大小 | |
L | 64位代碼段標志 | 保留此位留給64位處理器使用 |
TYPE | 指示描述符的子類型,或者說是類別 | 對於數據段,這4位分別是X,E,W,A; 對於代碼段,這4位分別是X,C,R,A; |
AVL | 軟件可以使用的位 | 操作系統來用,處理器並不使用它 |
二,幾個重要標志位的的作用
(一)DB位
(1)對CS段的影響:
D=1時,采用32位尋址方式;
D=0時,采用16位尋址方式;
前綴67改變尋址方式;
(2)對SS段的影響:
D=1時,隱式堆棧訪問指令(如:PUSH,POP,CALL)使用32位堆棧指針寄存器ESP
D=0時,隱式堆棧訪問指令(如:PUSH,POP,CALL)使用16位堆棧指針寄存器SP
(3)向下擴展的數據段:
D=1時,段上限位4GB;
D=0時,段上限位64KB;
(二)TYPE位
(三)快速從描述符表中判斷一個描述符是代碼段還是數據段
(1)結合段描述符高4字節的15,14,13,12這4個位先判斷是系統段還是數據代碼段
15號位,P=1,有效;P=0,無效;
14,13號位,權限位,Windows環境只有兩種權限,0和3,所以這兩位的數字要么全為0,要么全為1;
再結合12號位;
這4個位合在一起,在段描述符中對應的數字位F(權限位11)或9(權限位00)時,該描述符一定是數據段或代碼段;
(2)再結合TYPE的最高位11位
TYPE最高位為1,表示代碼段,此時,TYPE的4個位合起來的數值表示成十六進制一定不小於8;
TYPE最高位為0,表示數據段,此時,TYPE的4個位合起來的數值表示成十六進制一定不大於8;