Memory management armlinux页面表布局

Memory management armlinux页面表布局,memory-management,linux-kernel,operating-system,arm,virtual-memory,Memory Management,Linux Kernel,Operating System,Arm,Virtual Memory,我已经阅读了多篇关于这一主题的文章,包括以下内容,但对我来说事情仍然不清楚: ARM硬件在L1翻译表中有4096个4字节的条目。每个条目转换内存中的1MB区域。在第二级,它有256个条目,每个条目有4个字节。每个第二级条目在内存中转换一个4KB的页面。 因此,根据这一点,任何虚拟地址都必须划分为12-8-12才能映射到上述方案 但在32位ARM linux端,这个划分是11-9-12。其中,L1翻译表由2048个条目组成,其中每个条目为8字节。在这里,两个4字节的条目被组合在一起,指向的第

我已经阅读了多篇关于这一主题的文章,包括以下内容,但对我来说事情仍然不清楚:

ARM硬件在L1翻译表中有4096个4字节的条目。每个条目转换内存中的1MB区域。在第二级,它有256个条目,每个条目有4个字节。每个第二级条目在内存中转换一个4KB的页面。 因此,根据这一点,任何虚拟地址都必须划分为12-8-12才能映射到上述方案

但在32位ARM linux端,这个划分是11-9-12。其中,L1翻译表由2048个条目组成,其中每个条目为8字节。在这里,两个4字节的条目被组合在一起,指向的第二级翻译表在内存中一个接一个地排列,因此在第二级,而不是256个条目,有512个条目。此外,由于Linux内存管理要求ARM具有各种非本机标志,因此我们为Linux页面表定义了512多个条目(每个第二级HW页面表一个条目)

现在的问题是Linux不强制PGD/PMD/PTE大小(但是它强制页面大小为4K。因此页面移位设置为12),那么为什么我们选择11-9-12布局(即11位用于PGD,9位用于HW PTE)。 是否只是为了确保512HW+512Linux PTE与页面边界对齐


如果有人能详细解释这个划分背后的逻辑,那就太好了……

正如您所说,在ARM短描述符格式中,每一个第二级页面表的大小都是1KB。即使关联的影子页表只有2KB,这意味着分配给二级表的每一页的50%都将被完全浪费

Linux通过成对分配一级条目,假装部分大小是2MB,而不是硬件的实际1MB,这样相应的一对二级表就可以在一个页面中保存在一起,避免了这种浪费,并使页表内存的管理非常简单。

应该有所有答案。主要是,PTE表有额外的信息来模拟导致您观察到的布局的位

我认为一个误解是二级表占用的内存与其映射的内存不同。必须为二级表分配物理内存,并使其对称(4K大小),使其与所有页面相同。现在这个4k页面可以是四臂MMU L2页面表。然而,我们需要一些额外的信息来模拟Linux通用MMU代码所需的脏的、年轻的和被访问的位。所以Linux L2(PTE目录)的布局是

  • Linux私人有限公司[n]
  • Linux私人有限公司[n+1]
  • ARM私人有限公司[n]
  • ARM私人有限公司[n+1]
  • 在L1级别,每个条目都是成对的(
    n
    /
    n+1
    ),因此它指向上面的第3项和第4项。该文件对布局有详细的注释(对于您的Linux版本应该是正确的)

    请参阅:

    为什么Linux不能假装分区大小为4MB,并在一个页面中保留四个二级页面表?它可以,但是它还需要在某个地方跟踪第二个页面,以便保存四个影子页面表。那可能不值得费心。假装有点误导。通用MMU层被告知L1条目为2MB。ARM MMU代码知道物理硬件。挑战在于将ARM MMU硬件(不同的ARM CPU系列)映射到通用的Linux MMU代码/API。它不能使用4MB部分,因为增加了管理/模拟脏位、年轻位和访问位的详细信息。@artlessnoise“通用MMU层被告知L1项为2MB…”-相当;arch代码。我看不出这有什么误导性……是的,但如果有人能详细解释这一划分背后的逻辑,那就太好了,而且这肯定不是一个计算机科学术语(无论如何,感谢词典参考)。顺便说一句,我对你的一半答案投了赞成票。谢谢大家的宝贵反馈。总之,arm h/w和linux pte之所以被安排,是因为linux需要额外的位来进行管理,而且通过将它们安排在一个4KB页面中,我们只需要引用一个页面。否则我们将不得不访问两个页面,一个用于h,一个用于LinuxPTE。但这真的很重要吗,因为内核页面表永远不会被交换掉?还有一件事,我有点不清楚。ARM hw将始终使用hw pte,这是否意味着Linux pte将只供Linux内部使用?假设在我的代码中,我引用了一些内存位置,hw和linux都为其设置了正确的页表,那么一旦cpu访问该地址,ARM hw将自动使用hw页表,并根据hw页表中的权限允许或不允许我访问。问题是在这种情况下,Linux pte有什么用途。。。它们似乎没用??Linux只使用Linux PTE值(主要是);这就是为什么他们是第一。有一个提交操作,CPU MMU层将Linux PTE转换为hw PTE。交换并不重要(MMU使用物理加法,但管理它们的CPU使用虚拟加法),因此它们必须在物理上存在。然而,当分组在一起时,TLB访问将减少。如前所述,它降低了代码复杂性。所有内容都涉及4k页面。Linux PTE值由通用MM/MMU代码使用。Linux内核需要它们。CPU需要硬件PTE。