ARM Linux 页表布局

ARM Linux Page tables layout

我已经阅读了多篇关于这个主题的文章,包括以下内容,但对我来说仍然很模糊: http://elinux.org/Tims_Notes_on_ARM_memory_allocation

ARM Linux kernel page table

Linux kernel ARM Translation table base (TTB0 and TTB1)

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

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

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

如果有人能详细解释一下这个划分背后的逻辑就好了....

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

Linux 只是 假装 节大小为 2MB,而不是硬件的实际 1MB,通过成对分配第一级条目,以便相应的二级 table 对可以放在一个页面中,避免浪费,并使页面 table 内存的管理非常简单。

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

我认为一个误解是 L2 table 占用的内存与其映射的内存。您必须为 L2 table 分配 物理 内存并使其对称(4K 大小)使其与所有页面相同。现在这个 4k 页面可以是四个 ARM MMU L2 页面 tables。但是,我们需要一些额外的信息来模拟 dirtyyoungaccessed 位 Linux 需要通用 MMU 代码。所以Linux L2(PTE目录)的布局是,

  1. Linux PTE [n]
  2. Linux PTE [n+1]
  3. ARM PTE [n]
  4. ARM PTE [n+1]

在 L1 级别,每个条目都是成对的 (n/n+1),因此它指向上面的第 3 项和第 4 项。 pgtable-2level.h 文件对布局有详细的注释(对于您的 Linux 版本应该是正确的)。

参见:Tim's notes on ARM MM
Page table entry (PTE) descriptor in Linux kernel for ARM