以 x86 的 32 位分页方案为例。从Intel开发者手册中我找到了下图,它描述了32位分页如何将线性地址转换为物理地址。
我不明白这个三阶段过程的优势,例如,大部分线性地址用于索引页面,然后低 12 位用于索引该页面。
我不明白三阶段过程的必要性的原因是,它肯定无法以某种方式访问超过 2^20 的页面,因为它在线性中只有那么多的位。地址(不包括页偏移量)。除了无法访问更多页面之外,我无法想象它会有更好的性能。
最佳答案
请记住,此设计来自 1985 年发布的 Intel 80386,自那时以来基本上没有变化。
页表项为 4 个字节。如果您需要 2^20 个页表条目,则仅页表就需要 4 MiB 内存。这对今天的你来说可能看起来很合理,但按照 1985 年的标准来看,这实在是太离谱了。 Memory in those days cost something like $1000 per megabyte ,大多数人都习惯了 640K 或更少。
此外,如果您要使用多任务处理(这是 386 的主要进步),则每个任务都需要一个单独的页表。因此,将 4000 美元乘以另一个大数字; Unix 用户已经习惯了能够同时运行数十个进程。
大多数进程不需要接近 4 GiB 的虚拟内存:同样,几乎没有人拥有接近那么多的物理内存,甚至磁盘空间。真正的内存消耗者(Emacs,也许?)可能需要一两兆字节。使用两级结构,您只需要与实际使用的内存页数一样多的页表条目,再加上更多的页目录条目。大多数页目录条目是不需要的,并且可以标记为未使用,而不需要页表页来指向。因此,您的内存消耗现在只需要几 KiB 的分页开销。
当然,需要更多的周期才能走完额外的关卡,但为了节省数千美元的内存,这是一个合理的权衡。不管怎样,CPU 缓存了页表条目,因此不必经常在内存中遍历它们。
关于x86 - x86的多级分页相对于单页表有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61535537/