ARM64的可配置的页面大小和虚拟地址位数是由ARM硬件决定的,不同的ARM版本,可选择的页面大小和地址位数也不一样。比如52位虚拟地址和物理地址是在ARMv8.2及之后的架构才支持的,ARMv8.2提供了两种重要的拓展:大虚拟寻址(LVA)和大物理寻址(LPA)。Linux从5.4开始支持ARM64的52位虚拟地址和物理地址。

在代码里,可以根据arch/arm64/Kconfig找到相应的组合,相应的页表级数也可由此得出。

1config PGTABLE_LEVELS
2    int
3    default 2 if ARM64_16K_PAGES && ARM64_VA_BITS_36
4    default 2 if ARM64_64K_PAGES && ARM64_VA_BITS_42
5    default 3 if ARM64_64K_PAGES && (ARM64_VA_BITS_48 || ARM64_VA_BITS_52)
6    default 3 if ARM64_4K_PAGES && ARM64_VA_BITS_39
7    default 3 if ARM64_16K_PAGES && ARM64_VA_BITS_47
8    default 4 if !ARM64_64K_PAGES && ARM64_VA_BITS_48
PAGE_SIZE VA_BITS PGTABLE_LEVELS
4K 39 3
4K 48 4
16K 36 2
16K 47 3
16K 48 4
64K 42 2
64K 48 3
64K 52 3