(轉自 : http://blog.csdn.net/lihenair/article/details/5168396)
Intel Architecture Software Developer’s Manual Volum 3A: SystemProgramming Guide
段描述符的作用是將代碼,資料,堆棧和任務狀態段的虛擬位址轉換成線性地址,並指明段的類型。段描述符只在局部和通用描述元表中出現。
選擇符16位長,放在段寄存器中,指標的之一部分是用來在全域或局部描述符表中選擇一個描述符,以便確定一個虛擬位址空間中的一個特定的儲存空間段,故叫選擇符。
LDT用於描述相應程式的程式碼片段、資料區段和堆棧段。GDT描述系統段,包括作業系統代碼和資料。
GDT LDT GDTR LDTR
Global and Local Descriptor Tables
當工作在保護模式時,所有儲存空間訪問都經過全域描述表(GDT)或者一個可選的局部描述表(LDT)。這些表包含的條目稱為段描述符。段描述符提供段基址及段存取權限,段類型和使用資訊。
每個段描述符都有一個對應的段選擇符。一個段選擇符提供了它在GDT或LDT中的索引(對應的段描述符的位移量),一個全域/局部flag(決定選擇符指向GDT或LDT)和存取權限資訊。
訪問段中的一個位元組(byte)必須提供一個段選擇符和一個位移量(offset)。段選擇符提供訪問段描述符的方法(在GDT或LDT中)。從段描述符,處理器得到線性空間中的段基址。位移量提供了相對於基址的以位元組(byte)為單位的位置。這種機制可用於訪問任何有效代碼去,資料區或者堆棧段,並提供了在處理器工作時根據當前優先順序(CPL)可訪問的段。CPL被定義為當前執行程式碼片段的保護層級。
GDT的線性地址的基址位於GDT寄存器(GDTR)中;LDT的線性地址的基址位於LDT寄存器(LDTR)中;
Global and Local Descriptor Tables in IA-32e Mode
System Segments, Segment Descriptors, and Gates
除了構成程式或過程執行環境程式碼片段,資料區段和堆棧段,架構還定義了兩個系統段: 任務狀態段(TSS)和LDT。GDT不被認為是一個段是因為它不可通過段選擇符和段描述符訪問。TSSs和LDTs有段描述符定義它們。
架構還定義了一組特殊的描述符,稱為門(call gates, interrupt gates, trap gates and task gates).這些門提供了保護系統程式和handler的方法。系統程式和handler可能工作在與應用程式和很多程式不同的優先順序上。例如,調用門的請求可以提供訪問一個在程式碼片段的程式的方法,而這個程式碼片段可能與當權程式碼片段同級或數字上低優先順序。為了由調用門訪問程式,調用過程提供調用門的選擇符。處理器接著執行調用門的訪問權檢查,比較調用門的優先順序CPL和調用門指向的目的程式碼片段。
如果允許訪問的目的程式碼片段,則處理器會得到目的程式碼片段的段選擇符和程式碼片段在調用門中的位移量。如果請求需要改變優先順序,處理器還會切換到目標優先順序的堆棧。新棧的段選擇符從當前執行任務的TSS獲得。門可以方便的在16位和32為程式碼片段轉換,反之亦然。
Task-State Segments and Task Gates
TSS定義了任務的執行環境狀態。包括通用目的寄存器,段寄存器,EFLAG寄存器,EIP寄存器和特權級為0、1和2的堆棧段選擇符和指標。TSS還包括代表LDT對應任務的段選擇符和和頁結構層次的基址。
所有在保護模式執行的程式都運行在任務(成為當前任務)的上下文境中。代表當前任務TSS的段選擇符儲存在任務寄存器中。最簡單的任務切換方法使用call或jump到新任務。這一點上,新任務的TSS的段選擇符由CALL或JMP指令給出。切換任務時,處理器執行如下操作:
1. 儲存保持在當前TSS中當前任務的狀態
2. 裝載新任務的段選擇符到任務寄存器
3. 通過GDT中的任務描述符訪問新TSS
4. 從新TSS裝載新任務狀態到通用目的寄存器,段寄存器,LDTR控制寄存器CR3(頁結構層次的基址),EFLAG寄存器和EIP寄存器。
5. 開始執行新任務
任務也可以由任務門訪問。任務門與調用門類似,除了它提供的是訪問TSS的方法而不是程式碼片段。
Interrupt and Exception Handling
外部中斷,非強制中斷和異常由中斷描述符表(IDT)處理。IDT儲存門描述符的集合,這些描述符提供訪問中斷和例外處理常式的方法。如同GDT,IDT也不是一個段。代表IDT基址的線性地址包含著IDT寄存器(IDTR)中。
IDT中的門描述符可以是中斷,陷阱或者任務門描述符。為了訪問中斷或異常描述符,處理器首先從內部硬體,外部中斷控制器或INT,INTO,INT 3, BOUND中接受一個中斷向量(中斷號)。中斷向量提供了IDT中的索引。如果選擇的門描述符是一個中斷門或陷阱門,對應的處理函數由類似請求調用門的操作訪問。如果描述符是任務門,處理函數由任務切換訪問。
Memory-Management Registers
處理器提供4個儲存空間管理寄存器(GDTR,LDTR,IDTR,TR)。
Global Descriptor Table Register(GDTR)
GDTR寄存器儲存GDT的實模式32位基址和16位限長。基址指明了GDT 0位元組的線性地址;表限長指明了表中的位元組數。
上電或重啟處理器後,基址置為預設值0,限長置為0FFFFH。新基址在處理器初始化保護模式操作時裝入GDTR。
Local Descriptor Table Register(LDTR)
LDTR寄存器儲存LDT的16位段選擇符,基址(保護模式32位),段限長和描述符屬性。基址指明了GDT 0位元組的線性地址;表限長指明了表中的位元組數。包含LDT的段必須在GDT中有一個段描述符。
當任務切換時,LDTR自動裝入新任務LDT的段選擇符和描述符。
上電或重啟處理器後,基址置為預設值0,限長置為0FFFFH。新基址在處理器初始化保護模式操作時裝入GDTR。
Memory Management Overview
儲存空間管理功能分為兩個部分:分段和分頁。分段提供了隔離單獨代碼,資料和堆棧模組的機制,因此多個程式(或任務)可以在同一個處理器山執行而不被其他處理器打擾。分頁提供了實現常規頁請求,虛擬儲存空間系統(程式執行環境部分可以按需映射到物理地址中)的機制,分頁還可以用來分割多任務。
每個系統必須定義一個GDT,可被系統中所有程式和任務使用。可選地,一個或多個LDT可定義。例如,一個LDT可以為每個單獨的任務定義,或一些或所以任務共用相同的LDT。
GDT自己不是一個段;相反,它是一個線上性地址空間的資料結構。GDT的線性基址和限長必須裝入GDTR寄存器中。GDT的基址必須以8位元組對齊以換取最好的處理器效能。GDT的限長以位元組代表。如同其他段一樣,