根据《 AMD64体系结构程序员手册》第2卷(系统编程),仅当位48-63与位47相同时,逻辑地址才有效:
因此,似乎唯一有效的地址范围是0x0000_0000_0000_0000〜0x0000_7FFF_FFFF_FFFF和0xFFFF_8000_0000_0000〜0xFFFF_FFFF_FFFF_FFFF,即较低的128 TiB和较高的128 TiB。但是,根据MSDN,Windows x64内核使用的地址似乎并非如此。
那么,尽管硬件规范不同,Windows如何将虚拟地址空间拆分为较低的8 TiB和较高的248 TiB?我想知道为什么它不会对检查地址是否规范的硬件造成任何问题。
**更新:**好像Microsoft在Windows 8.1中修复了此差异。有关详细信息,请参见https://www.facebook.com/codemachineinc/posts/567137303353192。
最佳答案
你是对的;当前具有48位虚拟地址支持的x86-64硬件要求高16位是低48的符号扩展(即,位47与[63:48]
位匹配)。这意味着在当前x86-64硬件上,大约0xFFFF0800'00000000
到0xFFFFFFFF'FFFFFFFF
范围的一半是非规范的。
Windows只是在描述它如何划分完整的64位虚拟地址空间,而不是当前x86-64硬件上实际使用的部分。当然,它只能使用从0xFFFF8000'00000000
到-1
的规范的128 TiB。 (请注意8
的位置;与理论上的Windows范围不同,它与全高16个字节之间没有间隙。)
高端服务器可以使用6TiB甚至更多的RAM构建。 (Xeon Platinum Scalable Processors显然每个插槽最多提供1.5TiB,最多8路,例如8180M)。
英特尔已经提出了对更大的物理和虚拟寻址的扩展,该扩展添加了另一级页表https://software.intel.com/sites/default/files/managed/2b/80/5-level_paging_white_paper.pdf,因此希望操作系统在没有足够的虚拟地址空间来映射所有RAM的情况下不会卡住(例如在32位PAE的糟糕年代)位系统)之前,我们需要拥有超过128TiB的物理RAM的系统。