根据AMD64体系结构程序员手册第2卷(系统编程),仅当位48-63与位47相同时,逻辑地址才有效:
5.3.1规范地址表格
AMD64体系结构要求实现支持的功能少于完整的64位虚拟地址,以确保这些地址采用规范形式。如果从最高有效位到位63的地址位全为1或全为零,则该地址为规范形式。如果虚拟内存引用中所有字节的地址均非规范形式,则处理器会酌情生成一般保护异常(#GP)或堆栈错误(#SS)。
因此,似乎唯一有效的地址范围是0x0000_0000_0000_0000〜0x0000_7FFF_FFFF_FFFF和0xFFFF_8000_0000_0000〜0xFFFF_FFFF_FFFF_FFFF,即,较低的128 TiB和较高的128 TiB。但是,根据MSDN,Windows x64内核使用的地址似乎并非如此。
在64位Windows中,虚拟地址空间的理论量为2 ^ 64字节(16艾字节),但实际上仅使用了16艾字节范围的一小部分。从0x000'00000000到0x7FF'FFFFFFFF的8 TB范围用于用户空间,从0xFFFF0800'00000000到0xFFFFFFFF'FFFFFFFF的248 TB范围的部分用于系统空间。
那么,尽管硬件规格不同,Windows如何将虚拟地址空间划分为较低的8 TiB和较高的248 TiB?我想知道为什么它不会对检查地址是否规范的硬件造成任何问题。
**更新:**好像Microsoft在Windows 8.1中修复了此差异。有关详细信息,请参见https://www.facebook.com/codemachineinc/posts/567137303353192。
答案 0 :(得分:2)
您是对的;当前具有48位虚拟地址支持的x86-64硬件要求高16位是低48的符号扩展(即,位47与位[63:48]
匹配)。这意味着0xFFFF0800'00000000
到0xFFFFFFFF'FFFFFFFF
范围的大约一半在当前x86-64硬件上是非规范的。
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。