我相信你在谈论x86-64,我的答案基于该架构。
当Intel引入PAE时,他们需要4个更多的位(当时PAE是36位),逻辑上应该加倍每个条目的大小,因为这会创建比40位表项更有效的布局。
这给了Intel很多空余的空间,他们将其标记为保留(这可以在早期版本的Intel SDM手册中更好地观察到,像这样)。
随着时间的推移,条目中需要新的属性,其中最著名的是XD/NX位。
保护密钥也是一个相对较新的功能,占据条目中的空间。
这表明,当前ISA不再可能实现完整的64/64位虚拟/物理翻译。
作为视觉参考,这是64位PAE表条目的格式:
它表明64位物理地址不可能(对于大页面仍有一种方法可以解决,但考虑到位的布局,这似乎不太可能),但没有解释为什么AMD将限制设置为52位。忽略的位数越少,操作系统可以存储的信息就越少,这可能会使它们在现今变得更慢。
保留的位数越少,当物理地址空间的限制在几年后被达到时,页表条目格式可能再次需要改变。
32位x86 CPU多年来具有36位物理地址空间,因此物理地址空间可能比虚拟地址空间大,但在操作系统层面上是很麻烦的。我不相信有任何计划发布一个物理地址空间大于虚拟地址空间的x86-64 CPU。英特尔最近推出了5级分页,将虚拟地址空间增加到257字节。他们的白皮书说,英特尔处理器的物理地址大小由CPUID返回,EAX=80000008h:
我从中了解到,目前他们没有计划更改页面表格格式以支持超过252字节的RAM,并且他们也没有计划支持大于虚拟地址空间四分之一的物理地址空间。后者是有道理的,因为只有一半的虚拟地址空间是为内核而设计的,如果全部填满RAM可能会不方便。支持Intel 64架构的处理器对于这个值最多枚举46。支持5级分页的处理器预计会枚举更高的值,最高可达52。
AMD的架构手册第二卷,版本3.38(2021年11月)表示:
“[T]he page-translation mechanism can be extended to support 52-bit physical addresses. [...] Currently, the AMD64 architecture supports 40-bit addresses in this mode, allowing up to 1 terabyte of physical-address space to be supported.”
AMD似乎还没有5级分页。
shl rax,16
/sar rax,16
进行重新符号扩展。 (或者更好的是,让您的程序仅在规范范围的低半部分分配标记指针,这样您就可以只使用and
或 BMI2andn
来使地址规范化)。 更好的是,仅在虚拟地址空间的低4G中分配,以便您可以使用地址大小(0x67)前缀忽略高垃圾,或者在操纵指针时使用32位操作数大小进行自由零扩展。 - Peter Cordesmmap(MAP_32BIT)
等效的mmap(MAP_48BIT)
标志,以便希望将高 16 用于自己目的的程序可以继续使用。仅使用高字节可能更安全,因为即使采用内存映射的非易失性存储(例如 DIMM 上的快于闪存的存储器),也不太可能在虚拟空间远远超过物理空间。 - Peter Cordes