## 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个页面,任何一个都可以不存在。应用程序员不会感觉到虚拟内存系统在以这种方式调动页面。
![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif)
### 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字节。描述符,和与之对应的页目录项,还有与之对应的页表,就可以同时分配同时回收。
![](https://box.kancloud.cn/2016-03-06_56dbfdae13033.gif)
- 第一章 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实地址模式的不同