据我所知,页表将虚拟地址映射到物理地址。但是,如果页面已交换到磁盘怎么办?数据的位置是否比物理地址需要更多位来记录?当交换文件被修改时,数据的位置不会改变吗?这个问题在不同的操作系统中以不同的方式解决吗?
答案1
我们先来回答一个比较简单的问题:
修改交换文件时数据的位置不会改变吗?
页面文件的任何修改都不会导致其中现有数据的位置发生变化。如果扩展了页面文件,则会在其末尾添加更多群集(分组为“范围”或“运行”),因此现有数据的位置不会发生变化。页面文件位置始终相对于页面文件的开头,因此即使已经存在的范围以某种方式移动,页面文件位置也不会改变。
现在,关于比特:
记录数据位置所需的位数难道不是比记录物理地址所需位数更多吗?
是的,如果页面文件可以大于可能的物理内存大小,则需要更多的位来指定页面文件内的页面,而不是指定物理页码的位。
在未启用 PAE 的 x86 中,页表项 (PTE) 中有 20 位用于物理页号 (PFN,即“页框号”的缩写)。(PTE 为 32 位。其他 12 位是标志位,位 0 是“有效”或“页面存在”位,表示引用该页面时不会出现页面错误。三个标志位保留给操作系统使用。其他标志位具有“只读”、“仅在内核模式下可访问”、“缓存禁用”等含义。)(本段中的所有内容均由 CPU 架构决定 - 它与操作系统无关。)
在 Windows 中,PTE 中用于保存有效页面 PFN 的位,对于页面文件中的页面,实际上用于保存页面文件内的位置。这表示为页面文件开头的偏移量(以页面大小为单位)。这确实将页面文件限制为 4 GB,就像物理页面的 20 位 PFN 将 RAM 限制为 4 GB 一样。
但是,您可以拥有多个页面文件。PTE 中还有 4 位,用于指示页面文件中页面的页面文件编号。因此,可以有 16 个页面文件,总共可能有 64 GB 的页面文件空间。
当您在较旧的 x86 处理器上启用 PAE 时,PTE 宽度变为 64 位,并且 CPU 在 PTE 中实现 24 位(高于 20 位)的 PFN。这允许 64 GB 的 RAM,并且在 Windows 中允许 64 GB 的页面文件。该 PTE 格式中有很多未使用的位,因此操作系统实际上可以支持更大的页面文件;我不确定 32 位 Windows 是否支持。
在 64 位模式下的较新的 64 位处理器上,有 40 位 PFN,同样,相同的位用于保存无效(即不存在)页面的页面文件偏移量。因此,RAM 或页面文件,我们可以描述 2^40 个页面 - 即 1024 的 4 次方个页面。每页为 4 KiB。因此,4 PiB 页面文件是最大值,也是硬件支持的最大 RAM。同样,Windows 表示您可以拥有多个页面文件。我认为我们不会很快遇到页面文件空间限制。:)
以上所有不由 CPU 强制执行的操作都是操作系统特定的。实际上,根本没有理由将页面文件内的位置存储在 PTE 中;可以使用其他结构。在使用哈希页表的 PowerPC 等处理器上,操作系统不能将其存储在 PTE 中,因为无效的 PTE 根本不存储在 HPT 结构中。
但在 x86/x64 上,没有理由不使用无效 PTE。顺便说一句,这样做是可行的,因为当“有效”位清除时,MMU 不会关心 PTE 的其余部分(双关语)。因此,对于无效 PTE,除了一位之外,其他所有位都可供操作系统随意使用。事实上,在 Windows 中,还有其他几种形式的“无效 PTE”,具体取决于页面的状态。例如,对于备用或修改列表中的页面,PFN 字段仍包含页面在 RAM 中的物理位置。无效页面的 PTE 可能引用“虚拟地址描述符”,或者如果它是共享页面,则引用“原型 PTE”。硬件 MMU 永远不会看到这些结构中的任何一个,只会看到 PTE。
完整详细信息请参阅“内存管理”一章Windows 内部原理作者:Solomon、Russinovich 和 Ionescu。