x86 的多级分页相比单页有什么优势table?

What's the advantage of x86's multi stage paging over a single page table?

考虑一个具体示例的 x86 的 32 位分页方案。从Intel开发者手册中我找到了下图,它描述了32位分页如何将线性地址转换为物理地址。

我不明白这个 three-stage 过程的优势,例如,大部分线性地址用于索引页面,然后低 12 位用于索引该页面。

我不明白 three-stage 过程的必要性的原因是,它肯定不能以某种方式访问​​超过 2^20 的页面,因为它只有那个数量的线性地址中的位(不包括页面偏移量)。除了无法访问更多页面之外,我无法想象它会有更好的性能。

请记住,此设计来自于 1985 年发布的 Intel 80386,此后基本没有变化。

一个页面 table 条目是 4 个字节。如果您需要 2^20 页 table 条目,那么仅您的页 table 就需要 4 MiB 的内存。这在今天对你来说似乎是合理的,但按照 1985 年的标准,这就太离谱了。 Memory in those days cost something like 00 per megabyte,大多数人习惯了 640K 或更少。

此外,如果您要使用多任务处理(这是 386 的主要进步),则每个任务都需要一个单独的页面 table。所以将 4000 美元乘以另一个大数字; Unix 用户可能已经习惯了一次 运行 数十个进程。

大多数进程不需要接近 4 GiB 的虚拟内存:同样,几乎没有人拥有接近那么多的物理内存,甚至磁盘 space。一个真正的内存大户(Emacs,也许?)可能需要一两兆字节。使用两级结构,您只需要与实际使用的内存页数一样多的页 table 条目,再加上页目录的页数。大多数页面目录条目都不需要,可以标记为未使用,不需要页面 table 页面指向。因此,您的内存占用现在只需要几个 KiB 用于分页开销。

当然,走额外的关卡需要更多的循环,但对于价值数千美元的内存节省来说,这是一个合理的权衡。无论如何,CPU 缓存页面 table 条目,因此它不必经常在内存中遍历它们。