当前ARM只有64KB粒度页表支持52bit
ARMv8.2架构支持到52bit了,但仅有64KB粒度的页表才支持
ARMv9架构则4k和16k翻译粒度也支持52bit,这里简单理解一下。
参考文献
技术|理解 ARM64 内核中对 52 位虚拟地址的支持
Linux内存管理:虚拟地址空间 - 知乎
ARM-translation table walk_赵不胖的博客-CSDN博客
为什么64位机指针只用48个位? - 知乎
为什么64位的架构,并没有支持64位的地址空间?
实现如此巨大的地址宽度只会增加系统的复杂度和地址转换的成本,带不来任何好处。AMD因此决定,在对这一架构的首次实现中,只有虚拟地址的最低48位才会在地址转换(页表查询)时被使用。
一个表示虚拟内存地址的64位指针只有低48位有效并带符号扩展到64位——换句话说,其高16位必须是全1或全0,而且必须与低48位的最高位(第47位)一致,否则通过该地址访问内存会产生#GP异常(general-protection exception)
不考虑大页的情况下,每一级4K大小的页表可以保存512项(每项8字节,64位,4096/8=512),对于一个48位地址来说,低4K地址(12位)是页内偏移,之后每多一级页表,地址范围增加9位,所以可以得到下面的规律:
一级页表:9+12=21位地址,最大地址2MB
二级页表:9+9+12=30位地址,最大地址1GB
三级页表:9+9+9+12=39位地址,最大地址512GB
四级页表:9+9+9+9+12=48位地址,最大地址256TB
五级页表:9+9+9+9+9+12=57位地址,最大地址128PB
六级页表:9+9+9+9+9+9+12=66位地址,超过64位,最大地址128EB
- 为啥是 9 bit 一级?4KB/8B = 0.5K = 9 bit
ARMv8.2 架构的 LVA 和 LPA 拓展
ARMv8.2 架构提供两种重要的拓展:大虚拟寻址(LVA)和大物理寻址(LPA)。
当使用 64 KB 转换粒度时,ARMv8.2-LVA 为每个翻译表基地址寄存器提供了一个更大的 52 位虚拟地址空间。
- 当使用 64 KB 转换粒度时,中间物理地址(IPA)和物理地址空间拓展为 52 位。
- 如果使用 64 KB 转换粒度来实现对 52 位物理地址的支持,那么一级块将会覆盖 4TB 的地址空间。
需要注意的是这些特性仅在 AArch64 架构中支持。
伴随着 ARMv8.2 拓展增加了对 LVA 地址的支持(仅当以页大小为 64 KB 运行时可用),在第一级转换中,描述符的数量会增加。
ARMv9 架构的 LVA2 和 LPA2 拓展
这里需要看最新的ARM架构手册,可以看到,现在进一步增加对4K和16K翻译粒度的52bit地址空间支持。