Aarch64 上同时存在不同大小的页面
Simultaneous existence of different-sized pages on Aarch64
根据架构概述文档,Aarch64 支持 4k 和 64k 页面。一些 CPU 还支持 16k 页。查看地址转换方案的详细信息,我得出的结论是,此类 CPU 不支持同时存在不同大小的页面 (不像 x86_64 允许的那样)。我说得对吗?
你在这里混淆了两个不同但相关的东西 - 页面大小与粒度。
在 AArch64 中,您有 3 种可能的翻译颗粒 可供选择,每一种都会产生一组不同的页面大小:
- 4KB 颗粒:4KB、2MB 和 1GB 页面。
- 16KB 颗粒:16KB 和 32MB 页面。
- 64KB 颗粒:64KB 和 512MB 页面。
翻译颗粒总体上定义了翻译机制的各种属性,因此它适用于一整套 tables,并且你是正确的,因为你不能在一个范围内混合和匹配颗粒table,尽管同时对 不同的 table 使用不同的颗粒是完全没问题的(例如,在不同的异常级别)。
相比之下,x86 始终具有 4KB 粒度,但提供的页面大小范围因模式而异:
- 32 位:4KB 和 4MB 页面。
- PAE:4KB 和 2MB 页面。
- 64 位:4KB、2MB 和(如果支持)1GB 页面。
在这两种情况下,大于基本粒度的页面大小表示中间 table 级别的块条目。也就是说,使用普通的4KB颗粒,3-level*,例子:
- 第一级中的每个有效条目 table 指向自然对齐的 1GB 内存区域,或第二级 table 描述该 1GB 地址 space .
- 二级 table 中的每个有效条目指向自然对齐的 2MB 内存区域,或描述该 2MB 地址的三级 table space .
- 第三级中的每个有效条目 table 指向自然对齐的 4KB 内存区域。
* 根据实际地址 space 的大小,在这之上可能有第零级 table,但两种架构都不允许在该级别的块条目(无论如何,它们将不切实际地巨大)。对于 AArch64,较大的颗粒仅支持 block/page 级别 2 和 3 的条目,而 64KB 的颗粒根本没有级别 0。
根据架构概述文档,Aarch64 支持 4k 和 64k 页面。一些 CPU 还支持 16k 页。查看地址转换方案的详细信息,我得出的结论是,此类 CPU 不支持同时存在不同大小的页面 (不像 x86_64 允许的那样)。我说得对吗?
你在这里混淆了两个不同但相关的东西 - 页面大小与粒度。
在 AArch64 中,您有 3 种可能的翻译颗粒 可供选择,每一种都会产生一组不同的页面大小:
- 4KB 颗粒:4KB、2MB 和 1GB 页面。
- 16KB 颗粒:16KB 和 32MB 页面。
- 64KB 颗粒:64KB 和 512MB 页面。
翻译颗粒总体上定义了翻译机制的各种属性,因此它适用于一整套 tables,并且你是正确的,因为你不能在一个范围内混合和匹配颗粒table,尽管同时对 不同的 table 使用不同的颗粒是完全没问题的(例如,在不同的异常级别)。
相比之下,x86 始终具有 4KB 粒度,但提供的页面大小范围因模式而异:
- 32 位:4KB 和 4MB 页面。
- PAE:4KB 和 2MB 页面。
- 64 位:4KB、2MB 和(如果支持)1GB 页面。
在这两种情况下,大于基本粒度的页面大小表示中间 table 级别的块条目。也就是说,使用普通的4KB颗粒,3-level*,例子:
- 第一级中的每个有效条目 table 指向自然对齐的 1GB 内存区域,或第二级 table 描述该 1GB 地址 space .
- 二级 table 中的每个有效条目指向自然对齐的 2MB 内存区域,或描述该 2MB 地址的三级 table space .
- 第三级中的每个有效条目 table 指向自然对齐的 4KB 内存区域。
* 根据实际地址 space 的大小,在这之上可能有第零级 table,但两种架构都不允许在该级别的块条目(无论如何,它们将不切实际地巨大)。对于 AArch64,较大的颗粒仅支持 block/page 级别 2 和 3 的条目,而 64KB 的颗粒根本没有级别 0。