MMU:AARCH64 中的长描述符页表大小

Posted

技术标签:

【中文标题】MMU:AARCH64 中的长描述符页表大小【英文标题】:MMU: Long descriptor page table sizes in AARCH64 【发布时间】:2018-10-29 18:41:35 【问题描述】:

我想了解,AARCH64 中每个级别的内存都被 4k 粒度的页表覆盖。

使用 47 位 VA,1 可以有 0 级到 3 级。

在级别 0 可能有一个表描述 512 个级别 1 页表, 现在每个 1 级页表可以描述 512 个 2 级页表,并且每个 2 级页表可以描述 512 个 3 级页表。

所以在第 3 级有 512 个大小为 4k 的页表,覆盖的内存为 512*4k = 2MB ,这是只有第 2 级的一个页表可以覆盖的内容,如果我们在第 2 级有 512 个这样的级别页表那么覆盖的总内存是 512*2MB = 1GB,对吗?

类似的方式,1 级的每个表都指向 512 个 2 级页表(其中每个 2 级页故事覆盖 2MB)。

所以,512*2MB= 1GB,如果我们有 512 个 1 级页表,覆盖的总内存是 512 GB,对吧?

类似的方法,0级覆盖的总内存是1024 GB,对吧?

【问题讨论】:

【参考方案1】:

您似乎在某一时刻将单个页表条目与整个页表混合在一起,不知何故丢失了一层并且添加了一点而不是减去它。 p>

单页:4'096 3 级表:4096*512 = 2'097'152 = 2MB 2级表:4096*512*512 = 1'073'741'824 = 1GB 1级表:4096*512*512*512 = 549'755'813'888 = 512GB 0级表:4096*512*512*512*512 = 281'474'976'710'656 = 256TB

请注意,上述内容适用于 48 位地址。也就是说,从地址开始,12 位用于页偏移,4 乘以 9 位作为页表索引 (12 + 4*9 = 48)。 对于 47 位,您在 0 级表中只有 256 个条目,因此您最终会获得 128TB 的可寻址内存。

【讨论】:

感谢@Siguza 的回复。但是在第 3 级不是有 512 个页表,每个页表都覆盖 2MB 内存,所以在第 3 级覆盖的总内存是 1 GB 吗? 在级别 0 上有一个页表。 1 级有 512,2 级有 262144,3 级有 134217728。

以上是关于MMU:AARCH64 中的长描述符页表大小的主要内容,如果未能解决你的问题,请参考以下文章

SylixOS中ARM架构的MMU实现分析

arm9_MMU

架构学习之AArch64内存模型

Linux内核——内存管理

ARM-V8的AA64与ARM-V7 LPAE的MMU Table差距多少?

armv8 memory translation