kir*_*off 2 memory cpu cache virtual-memory
某些处理器支持 46 位物理地址和 48 位虚拟地址。为什么是 46 位,为什么是 48 位?x86不应该支持64位地址吗?为什么虚拟地址与物理地址的长度不同?
是否应该将应用程序调整为使用 46/48 物理/虚拟地址?大多数应用程序都支持它吗?
小智 5
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 的重要目标。)
增加物理地址空间会增加缓存标签的大小(在常见的物理标记缓存中)并引入其他开销。如果这些地址对系统的预期用途没有用处,这些成本将直接降低盈利能力。(也可能有一些限制容量的激励措施,以鼓励未来的升级。)