GDT(通用描述元表)本身並不是一個段,而是線性地址空間的一個資料結構。GDT的線性地址和長度必須載入進GDTR寄存器中。LDT(局部描述符表)存放在LDT類型的系統段中。此時GDT必須含有LDT的段描述符。如果系統支援多LDT的話那麼每個LDT都必須在GDT中有一個段描述符和段選擇符。LDT的段描述符可以在GDT的任何地方。
段選擇符
段選擇符是段的一個16位標識符。段選擇符並不直接指向段而是指向段描述符表中第一的段描述符。段選擇符3個欄位內容:
1.請求特權級RPL 提供了保護資訊。
2.表指示標誌TI TI=0表示描述符在GDT中;TI=1表示描述符在LDT中。
3.索引值 給出了描述符在GDT或LDT表中的索引號。
選擇符通過定位段表中的一個描述符來指定一個段,並且描述符中包含有訪問一個段的所有資訊,例如段的基址,段長度和段屬性。
處理器不使用GDT表中的第一項,指向GDT該項的選擇符用作為空白選擇符。當把空選擇符載入到一個段寄存器(除了CS和SS以外)中時處理器並不產生異常。但是當使用含有空選擇符的段寄存器用於訪問記憶體時就會產生異常。當把空選擇符載入到CS或SS段寄存器中時將會導致一個異常。
當一個段選擇符被載入到一個段寄存器可見部位時處理器也同時把段選擇符指向的段描述符中的段地址、段限長以及存取控制資訊載入到段寄存器隱藏部分(影子寄存器)。
在對描述符表中描述符做過任何改動之後就立刻重新載入6個段寄存器。這將把描述符表中的相應位段資訊重新載入到影子寄存器中。
段描述符
段描述符是GDT和LDT表中的一個資料結構項。用於相處理器提供有關一個段的位置和大小資訊以及存取控制的狀態值。每個段描述符長度是8位元組,含有三個主要欄位:段基址、段限長和段屬性。段描述符通常由編譯器、連接器、載入器或者作業系統來建立,但絕不是應用程式。
對於下擴段,減小段限長度,欄位中的值會在該段地址空間底部分配新的記憶體而不是在頂部分配。80X86的棧總是向下擴充的,因此這種實現方式很適合擴充堆棧。
段基地址應該對齊16位元組邊界。
代碼和資料區段描述符類型
如果堆棧的長度需要動態改變。那麼堆棧段可以是一個向下擴充的資料區段(拓展方向標誌置位)。這裡動態改變段限長將導致棧空間被添加到棧底部。
系統段描述符指向系統段(如LDT段和TSS段),門描述符就是一個“門”對於調用、中斷或陷阱門。其中含有程式碼片段的選擇符和段中程式入口的指標。