複製鏈接
請複製以下鏈接發送給好友

段描述符

鎖定
段描述符是GDT和LDT表中的一個數據結構項,用於向處理器提供有關一個段的位置和大小信息以及訪問控制的狀態信息。通常由編譯器,鏈接器,加載器,或操作系統或執行體,但不由應用程序創建。
中文名
段描述符
外文名
Segment Descriptor
長    度
8字節
主要字段
段基地址、段限長和段屬性
創    建
編譯器鏈接器、加載器、操作系統或執行體

目錄

段描述符簡介

每個段描述符的長度是8字節,含有3個主要字段:段基地址、段限長和段屬性。段描述符通常由編譯器鏈接器、加載器或者操作系統來創建,但絕不是應用程序。圖一給出了所有類型段描述符的一般格式。

段描述符描述

圖一 圖一 [1]
如圖一所示,一個段描述符中各字段和標誌的含義如下:
(1)段限長字段Limit(Segment limit field):用於指定段的長度。處理器會把段描述符中兩個段限長字段組合成一個20位的值,並根據顆粒度標誌G來指定段限長Limit值的實際含義。
  • 如果G=0,則段長度Limit範圍可從1B~1MB,單位是1B。
  • 如果G=1,則段長度Limit範圍可從4KB~4GB,單位是4KB。
根據段類型中的段擴展方向標誌E,處理器以兩種不同方式使用段限長Limit:對於向上擴展的段(expand-up segment,簡稱上擴段),邏輯地址中的偏移值範圍可以從0到段限長值Limit。大於段限長Limit的偏移值將產生一般保護性異常(general-protection exceptions, #GP, SS段寄存器除外)或產生棧錯誤異常(stack-fault exceptions, #SS)。對於向下擴展的段(expand-down segment,簡稱下擴段),段限長Limit的含義相反。根據默認棧指針大小標誌B的設置,偏移值範圍可從段限長Limit+1到0xFFFFFFFF或0xFFFF。而小於等於段限長Limit的偏移值將產生一般保護性異常或棧錯誤異常。對於下擴段,減小段限長字段中的值會在該段地址空間底部分配新的內存,而不是在頂部分配。IA-32架構的棧總是向下擴展的,因此這種實現方式很適合擴展堆棧
(2)基地址字段Base(Base address field):該字段定義在4GB線性地址空間中一個段字節0所處的位置。處理器會把3個分立的基地址字段組合形成一個32位的值。段基地址應該對齊16字節邊界。16字節對齊不是必須的,但對齊在16字節邊界上使得程序能最大化程序性能。
(3)段類型字段TYPE(Type field):指定段或門(Gate)的類型、説明段的訪問類型以及段的擴展方向。該字段的解釋依賴於描述符類型標誌S指明是一個應用(代碼或數據)描述符還是一個系統描述符。TYPE字段的編碼對代碼、數據或系統描述符都不同,如圖二所示。
圖二 圖二 [1]
(4)描述符類型標誌S(Descriptor type flag):用於指明一個段描述符是系統段描述符(當S=0)還是代碼或數據段描述符(當S=1)。
(5)描述符特權級字段DPL(Descriptor privilege level):用於指明描述符的特權級特權級範圍從0到3。0級特權級最高,3級最低。DPL用於控制對段的訪問。
圖三 圖三 [1]
(6)段存在標誌P(Segment present):用於指出一個段是在內存中(P=1)還是不在內存中(P=0)。當一個段描述符的P標誌為0時,那麼把指向這個段描述符的選擇符加載進段寄存器將導致產生一個段不存在異常(segment-not-present exception,#NP)。內存管理軟件可以使用這個標誌來控制在某一給定時間實際需要把那個段加載進內存中。這個功能為虛擬存儲提供了除分頁機制以外的控制。圖三給出了當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)64位代碼段標誌L(64-bits code segment):在IA-32模式,第二個雙字的第21字節指示一個代碼的是否包含本地64位代碼。L置1表示這個代碼段的指令執行在64位模式,置0表示執行在兼容模式。如果L位被設置了,那麼D標誌一定要置0。當不處於IA-32e模式時,和對於非代碼段,這個位被保留並且總是應該被置0。
(10)可用和保留位AVL(Available and reserved bits):段描述符第2個雙字的第20字節可供系統軟件使用;
參考資料