From: Intel 80386 Reference Manual - 5.2 Page Translation
在地址转换的第二阶段, 80386将线性地址转换为物理地址。此时的地址转换实现了 面向页面的虚拟内存系统 和 页面级保护所需的基本功能。
页面翻译是非必需项,仅当仅当CR0
的 PG
位被设置时才需要,而这一位通常由操作系统在软件初始化期间设置。如果操作系统需要实现多个8086任务,面向页面保护或面向页面的虚拟内存,那么 PG
位就必须设置。
5.2.1 页面帧 - Page Frame
页面帧是以4KB
为单位的连续物理内存,页面从字节边界开始并且大小固定。
5.2.2 线性地址 - Linear Address
线性地址通过指定页表,该表中的页以及该页内的偏移来间接指代物理地址。 图5-8显示了线性地址的格式。

图5-9显示了处理器如何通过查询两级页表来将线性地址的 DIR
,PAGE
和 OFFSET
字段转换为物理地址。 寻址机制使用 DIR
字段作为页面目录的索引,使用 PAGE
字段作为页面目录确定的页表的索引,并使用 OFFSET
字段来寻址由页表确定的页面内的字节。

5.2.3 页表 - Page Tables
页表是一个32位页面符(page specifiers)的数组。 页表本身就是一个页面,其中包含4KB的内存或最多1K的32位entry
使用两级表寻址内存页面。 一级页表是页面目录,最多可以处理第二级的1K页表;二级页表可以处理最多1K页面。 页面目录所寻址1M($2^{20}$)页面,而每个页面包含4K字节($2 ^{12}$)个字节,所以一个页面目录的表可以跨越80386
的整个物理地址空间($2 ^{20}\times 2 ^{12} = 2 ^{32}$)
当前页面目录的物理地址存储在CPU寄存器CR3中,也称为页面目录基址寄存器(PDBR)。 内存管理软件可以选择对所有任务使用一个页面目录,为每个任务使用一个页面目录,或者两者的某种组合。 有关CR3初始化的信息,请参阅第10章。了解CR3如何针对每项任务进行更改, 请参阅第7章。
5.2.4 页表条目 - Page-Table Entries
两级页表中的条目具有相同的格式, 图5-10对此进行了说明。

5.2.4.1 页面帧地址
页面帧指定了页面的起始位置。由于页面位于4K边缘,因此其地址的低12bit始终为0。在页面目录中,页面帧地址是页表的地址;在页表中,页面帧地址是包含内存操作所需的页面帧地址。
5.5.4.2 当前位 Present bit
表示当前页表条目是否可用于地址翻译。P = 1
表示该条目可以使用。
任意一级的页表 P = 0
时,则当前条目对于地址转换无效,并且其余部分可以被软件使用,同时其余位不被硬件检测。图5-11说明了P = 0时页表条目的格式。

5.5.4.3 访问位和脏位
Addressed and Dirty bit
addressed 记录已经访问,dirty bit 记录被写入
这两位展示在两级页表中的页面使用情况,其中dirty
位由软件设置,addressed
位由硬件设置,这两位均不会由硬件复位。
Addressed
:对页面读或写之前,处理器将相应的访问为置为1。
dirty
:写入该页表条目对应的地址前,将其脏位置为1;页表目录的脏位未定义。
利用这些位,支持分页虚拟内存的操作系统可以在内存需求超过可用物理内存时,确定从物理内存中消除的页面。操作系统负责测试和清除这些位。
有关80386如何协调多处理器系统中已访问和脏位的更新,请参阅第11章。
5.2.4.4 读/写位 和 用户/监督位
Read/Write and User/Supervisor Bits
这些位不用于地址转换,但用于页面级保护,处理器与地址转换同时执行。 请参阅第6章详细讨论保护。
5.2.5页面转换缓存
Page Translation Cache
为了最大限度地提高地址转换效率,处理器将最近使用的页表数据存储在板载高速缓存中。 仅当必要的分页信息不在高速缓存中时,才必须引用两个级别的页表。
页面转换缓存的存在对于应用程序程序员是不可见的,但对于系统程序员来说是可见的。 每当页表更改时,操作系统程序员必须刷新缓存。
页面转换缓存可以通过以下两种方法之一刷新:
使用 MOV 指令重新载入 CR3
,例如:
MOV CR3, EAX
切换到具有与当前TSS不同的CR3图像的TSS。 (有关任务切换的更多信息,请参阅第7章。)