## 5.2 分頁地址轉換(Page Translation)
在地址轉換的第二個階段,80386將線性地址轉換為實物理地址。這個階段實現了基于頁的虛擬內存和頁級保護機制。
分頁地址轉換過程是可選的。只有當CR0中的PG位置位時才會產生效果。這個位的設置一般來說是由操作系統在系統初始化的過程中設置的。如果操作系統想要實現能運行多個虛擬8086任務、基于頁級的保護、基于頁級的虛擬內存的話,PG位是必需置位的。
### 5.2.1 頁楨(Page Frame)
一個頁楨是一個地址連續的4K大小單元內存。各頁以字節邊界為起始,大小固定不變。
### 5.2.2 線性地址(Linear Address)
一個線性地址間接的訪問到一個實物理地址外。它通過使用一個頁表,表內的一個頁,和一個頁內的偏移來映射到實物理地址外。圖5-8顯示了線性地址的格。
圖5-9顯示了處理器如何將線性地址中的DIR,PAGE,和OFFSET字段轉換為實物理地址上的,這個過程使用了兩級頁表。尋址機制使用DIR字段來索引頁目錄表,用PAGE字段來索引頁表,這樣就可以確定一個物理頁楨了,然后再使用OFFSET部分來索引該物理頁楨,最終訪問所需要的數據。


### 5.2.3 頁表(Page Tables)
一個頁表僅僅是很多32-位頁指示器(32-bit page specifiers)組成的一個數組。頁表本身也是一個頁,所以包含了4K字節內存空量(最多可包含1K個32-位的表項)。
在尋址一個內存頁時,使用了兩級的頁表。高一級的頁表也被叫作頁目錄。頁目錄可最多尋址1K個二級頁表。一個二級頁表最多可尋址1K個頁面。所以,一個頁目錄最多可尋址1M個頁面。因為每個頁面有4K(2^12)字節大小。所以一個頁目錄可尋址整個80386的實物理地址空間(2^20 * 2^12 = 2^32)。
### 5.2.4 頁表項(Page-Table Entries)
兩級頁表項都有相同的格式,圖5-10顯示了這種格式。
5.2.4..1 頁楨地址(Page Frame Address)
頁楨地址指出了一個實物理頁的開始地址。因為頁的地址是以4K為邊界的,所以地址的低12位總是為0。在頁目錄中,頁楨地址是二級頁表的起始地址。在二級頁表中,頁楨地址是所要要訪問的物理頁的起始地址,該物理頁包含了要訪問的指令操作數。
5.2.4.2 存在位(Present Bit)
存在位決定了一個頁表項是否可以用作地址轉換過程,如果P=1則可以用該頁表項。
當任何一級頁表項的P=0時,該項都不可以用作地址轉換過程,這時,該項的其它位可以被軟件使用。它們中的任何一位都不會被硬件使用。圖5-11顯示了當P=0時的頁表項格式。
當任何一級頁表項的P=0時,而軟件又試圖用它來訪問內存時,處理器將會引發一個異常。在支持頁級虛擬內存的軟件系里,缺頁異常處理子程序可以將所需的頁面調入物理內存。引起缺頁異常的指令是可以重起的,關于異常處理的更多信息請參看第9章。
注意,沒有頁目錄自身的存在位。當任務掛起時,該任務的頁目錄是可以不存在的,但是操作系必須在一個任務被重運行前確保該任務的CR3映象(保存在TSS里)指示的頁面(即頁目錄表)在內存中。關于TSS和任務指派的詳細信息請參看第7章。


5.2.4.3 已訪問位和臟位(Accessed and Dirty Bits)
這些位提供了兩級頁表的數據使用情況信息。除了頁目錄表的臟位(Dirty bit),所有的這些位都由硬件自動置位,但是處理器絕對不會復位它們。
在一個頁面被讀或寫之前,處理器將自動將兩級頁表的這些相關的位置1。
當向一個地址寫入時,處理器將會把相關的二級頁表的臟位(Dirty bit)置為1。頁目錄表項的臟位沒有作定義。
當系統內存緊張時,一個支持頁級虛擬內存的操作系統可以使用這些位來決定將要換出哪些物理頁面。操作系統應該自已負責測試和清除這些相關位。
參看第11章,學習80386如何在多處理器環境下更改訪問位和臟位。
5.2.4.4 讀/寫 位,用戶/特權用戶 位(Read / Write and User / Supervisor Bits)
這些位并不是用于地址轉換過程的,它們是用來實現頁級保護機制的,這些保護機制是在地址轉換過程的同時實施的。參看第六章,以了解理多關于保擬機制特性。
### 5.2.5 頁地址轉換緩存(Page Translation Cache)
為了獲得最大的地址轉換效率,處理器把最近使用的頁表數據存儲在一個芯片內的緩存中。只有當所要的地址轉換信息沒有在緩存中時,才有訪問兩級頁表的必要。
應用程序員是感覺不到頁地址轉換緩存的存在的,但系統程序員知來說不是。當頁表內容改變時,操作系統程序員必須清除緩存。頁地址轉換緩存可以用以下兩種方法清除:
1、通過MOV 指令重新加載CR3寄存器,例如,MOV CR3,??? EAX。
2、通過任務切換到一個TSS,該TSS保存了一個不同的CR3映象。關于任務切換,請查看第7章。
- 第一章 80386介紹
- 1.1 該手冊的組織結構
- 1.2 其他文獻
- 第二章 編程基本模型
- 2.1 存儲器組織和段
- 2.2 數據類型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作數選擇
- 2.6 中斷和異常
- 第4章 系統寄存器
- 4.1 系統寄存器 (System Registers)
- 4.2 系統指令 (System Instructions)
- 第五章 內存管理
- 5.1 分段地址轉換(Segment Translation)
- 5.2 分頁地址轉換(Page Translation)
- 5.3 混合分段和分頁地址轉換(Combining Segment and Page Translation)
- 第六章 內存管理
- 6.1 為什么要保護(Why Protection?)
- 6.2 80386保護機制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段級保護(Segment-Level Protection)
- 6.4 頁級保護(Page-Level Protection)
- 6.5 混合分頁和分段保護(Combining Page and Segment Protection)
- 第7章 多任務(Multitasking)
- 8.1 I/O 尋址(I/O Addressing)
- 7.1 任務狀態段(Task State Segment)
- 7.3 任務寄存器(Task Register)
- 7.4 任務門描述符(Task Gate Descriptor)
- 7.5 任務切換(Task Switching)
- 7.6 任務鏈(Task Linking)
- 7.7 任務尋址空間(Task Address Space)
- 第8章 輸入 輸出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保護和I/O(Protection and I/O)
- 第9章 異常和中斷(Exceptions and Interrupts)
- 9.1 識別中斷(Identifying Interrupts)
- 9.2 允許和禁止中斷(Enabling and Disabling Interrupts)
- 9.3 同時發生的中斷和異常的優先級(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中斷描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中斷任務和中斷子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出錯碼(Error Code)
- 9.8 異常條件(Exception Conditions)
- 9.9 異常總結(Exception Summary)
- 9.10 出錯碼總結(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 復位后處理器狀態(Processor State After Reset)
- 10.2 實模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切換到保護模式(Switching to Protected Mode)
- 10.4 保護模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB測試
- 第十四章 80386實地址模式
- 14.1 物理地址構成
- 14.2 寄存器和指令
- 14.3 中斷和異常處理
- 14.4 進入和離開實地址模式
- 14.6 實地址模式異常
- 14.7 與8086的不同
- 14.8 與80286實地址模式的不同