## 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部分来索引该物理页桢,最终访问所需要的数据。
![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif)
![](https://box.kancloud.cn/2016-03-06_56dbfdae13033.gif)
### 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章。
![](https://box.kancloud.cn/2016-03-06_56dbfdae2b83b.gif)
![](https://box.kancloud.cn/2016-03-06_56dbfdae3a8b3.gif)
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实地址模式的不同