【发布时间】:2016-07-13 06:04:19
【问题描述】:
我已经阅读了有关此主题的多篇文章,包括以下文章,但对我来说仍然很模糊: http://elinux.org/Tims_Notes_on_ARM_memory_allocation
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