段選擇符
- 請求特級權RPL(Requestd Privilege Level)
- 提供段保護信息,在特級權之間的切換
- 指示標誌TI(Table Index)
- 0:在GDT中查找;1:在LDT中查找
- 索引號
- 在描述符表中的偏移位置
控制寄存器CR0~CR3
- CR0中協處理器控制位
- 擴展類型位ET(Extension Type)。1:存在80387協處理器;0:存在80287協處理器(Linux-0.11);
- 任務切換位TS(Task Switched)。該標誌用於推遲保存任務切換時的協處理器內容,直到新任務開始實際使用協處理器時。
- 仿真(EMulation)位。1:不存在內部或外部的協處理器;反之存在。
- 監控協處理器MP(Monitor Coprocessor或Math Present)標誌,用於控制WAIT/FWAIT指令與TS標誌的交互作用。0:TS標誌不會影響WAIT執行。
- CR0中保護控制位
- 啓用保護PE(Protection Enable)位。1:開啓保護模式(同時開啓分段模式,其實就是高級的分段,瞭解原理就明白了);0:進入實地址模式。
- 分頁PG(paging)位。1:開啓分頁模式,此時PE必須爲1;0:關閉分頁模式。
- 寫保護WP(Write Protect)位。1:處理器禁止超級用戶程序向用戶級只讀頁面執行寫操作;0:可以寫。
- 協處理器錯誤(Numeric Error)標誌。1:啓用X87錯誤協處理器錯誤內部報告機制;0:使用PC機形式的X87協處理錯誤報告機制。
- CR2和CR3
- CR3和CR2用於分頁機制。CR3含有存放頁目錄表頁面的物理地址,因此也被稱爲PDBR。因爲頁目錄表頁面是頁對齊的,所以只有高20位有效。
- CR2用於出現頁面異常時報告出錯信息。在報告頁面異常時,處理器會把引起異常的線性地址存放在CR2中。
頁目錄、頁表項格式
- 存在(Present)標誌。1:表示頁面有效;0:表示無效;
- 讀/寫R/W標誌。1:頁面可以被讀寫執行;0:頁面只讀或執行。(只對級別3有效);
- 用戶/超級用戶U/S標誌。1:運行在任何特權級的程序都可以訪問該頁面;0:只能被0、1或2特權級的程序訪問。
段描述符
段限長字LIMIT(Segment limit field)
段限長Limit字段用於指定段的長度。處理器會把段描述符中兩個段限長字段組合成一個20位的值。如果顆粒度標誌G=0,則段長度Limit範圍從1B到1MB,單位是BYTE;如果G=1,則段長度Limit範圍從4KB到4GB,單位是4KB。
根據段擴展方向標誌E,確定方向是向上(0x0~段限長)還是向下(段限長~0xFFFF或0xFFFFFFFF)。基地址字段BASE(Base address field)
處理器會把3個分立的基地址字段組合形成一個32位的值。段基地址應該與16BYTE邊界對齊。
描述符類型標誌S(Descriptor type flag)
S=0:代碼段;S=1:數據段。
描述符特權級字段DPL(Descriptor privilege level)
值爲0~3,特權級從高到低。
段存在標誌P(Segment present)
段存在標誌P指出一個段是在內存中(P=1)還是不在內存中(P=0)。
D/B(Default operation size/default stack pointer size and/or upper bound)
- 對於是可執行代碼段。這個標誌稱爲D標誌,用於指出該段中的指令引用的有效地址和操作數默認長度。1:默認32爲地址和32(8)位的操作數;0:默認值16位地址和16(8)位操作數。
- 對於是棧段。此時稱爲B標誌,用於指明隱含堆棧操作時的指針大小。1:32位指針並存放在ESP中;0:16位指針並存放在SP中。
- 下擴數據段。此時稱爲B標誌,用於指明堆棧段的上界限。1:上界限爲0xFFFFFFFF(4GB);0:上界限爲0xFFFF(64KB)。
顆粒度標誌G(Granularity)
該字段用於確定段限長字段Limit值的單位。如果爲0,段限長的單位是字節;1,段限長單位是4KB。若G=1,那麼當使用段限長來檢查偏移地址時,並不會去檢查偏移地址的低12位。
可用和保留比特位(Available and revserved bits)
段描述符第二個雙字的位20可供系統軟件使用;位21是保留位並應該總是設置爲0.
代碼段和數據段描述符
lgdt和sgdt用於訪問GDTR寄存器;lldt和sldt用於訪問LDTR寄存器。
lgdt使用內存中的一個6字節操作數來訪問GDTR寄存器:頭兩個字節代表描述符表的長度,後4個字節是描述符表的基地址。
lldt使用內存中的一個2字節操作數訪問LDTR寄存器:這個操作數表示GDT中的一個描述符項選擇符。該選擇符對應的GDT表中的描述符應該對應一個局部描述符。
TSS段描述符
- TYPE中的B=1:任務處於忙狀態(正在執行/被掛起);B=0,任務處於非活動。
TSS段格式
動態字段,當任務切換而被掛起時,處理器會自動更新動態字段內容。
- 通用寄存器字段。EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI;
- 段選擇符字段。ES、CS、SS、DS、FS和GS;
- 指令指針EIP字段。
- 先前任務連接字段。
靜態字段。這些內容是在任務被創建時設置的,不改變。
- LDT段選擇符字段;
- CR3控制寄存器字段;
- 特權級0、1和2的堆棧指針字段;
- 調試陷阱T標誌字段;
- I/O位圖基地址字段