Linux内核内存管理分页级别

时间:2012-09-23 23:48:10

标签: linux memory-management kernel paging

我正在阅读Bovet和Cesati的“理解Linux内核”一书。在第二章中,在“在Linux中进行分页”一书中,作者提到了如何使用32个没有启用PAE的体系结构来消除页面中间目录和上层目录。我无法理解作者的意思。

他们的治疗方法已经松动,并没有很多直觉。

  

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

有人能以更可口的方式解释这个吗?

2 个答案:

答案 0 :(得分: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和长模式的统一接口。

答案 1 :(得分:0)

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

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

在文中,据说两个级别就足够了,这就是为什么PUD和PMD被消除了#34;但是这两个表中的任何一个都有一个长度,并按顺序保持正确的顺序 在我的理解中,这意味着PML4(PGD)对应于PD(PMD)并且由到PT的直接指针组成。因此,PUD和PMD被跳过"。但我的理解并不符合原问题的正确答案 如果32位应用程序执行系统调用并切换到64位内核模式,这个地址如何解决?在这种情况下,MMU需要四层而不是两层 显而易见,我的理解出了问题,因为事情不能像那样工作。希望有人可以解决问题。