我读过多篇关于这个主题的文章,包括下面的文章,但我仍然不太清楚:分配
ARM硬件在L1转换表中有4字节的4096个条目。每个条目在内存中转换一个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布局(即11位用于PGD,9位用于HW )。这仅仅是为了确保512 to +512 512Linux与页面边界对齐吗?
如果有人能详细解释这一分工背后的逻辑,那就太好了.
发布于 2016-07-13 22:06:19
正如您所说,在ARM短描述符格式中,每个二级页面表的大小为1KB。即使相关的影子页表只有2KB,这意味着分配给二级表的每一个页面的50%将被完全浪费。
Linux只是假装节的大小是2MB,而不是硬件的实际1MB,方法是对第一级条目进行成对分配,这样相应的第二级表可以放在一个页面中,避免浪费,并使页表内存的管理非常简单。
发布于 2016-07-16 14:29:17
ARM Linux和脏位应该有所有的答案。主要是,PTE表有额外的信息来模拟导致您观察到的布局的位。
我认为误解是L2表所占用的内存与它映射的内存。必须为一个表分配物理内存,并使其对称(4K大小),使其与所有页面相同。现在这个4k页面可以是四个ARM MMU L2页面表。但是,我们需要一些额外的信息来模拟Linux通用MMU代码所需的脏、年轻和访问比特。所以Linux L2 (PTE目录)的布局是,
在L1级别上,对每个条目(n/n+1)进行配对,以便指向上面的第3项和第4项。pgtable-2level.h文件对布局有详细的注释(对于您版本的Linux来说应该是正确的)。
请参阅:蒂姆关于ARM MM的笔记
https://stackoverflow.com/questions/38343748
复制相似问题