## 5.3 混合分段和分頁地址轉換(Combining Segment and Page Translation)
圖5-12 結合了圖5-2和圖5-9來對兩階段(從邏輯地址到線性,再從線性地址到實物理地址(當啟用分頁時))的地址轉換做一個總結。通過使用不同的方法,內存管理軟件可以實現幾種不同形式的內存管理機制。
### 5.3.1 “平坦”體系結構(”Flat Architecture”)
當80386用來執行一些程序,而這些程序也為別的不支持分段的處理器而設計時,有效的“關閉”分段可能比較好。80386沒有禁止分段的執行模式,但是同樣的效果是可以通過一些特定的方法實現的:把指向包括整個32-位地址空間的描述符的選擇子加載到段寄存器里,段選擇子沒有必要改變。32-位的偏移已足夠尋址整個80386支持的內存空間了。
### 5.3.2 跨多個頁的段(Segments Spanning Several Pages)
80386系統結構允許一個段比內存頁(4K)大,也允許比內存頁小。比如,有一個段用來尋址和保護一個大小為132K的數據結構。在一個支持頁級虛擬內存的軟件系統里,沒有必要把這一整個段都調入實物理內存。該結構被分成功33個頁面,任何一個都可以不存在。應用程序員不會感覺到虛擬內存系統在以這種方式調動頁面。

### 5.3.3 跨段的頁面(Pages Spaning Several Segments)
在另一方面,段可能比一個頁面要小。比如,考慮一個數據結構(如信號量(Semaphore))。因為段的保護和共享機制,把每一個信號量放在一個段里也許比較好些。但是,由于一個系需要很多的信號量,如果為每一個信號量分配一頁的話效率很低下。所以,把幾個段合并到一個頁面里應該更好。
### 5.3.4 非對齊的頁和段邊界(Non-Aligned Page and Segment Boundaries)
80386系統并不強求頁和段的任何對齊。即使一個頁包含了一個段的結尾又包含了一個段的開始也是完全可以的。類似的,即包含一個頁的開始和另一個頁的結尾的段也是完全允許的。
5.3.5對齊的頁和段邊界(Aligned Page and Segment Boundaries)
如果頁與段之間有一定的對齊的話,對于內存管理系統來說也許會簡單很多。例如,如果一個段只以頁為單元來分配的話,段頁邏輯將會結合起來。就沒有為部分頁面而管理的邏輯了。
### 5.3.6 每段一個別頁表(Page-Table Per Segment)
一個更簡單的內存空間管理方法便是將每一個段對應為一個頁目錄項,圖5-13顯示了這種方式。每個描述符的基址部分的低22位都將是0。換言之,基址被映射到每個頁表的第一項。每個段長度可以從1到4M的任意大小。一個段可以包含1到1K個物理內存頁,多少則由長度界限字段來決定。這樣的話,一個任務可以尋址1K個段(對于很多應用程序來說都足夠了),每個段可以高達4M字節。描述符,和與之對應的頁目錄項,還有與之對應的頁表,就可以同時分配同時回收。

- 第一章 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實地址模式的不同