Linux内核内存管理页面级别

6
我正在阅读Bovet和Cesati的《理解Linux内核》一书。在第二章“Linux中的分页”中,作者提到32位体系结构没有启用PAE时如何消除页面中间和上部目录。我有些难以理解作者的意思。
对于没有物理地址扩展的32位体系结构,只需要两个分页级别即可。Linux通过将页面上部和页面中间目录字段设置为零来消除它们。但是,在指针序列中保留了页面上部和页面中间目录的位置,以便相同的代码可以在32位和64位体系结构上工作。内核通过将它们的条目数设置为1并将这两个条目映射到页面全局目录的正确条目中来保留页面上部和页面中间目录的位置。
有人能以更易懂的方式解释一下吗?

好的,我再仔细思考了一下,请看看这是否有意义。基本上,您拥有的是MMU硬件,当TLB错失时,它会遍历页层次结构;对于单个条目PMD和PUD来说,它们实际上是毫不知情的。然而,对于其余内核代码,我们需要呈现统一的4级分页界面。因此,我们有一个单个条目的PUD和一个单个条目的PMD,每个都被模拟为包含该地址相应PGD条目的完全相同值。 - subramanian
是的。在没有PAE的处理器上,MMU只期望低两个表,但内核期望所有四个表,因此必须使用一个条目创建上面的两个表。确保您可以时将您的评论作为答案添加。 - ughoavgfhw
我觉得我的解释有漏洞,Linuxios 给我讲得很清楚,所以我会把他的答案标记为正确的。 - subramanian
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和长模式下都有统一的接口。


啊!现在我明白我为什么感到困惑了。书上似乎解释说中间的两个表是不活动的。这根本没有任何意义。你的回答澄清了我的疑惑,谢谢! - subramanian
是的,但页面全局目录(PGD)位于页面上部和中间目录(PUD、PMD)之前。如果消除PGD和PUD,并且PGD的唯一条目指向PUD的唯一条目,而后者又指向PMD的开头,那么这将更有意义。对吧? - blaze9

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接