译 | 5.2 页面翻译 - Page Translation

From: Intel 80386 Reference Manual - 5.2 Page Translation

在地址转换的第二阶段, 80386将线性地址转换为物理地址。此时的地址转换实现了 面向页面的虚拟内存系统页面级保护所需的基本功能。

页面翻译是非必需项,仅当仅当CR0PG 位被设置时才需要,而这一位通常由操作系统在软件初始化期间设置。如果操作系统需要实现多个8086任务,面向页面保护或面向页面的虚拟内存,那么 PG 位就必须设置。

5.2.1 页面帧 - Page Frame

页面帧是以4KB为单位的连续物理内存,页面从字节边界开始并且大小固定。

5.2.2 线性地址 - Linear Address

线性地址通过指定页表,该表中的页以及该页内的偏移来间接指代物理地址。 图5-8显示了线性地址的格式。

图5-9显示了处理器如何通过查询两级页表来将线性地址的 DIRPAGEOFFSET 字段转换为物理地址。 寻址机制使用 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章。)

updatedupdated2021-03-052021-03-05