段描述符

段描述符

段描述符是GDT和LDT表中的一個數據結構項,用於向處理器提供有關一個段的位置和大小信息以及訪問控制的狀態信息。

段描述符是GDT和LDT表中的一個數據結構項,用於向處理器提供有關一個段的位置和大小信息以及訪問控制的狀態信息。每個段描述符的長度是8位元組,含有3個主要欄位:段基地址、段限長和段屬性。段描述符通常由編譯器、連結器、載入器或者作業系統來創建,但絕不是應用程式。圖4-13給出了所有類型段描述符的一般格式。 如圖一所示
一個段描述符中各欄位和標誌的含義如下:
圖一

(1)段限長欄位Limit(Segment limit field):用於指定段的長度。處理器會把段描述符中兩個段限長欄位組合成一個20位的值,並根據顆粒度標誌G來指定段限長Limit值的實際含義。如果G=0,則段長度Limit範圍可從1B~1MB,單位是1B;如果G=1,則段長度Limit範圍可從4KB~4GB,單位是4KB。
根據段類型中的段擴展方向標誌E,處理器以兩種不同方式使用段限長Limit。對於向上擴展的段(簡稱上擴段),邏輯地址中的偏移值範圍可以從0到段限長值Limit。大於段限長Limit的偏移值將產生一般保護性異常。對於向下擴展的段(簡稱下擴段),段限長Limit的含義相反。根據默認棧指針大小標誌B的設定,偏移值範圍可從段限長Limit到0xFFFFFFFF或0xFFFF。而小於段限長Limit的偏移值將產生一般保護性異常。對於下擴段,減小段限長欄位中的值會在該段地址空間底部分配新的記憶體,而不是在頂部分配。80x86的棧總是向下擴展的,因此這種實現方式很適合擴展堆疊。
(2)基地址欄位Base(base address field):該欄位定義在4GB線性地址空間中一個段位元組0所處的位置。處理器會把3個分立的基地址欄位組合形成一個32位的值。段基地址應該對齊16位元組邊界。雖然這不是要求的,但通過把程式的代碼和數據段對齊在16位元組邊界上,可以讓程式具有最佳性能。
(3)段類型欄位TYPE(Type field):用行指定段或門(Gate)的類型、說明段的訪問種類以及段的擴展方向。該欄位的解釋依賴於描述符類型標誌S指明是一個套用(代碼或數據)描述符還是一個系統描述符。TYPE欄位的編碼對代碼、數據或系統描述符都不同,如圖4-14所示。
如圖二所示
圖二

(4)描述符類型標誌S(Descriptor type flag):用於指明一個段描述符是系統段描述符(當S=0)還是代碼或數據段描述符(當S=1)。
(5)描述符特權級欄位DPL(Descriptor privilege level):用於指明描述符的特權級。特權級範圍從0到3。0級特權級最高,3級最低。DPL用於控制對段的訪問。
(6)段存在標誌P(Segment present):用於指出一個段是在記憶體中(P=1)還是不在記憶體中(P=0)。當一個段描述符的P標誌為0時,那么把指向這個段描述符的選擇符載入進段暫存器將導致產生一個段不存在異常。記憶體管理軟體可以使用這個標誌來控制在某一給定時間實際需要把那個段載入進記憶體中。這個功能為虛擬存儲提供了除分頁機制以外的控制。圖4-15給出了當P=0時的段描述符格式。當P標誌為0時,作業系統可以自由使用格式中標註為可用(Available)的欄位位置來保存自己的數據,例如有關不存在段實際在什麼地方的信息。
圖三

如圖三所示的當存在位P=0時的段描述符格式
(7)D/B(默認操作大小/默認棧指針大小和/或上界限)標誌(Default operation size/default stack pointer size and/or upper bound):根據段描述符描述的是一個可執行代碼段、下擴數據段還是一個堆疊段,這個標誌具有不同的功能。(對於32位代碼和數據段,這個標誌應該總是設定為1;對於16位代碼和數據段,這個標誌被設定為0。)
可執行代碼段。此時這個標誌稱為D標誌並用於指出該段中的指令引用有效地址和運算元的默認長度。如果該標誌置位,則默認值是32位地址和32位或8位的運算元;如果該標誌為0,則默認值是16位地址和16位或8位的運算元。指令前綴0x66可以用來選擇非默認值的運算元大小;前綴0x67可用來選擇非默認值的地址大小。
棧段(由SS暫存器指向的數據段)。此時該標誌稱為B(Big)標誌,用於指明隱含堆疊操作(如PUSH、POP或CALL)時的棧指針大小。如果該標誌置位,則使用32位棧指針並存放在ESP暫存器中;如果該標誌為0,則使用16位棧指針並存放在SP暫存器中。如果堆疊段被設定成一個下擴數據段,這個B標誌也同時指定了堆疊段的上界限。
下擴數據段。此時該標誌稱為B標誌,用於指明堆疊段的上界限。如果設定了該標誌,則堆疊段的上界限是0xFFFFFFFF(4GB);如果沒有設定該標誌,則堆疊段的上界限是0xFFFF(64KB)。
(8)顆粒度標誌G(Granularity):該欄位用於確定段限長欄位Limit值的單位。如果顆粒度標誌為0,則段限長值的單位是位元組;如果設定了顆粒度標誌,則段限長值使用4KB單位。(這個標誌不影響段基地址的顆粒度,基地址的顆粒度總是位元組單位。)若設定了G標誌,那么當使用段限長來檢查偏移值時,並不會去檢查偏移值的12位最低有效位。例如,當G=1時,段限長為0表明有效偏移值為0~4095。
(9)可用和保留位(Available and reserved bits):段描述符第2個雙字的位20可供系統軟體使用;位21是保留位並應該總是設定為0。

相關詞條

熱門詞條

聯絡我們