【问题标题】:ARM Linux Page tables layoutARM Linux 页表布局
【发布时间】:2016-07-13 06:04:19
【问题描述】:

我已经阅读了有关此主题的多篇文章,包括以下文章,但对我来说仍然很模糊: 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 字节。每个条目翻译内存中的 1MB 区域。在第二级,它有 256 个条目,每个条目 4 个字节。每个二级条目在内存中转换一个 4KB 页面。 所以根据这个任何虚拟地址都必须分成12-8-12才能映射到上述方案。

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

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

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

【问题讨论】:

    标签: memory-management linux-kernel operating-system arm virtual-memory


    【解决方案1】:

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

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

    【讨论】:

    • 为什么 Linux 不能假装段大小为 4MB 并在一页中保留四个二级页表?
    • 它可以,但是它还需要在某个地方为 4 个影子页表跟踪第二页。这可能不值得费心。
    • pretend 有点误导。通用 MMU 层被告知 L1 条目为 2MB。 ARM MMU 代码知道物理硬件。挑战是将 ARM MMU 硬件(ARM CPU 系列之间不同)映射到通用 Linux MMU 代码/API。它不能使用 4MB 的部分,因为添加了管理/模拟 dirtyyoungaccessed 位的细节。
    • @artlessnoise "通用 MMU 层被告知 L1 条目为 2MB..." - 相当;拱门代码"behave(s) so as to make it appear that (the section size is 2MB) when in fact it is not"。我看不出这有什么误导...
    • 是的,但是假装没有回答这个问题如果有人能详细解释这个划分背后的逻辑会很棒不是计算机科学术语(感谢任何方式的字典参考)。顺便说一句,我投了你一半的答案。
    【解决方案2】:

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

    我认为一个误解是 L2 表占用的内存与其映射的内存。您必须为 L2 表分配 物理 内存并使其对称(4K 大小)使其与所有页面相同。现在这个 4k 页可能是四个 ARM MMU L2 页表。但是,我们需要一些额外的信息来模拟 Linux 通用 MMU 代码所需的 dirtyyoungaccessed 位。所以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 文件在布局上有详细的 cmets(对于您的 Linux 版本应该是正确的)。

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

    【讨论】:

    • 感谢大家的宝贵反馈。因此,总而言之,arm h/w 和 linux pte 的排列是因为 linux 需要有额外的位进行管理,而且通过将它们安排在一个 4KB 的页面内,我们只需要引用一个页面。否则我们将不得不访问两个页面,一个用于 h,一个用于 linux pte。但这真的很重要,因为内核页表永远不会被换出吗?
    • 还有一点,我不太清楚。 ARM hw 将始终使用 hw pte,这是否意味着 Linux pte 将仅供 Linux 内部使用?假设在我的代码中,我引用了一些内存位置,其中设置了正确的 hw 和 linux 的页表,那么只要 cpu 访问这个地址,ARM hw 就会自动使用 HW 页表,并且基于 hw 页表中的权限将允许或禁止我访问。问题是在这种情况下,Linux pte 有什么用......它们似乎没用??
    • Linux 仅使用 Linux PTE 值(主要);这就是为什么他们是第一位的。有一个 commit 操作,CPU MMU 层会将 Linux PTE 转换为 hw PTE。一些引用的问题暗示了这一点。交换并不重要(MMU 使用物理地址,但管理它们的 CPU 使用虚拟地址)所以它们必须是物理存在的。但是,当组合在一起时,TLB 访问将减少。如前所述,它降低了代码的复杂性。一切都处理 4k 页面。 Linux PTE 值由通用 MM/MMU 代码使用。 Linux 内核需要它们。 CPU 需要硬件 PTE。
    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多