實模式與保護模式下的分段分頁機制


1. 實模式

在實模式下,CPU不會為任務提供任務的保護機制,代碼任意運行。8086處理器是學習實模式的常用例子。它內部大致有以下寄存器:

  • 8個16位的通用寄存器:
    • AX (可以拆分成兩個AH/AL的8位寄存器)
    • BX (BH,BL)
    • CX (CH,CL)
    • DX (DH,DL)
    • SI (source index, 源索引寄存器)
    • DI (destination index, 目的索引寄存器)
    • BP (base pointer, 基數指針寄存器)
    • SP (stack pointer, 堆棧指針寄存器)
  • 段寄存器
    • CS (code segment, 代碼段寄存器)
    • DS (data segment, 數據段寄存器)
    • ES (extra segment, 附加段寄存器)
    • SS (stack segment, 堆棧段寄存器)
  • 專用寄存器
    • IP (instruction pointer, 指令指針寄存器, 它只與CS一起使用,只有處理器才能直接改變它的值)
    • FLAGS (標志位寄存器)

2. 實模式下的分段機制.

在實模式下,當處理器訪問內存時,它把指令中的指針的內存地址看成是段內的偏移地址,而不是物理地址: CS與IP一起使用,內存地址與DS(默認使用DS,也可以指定ES寄存器)一起使用. 具體來說,段地址左移4位 + 偏移地址 就得到了分段模式下的線段地址(不啟動分頁時,就這是物理地址).

3. 32位下的保護模式

保護模式是指CPU從硬件機制上提供了用戶程序對內存的訪問限制,為多用戶多任務的程序進行了彼此隔離,防止因某個程序的編寫錯誤影響到操作系統和其它用戶。保護模式下提供了修改段寄存器的保護/代碼段的保護/棧操作時的保護/數據訪問的保護等。具體如何保護的,得詳細看看《x86匯編語言從實模式到保護模式》一書,里面說的還是很明白的。如果不寫操作系統的話,真的沒有太大必要了解很清楚,因為看完之后過一段時間對會忘記了.

4. 保護模式下的分段機制

在32位處理器中,在原有的CS/DS/ES/SS段寄存器的基礎上對增加了FS/GS段寄存器,並且每一個16位的段寄存器都對應了一個描述符高速緩存器。 在32的保存模式下,段寄存器中存放不是段地址,而是段的描述符的索引號。過程是這樣的:在使用一個段之前都需要把該段的描述符(占6個字節)登記注冊的段描述符表中(GDT或LDT),在使用一個段時,在段寄存器是放在是該段的描述符在段描述符表中的索引號,cpu會自動把段對應的描述符加載到段寄存器對應的調整緩存器中(這里面有段地址).

  • 全局描述符表(GDT): 存放全局的段描述符.
  • GDTR: 48位的全局描述符表寄存器,前32位存放了GDT在內存起始位置的線性地址, 后16位存放了全局描述符表的大小(16位,64Kb, 每一個段描述符大小8b, 所以最多可以定義8192個段描述符).
  • 局部描述符表(LDT): 存放每一個任務自己段描述符.
  • LDTR: LDT寄存器,類似GDTR, 保存當前任務的LDT的位置信息.
  • 任務狀態段(TSS): 為了保存任務的狀態,並在下一次重新執行時恢復它們,每個任務都應用一個額外的內存區域保存上下文相關的信息(各寄存器的值),這就叫做任務狀態段. 它有固定的格式,最小為104字節.
  • TR寄存器:指向當前任務的TSS.

段部件負責求出線性地址.

5. 32位下的分頁機制

  • 頁目錄
  • 頁表


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM