6

我正在阅读 Bovet 和 Cesati 所著的“Understanding Linux Kernel”一书。在第二章的“Linux 中的分页”下,作者提到了如何在 32 种未启用 PAE 的体系结构中消除页面中间目录和上层目录。我很难理解作者的意思。

他们的治疗一直很松散,并且没有太多的直觉意义。

对于没有物理地址扩展的 32 位架构,两个分页级别就足够了。Linux 基本上消除了 Page Upper Directory 和 Page Middle Directory 字段,因为它们包含零位。但是,页面上目录和页面中间目录在指针序列中的位置被保留,以便相同的代码可以在 32 位和 64 位体系结构上工作。内核通过将其中的条目数设置为 1 并将这两个条目映射到 Page Global Directory 的正确条目中来为 Page Upper Directory 和 Page Middle Directory 保留一个位置。

有人可以以更可口的方式解释这一点吗?

4

2 回答 2

2

嗯,我想这意味着内核总是使用 4 级页表,可以同时适应普通的 32 位、PAE 和长模式。我认为他们在引用中的意思是 PM4L 和 PDT 只是设置为一个条目的长度,它只指向下一个条目。所以这意味着在正常的 32 位中,你会得到这个:

                              /-> Page table
PM4L -> PDT -> Page Directory --> Page table
                              \-> Page table

但是在 PAE 中,你会得到:

PM4L -> PDT -> 512 Page Directories -> 1024 Page tables

在长模式下,你会得到这个:

PM4L -> 512 PDTs -> 512 Page Directories -> 1024 Page tables

但由于始终是 4 个级别,内核的其余部分具有跨 32 位、PAE 和长模式的统一接口。

于 2012-09-24T00:20:43.637 回答
0

目前我正在阅读同一本书,我不想问新问题,因为这本书正好解决了我的问题。
通常的表格顺序如下:

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT

在文本中说两个级别就足够了,这就是为什么“消除” PUD 和 PMD 的原因,但是这两个表中的任何一个都具有 1 的长度并保持正确的序列顺序。
在我的理解中,这意味着 PML4 (PGD) 对应于 PD (PMD),并且由指向 PT 的直接指针组成。因此,PUD 和 PMD 被“跳过”。但是我的理解与原始问题的正确答案不符。
如果 32 位应用程序执行系统调用并切换到 64 位内核模式,如何解析这样的地址?在这种情况下,MMU 需要四层而不是两层。
很明显,我的理解有问题,因为事情不能那样工作。希望有人能把事情弄清楚。

于 2018-02-24T00:54:44.540 回答