You've successfully subscribed to The Daily Awesome
Great! Next, complete checkout for full access to The Daily Awesome
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
Success! Your billing info is updated.
Billing info update failed.

译 | 5.2 页面翻译 - Page Translation

. 5 min read

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章。)