操作系統重要數據結構

段選擇符


這裏寫圖片描述

  • 請求特級權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位圖基地址字段
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章