Memory Linux分页:Linux如何折叠页面上目录和页面中间目录?

Memory Linux分页:Linux如何折叠页面上目录和页面中间目录?,memory,linux-kernel,paging,Memory,Linux Kernel,Paging,我正在读《理解Linux内核》一书,我想知道Linux是如何在3级或2级分页系统中折叠页面上层目录或页面中间目录的 根据我的理解: Linux有4个分页级别:页面全局目录、页面上层目录、页面中间目录和页面表 一旦设置了页表,硬件(分页单元)通过分析线性地址中的相应字段并查询相应的页表条目,自动定位页帧 对于两级分页系统,页面上目录和页面中目录在页面全局目录中分别获得一个特定条目 这似乎与我相矛盾:如果上述3个假设是真的,则意味着地址翻译将通过以下条目进行: Page Global Directo

我正在读《理解Linux内核》一书,我想知道Linux是如何在3级或2级分页系统中折叠页面上层目录或页面中间目录的

根据我的理解:

  • Linux有4个分页级别:页面全局目录、页面上层目录、页面中间目录和页面表
  • 一旦设置了页表,硬件(分页单元)通过分析线性地址中的相应字段并查询相应的页表条目,自动定位页帧
  • 对于两级分页系统,页面上目录和页面中目录在页面全局目录中分别获得一个特定条目
  • 这似乎与我相矛盾:如果上述3个假设是真的,则意味着地址翻译将通过以下条目进行:

    Page Global Directory Entry -> (Singleton) Page Upper Directory Entry -> (Singleton) Page Middle Directory Entry -> Page Table Entry
    

    然而,为什么同一个页面中间目录条目可以指向不同的页面表条目呢?

    我对这本书记得不太清楚。我认为它们的意思是不使用页面上目录和页面中间目录,而页面全局目录是选择页面表的表。你其余的假设似乎是正确的。假设您有32位模式下的虚拟地址0x12345678。0x678是物理页中的偏移量(12位)。中间的10位是页表中的偏移量,10位最重要的位是页全局目录中的偏移量。 对于没有物理地址扩展的32位体系结构,两个分页级别就足够了。Linux本质上消除了页面上层目录和页面中间目录字段,因为它们包含零位。但是,页上目录和页中目录在指针序列中的位置保持不变,以便相同的代码可以在32位和64位体系结构上工作。内核通过将页面上部目录和页面中部目录中的条目数设置为1并将这两个条目映射到页面全局目录的正确条目中,来保持页面上部目录和页面中部目录的位置

    作者的意思是,中间的2个层次被消除了。更改表时(交换进程时),只保留指针序列。这是为了在32位或64位CPU上维护相同的代码


    您不了解的是,要使用32位模式,CPU需要处于32位模式。如果使用32位Linux,Linux将不会以64位模式启动处理器。因此,CPU将处于32位模式和64位模式(长模式)之间的“转换”状态。这是由Intel和AMD完成的,以便他们的CPU保持向后兼容性。因此,您可以将CPU引导到32位模式,并决定不切换到64位模式。这是通过在处理器的控制寄存器中设置某些位来实现的。当处理器处于32位模式时,它只使用2级页表而不是4级页表来转换虚拟地址。

    谢谢!是的,32位模式下的CPU将只使用2级页表,这是有道理的,谢谢你指出我的误解!为了确认,对于32位体系结构,页面上目录和页面中间目录没有特定的条目,只是内核将页面上目录条目(和页面中间目录条目)映射回相应的页面全局目录条目:比如0x12345678,页面上层目录条目与0x12345678的10个最高有效位的页面全局目录条目相同,对吗?我不确定内核到底做了什么。这相当复杂。我还得进一步阅读。重要的是要理解内核以某种方式忘记了这些级别。另一件事是RAM中的实际表没有对PUD或PMD的任何引用。这是必要的,因为处理器只是一台机器。对于32位模式,它将使用2级页表转换虚拟地址,而不管它在RAM中找到什么。内核必须确保全局目录不包含对上层或中层目录的任何实际引用。