我真的不明白为什么需要分页中的目录

我真的不明白为什么需要分页中的目录

多年来我一直试图弄清楚这个问题,但每次我都不明白。我非常了解分页、页表和页表目录在 Linux 中的工作原理,但我只是不明白为什么实际上需要它们。

为什么我们需要分页和页表级别(Linux 使用 4 个级别)的问题似乎是您无法在同一时刻加载所有内存。但是我们不能只加载选定数量的页面和地址而不加载所有目录吗?

我知道我们需要了解某个帧在物理内存中的位置,但是为什么我们不能直接检索大页表的某个子集呢?那会导致什么问题呢?我知道如果我们不使用页面+偏移量,整个事情就会太大,但是目录真的能解决任何问题吗?

关于不同系统如何划分地址的位以构建页表级别有很多讨论,但最终我们总是会为条目提供 32/64 位。我们无法解决更多问题(除了cr3像 PAE 那样的寄存器上的技巧),拆分它们有什么意义呢?最后,(我将简化)“目录 3,子目录 5,页 7,偏移量 2”比仅仅说“地址 3572”更好吗?

更糟糕的是,如果 CPU 没有帮助我们(我猜它有内置电路可以在 1 个时钟周期内完成所有过程?不太确定!),如果必须检索所有内容,效率岂不是会降低很多吗?每次内存访问时的目录和子目录,而不是直接检索逻辑/物理内存映射,然后访问所需的地址?

答案1

具有多个级别的原因是为了节省空间。

考虑如果没有多个级别,需要什么。如果有 48 位地址空间(当前的 x86_64 cpu 没有提供完整的 64 位),并且您使用 4k 字节页面大小(12 位),那么您将拥有 2 的 36 次方页面。

如果您可以将映射信息放入 64 位(8 字节),那么您将需要 8 * 2**36 字节或 512Gb 内存来保存转换表。

该表的几乎所有内容都将被设置为表示“无效地址”的值。

通过多个级别,您可以减少转换表的空间需求。如果将64位地址空间分为current_unused/PML4/PDPT/PD/PT/address_in_page的16/9/9/9/9/12位,那么PML4表只需要512个条目,其中510可能是值代表“无效地址”,其余2指向PDPT的两个512条目的数组。如果我们到此为止,那么我们就将所需的空间从 2**36 个条目减少到大约 2 + 2**27 个条目,不到原始线性要求的 0.2%。当然,它并不止于此,还有 3 个额外级别,尽管它们往往不会提供那么大的节省。

相关内容