我已经阅读了多篇关于这个主题的文章,包括以下文章,但对我来说仍然有些模糊:
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个附加条目(每个二级HW页面表一个)。
现在的问题是,Linux不强制执行PGD/PMD/PTE大小(但强制页面大小为4K。因此将PAGE_SHIFT设置为12),那么为什么要选择11-9-12布局(即为PGD选择11位,为HW PTE选择9位)。 这样做只是为了确保512HW +512Linux PTE对齐到页面边界吗?
如果有人能详细解释这个分配背后的逻辑,那就太好了....