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 |