段描述符

段描述符

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

簡介


段描述符節,含段:段基址、段限段屬。段描述符編譯器、鏈器、載器操系統創建,絕程序。圖類型段描述符般式。

描述


圖示
段描述符各段標誌含義: ()段限段(  ):指段。器段描述符段限段組合值,根據顆粒標誌指段限值際含義。=,則段範圍~,單;=,則段範圍~,單。
根據段類型中的段擴展方向標誌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)描述符類型標誌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。