Linux内核内存管理分页级别

sub*_*ian 5 linux paging kernel memory-management

我正在阅读Bovet和Cesati的"理解Linux内核"一书.在第二章中,在"在Linux中进行分页"一书中,作者提到了如何使用32个没有启用PAE的体系结构来消除Page Middle和Upper Directories.我无法理解作者的意思.

他们的治疗方法已经松动,并没有很多直观的意义.

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

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

Lin*_*ios 2

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

                              /-> Page table
PM4L -> PDT -> Page Directory --> Page table
                              \-> Page table
Run Code Online (Sandbox Code Playgroud)

但在 PAE 中,你会得到这样的结果:

PM4L -> PDT -> 512 Page Directories -> 1024 Page tables
Run Code Online (Sandbox Code Playgroud)

在长模式下,你会得到这样的结果:

PM4L -> 512 PDTs -> 512 Page Directories -> 1024 Page tables
Run Code Online (Sandbox Code Playgroud)

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