Windows 如何不对称地拆分其虚拟内存 space?
How can Windows split its virtual memory space asymmetrically?
根据AMD64 Architecture Programmer's Manual Volume 2 (system programming),一个逻辑地址只有当48-63位与47位全部相同时才有效:
5.3.1 Canonical Address Form
The AMD64 architecture requires implementations supporting fewer than the full 64-bit virtual address to ensure that those addresses are in canonical form. An address is in canonical form if the address bits from the most-significant implemented bit up to bit 63 are all ones or all zeros. If the addresses of all bytes in a virtual-memory reference are not in canonical form, the processor generates a general-protection exception (#GP) or a stack fault (#SS) as appropriate.
所以似乎唯一有效的地址范围是 0x0000_0000_0000_0000 ~ 0x0000_7FFF_FFFF_FFFF 和 0xFFFF_8000_0000_0000 ~ 0xFFFF_FFFF_FFFF_FFFF,即较低的 128 TiB 和较高的 128 TiB。但是,根据 MSDN,Windows x64 内核使用的地址似乎并非如此。
In 64-bit Windows, the theoretical amount of virtual address space is 2^64 bytes (16 exabytes), but only a small portion of the 16-exabyte range is actually used. The 8-terabyte range from 0x000'00000000 through 0x7FF'FFFFFFFF is used for user space, and portions of the 248-terabyte range from 0xFFFF0800'00000000 through 0xFFFFFFFF'FFFFFFFF are used for system space.
那么,尽管有硬件规格,Windows 如何将虚拟地址 space 分成较低的 8 TiB 和较高的 248 TiB?我想知道为什么它不会对检查地址是否规范的硬件造成任何问题。
**更新:** 微软似乎在 Windows 8.1 中修复了这个差异。有关详细信息,请参阅 https://www.facebook.com/codemachineinc/posts/567137303353192。
你是对的;当前支持 48 位虚拟地址的 x86-64 硬件要求高 16 位是低 48 位的符号扩展(即第 47 位匹配位 [63:48]
)。这意味着 0xFFFF0800'00000000
到 0xFFFFFFFF'FFFFFFFF
范围的大约一半在当前 x86-64 硬件上是非规范的。
Windows 只是在描述它如何分割完整的 64 位虚拟地址 space, 而不是 其中哪些部分实际在使用当前的 x86-64 硬件。它当然可以只使用规范的 128 TiB,从 0xFFFF8000'00000000
到 -1
。 (注意 8
的位置;它与全一的高 16 字节之间没有间隙,这与理论上的 Windows 范围不同。)
高端服务器可以构建 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,因此如果没有足够的虚拟地址 space 来映射所有在我们拥有超过 128TiB 物理 RAM 的系统之前,RAM(就像过去 PAE 在仅 32 位系统上的糟糕日子一样)。
根据AMD64 Architecture Programmer's Manual Volume 2 (system programming),一个逻辑地址只有当48-63位与47位全部相同时才有效:
5.3.1 Canonical Address Form
The AMD64 architecture requires implementations supporting fewer than the full 64-bit virtual address to ensure that those addresses are in canonical form. An address is in canonical form if the address bits from the most-significant implemented bit up to bit 63 are all ones or all zeros. If the addresses of all bytes in a virtual-memory reference are not in canonical form, the processor generates a general-protection exception (#GP) or a stack fault (#SS) as appropriate.
所以似乎唯一有效的地址范围是 0x0000_0000_0000_0000 ~ 0x0000_7FFF_FFFF_FFFF 和 0xFFFF_8000_0000_0000 ~ 0xFFFF_FFFF_FFFF_FFFF,即较低的 128 TiB 和较高的 128 TiB。但是,根据 MSDN,Windows x64 内核使用的地址似乎并非如此。
In 64-bit Windows, the theoretical amount of virtual address space is 2^64 bytes (16 exabytes), but only a small portion of the 16-exabyte range is actually used. The 8-terabyte range from 0x000'00000000 through 0x7FF'FFFFFFFF is used for user space, and portions of the 248-terabyte range from 0xFFFF0800'00000000 through 0xFFFFFFFF'FFFFFFFF are used for system space.
那么,尽管有硬件规格,Windows 如何将虚拟地址 space 分成较低的 8 TiB 和较高的 248 TiB?我想知道为什么它不会对检查地址是否规范的硬件造成任何问题。
**更新:** 微软似乎在 Windows 8.1 中修复了这个差异。有关详细信息,请参阅 https://www.facebook.com/codemachineinc/posts/567137303353192。
你是对的;当前支持 48 位虚拟地址的 x86-64 硬件要求高 16 位是低 48 位的符号扩展(即第 47 位匹配位 [63:48]
)。这意味着 0xFFFF0800'00000000
到 0xFFFFFFFF'FFFFFFFF
范围的大约一半在当前 x86-64 硬件上是非规范的。
Windows 只是在描述它如何分割完整的 64 位虚拟地址 space, 而不是 其中哪些部分实际在使用当前的 x86-64 硬件。它当然可以只使用规范的 128 TiB,从 0xFFFF8000'00000000
到 -1
。 (注意 8
的位置;它与全一的高 16 字节之间没有间隙,这与理论上的 Windows 范围不同。)
高端服务器可以构建 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,因此如果没有足够的虚拟地址 space 来映射所有在我们拥有超过 128TiB 物理 RAM 的系统之前,RAM(就像过去 PAE 在仅 32 位系统上的糟糕日子一样)。