有些处理器支持 46 位的物理地址和 48 位的虚拟地址。为什么是 46 位,为什么是 48 位?x86 不应该支持 64 位地址吗?为什么虚拟地址的长度与物理地址不一样?
是否应调整应用程序以使用 46/48 物理/虚拟地址?大多数应用程序都支持它吗?
答案1
x86-64 的 48 位虚拟地址限制取决于页表层次结构的深度。使用 4 KiB 页和 64 位页表条目,页表的每个级别使用 9 位。使用三次查找将提供 39 位虚拟地址,这大概被认为是一种过于短期的解决方案,因为增加级别需要操作系统支持。使用四次查找可提供 48 位虚拟地址空间。
添加级别往往会增加 TLB 未命中的延迟(尽管也可以缓存中间节点以减少延迟如果在这些缓存中有一个命中,因为查找是相互依赖的。
就物理地址限制而言,页表条目为 64 位,包含访问权限和其他信息(9 位:存在、读/写、用户/管理员、页面级直写、页面级缓存禁用、访问、脏、PAT 和全局)。x86-64 页表条目目前定义为包含 14 位,可供操作系统使用 [9:11, 52:62],并被硬件忽略。这样剩下 41 位可用于指定页码,这(给定 4 KiB 页)支持 53 位物理地址。
选择支持比页表条目格式所支持的更小的物理地址空间是特定于实现的。提供大于虚拟地址空间的物理地址空间会给操作系统带来问题,特别是对于那些将整个物理地址空间映射到虚拟地址空间的操作系统。
对于带有集成内存控制器的处理器,内存通道数量和支持的内存类型是固定的,这对最大内存容量有显著的限制。添加更多带有内存控制器的芯片会带来扩展问题,尤其是在延迟方面。(具有较大 NUMA 因子的系统可能很有用,但此类系统不是 x86-64 的重要目标。)
增加物理地址空间会增加缓存标记的大小(在通用物理标记缓存中),并带来其他开销。如果地址对于系统的预期用途没有用处,这些成本将直接降低盈利能力。(也可能存在一些限制容量以鼓励未来升级的激励措施。)
答案2
44 位在 64 位 Windows 版本中使用,直到 Windows 8.1(之前2014 年 11 月更新汇总)使内存管理更加容易。由于Windows 8.1 2014 年 11 月更新或 Windows 10,Windows 现在使用 64 位虚拟地址. 有了更大的地址空间,可以通过提供以下功能使 Windows 更加安全:Control Flow Guard (CFG)