1

我知道linux在内存管理中使用了三级页表。

我对页表的内容感到困惑。页表是包含下一级页表基地址还是包含页框号?

如果它包含页框号,那么如何获得该特定页表的基地址?它存储在哪里?

如果有人向我澄清这一点,那就太好了。

4

1 回答 1

1

如果您谈论的是 x86(/64),那么每个页表条目(终端条目除外)都包含下一个页表的物理地址,而终端 PTE 包含实际代码/数据页的物理地址。

由于页表本身是按页组织的,因此它们的物理地址自然是页大小的倍数。

将完整的物理地址存储在 PTE 中的 12 个最低有效位始终为零(如果页面大小为 4KB)是没有意义的,因此它们不会存储在 PTE 中(并且使用 PTE 中恢复的空间用于控制标志,例如内核/用户、只读/可写、可执行、存在、脏、已访问等)。像这样被截断的地址通常称为页框号,因为它们只不过是页码(如果您从 0 开始计算地址 0 处的页面的所有页面,从 1 开始计算地址 4096 处的页面等等)。

包含所有血腥细节的问题的最终答案在相关的 CPU 手册中。

于 2012-09-03T06:48:20.407 回答