memory-management - ARM Linux 页表布局

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

我已经阅读了多篇有关该主题的文章,包括以下内容,但对我来说仍然很模糊: 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 级 HW 页表一个)。

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

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

最佳答案

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

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

关于memory-management - ARM Linux 页表布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343748/

相关文章:

linux - 如何确定R中当前工作区中所有对象的大小? (不在 Windows 中)

c - 在函数外释放内存会导致双重释放或损坏错误

linux-kernel - 为什么交换关闭时我的 pte 不显示页面

c - float 的原子操作

linux - 如何从 Ubuntu 18.04 中删除 notepad++ 软件包?

haskell io流内存

linux - 增加 Linux 中 TCP/IP 连接的最大数量

linux - 如何列出被内核杀死的线程?

c - STATUS_PENDING 是什么意思?

c - 如何在列表中的句柄上使用 free?-> C -> Windows API