为什么x86-64系统只有48位虚拟地址空间?

时间:2011-07-16 11:09:23

标签: x86-64 cpu-architecture virtual-memory processor-architecture

在一本书中,我读了以下内容:

  

32位处理器有2 ^ 32个可能的地址,而当前的64位处理器有48位地址空间

我的期望是,如果它是64位处理器,地址空间也应该是2 ^ 64。

所以我想知道这种限制的原因是什么?

10 个答案:

答案 0 :(得分:115)

因为这就是所需要的。 48位为您提供256太字节的地址空间。好多啊。你不会很快看到一个需要更多系统的系统。

因此CPU制造商采取了捷径。它们使用的指令集允许完整的64位地址空间,但是当前的CPU只使用较低的48位。另一种选择是浪费晶体管来处理更大的地址空间,这是多年来不需要的。

因此,一旦我们接近48位限制,只需释放处理完整地址空间的CPU,但不需要对指令集进行任何更改,也不会破坏兼容性。 / p>

答案 1 :(得分:17)

任何关于总线大小和物理内存的答案都有些误解,因为OP的问题是关于虚拟地址空间而不是物理地址空间。例如,对某些386的所谓类似限制是他们可以使用的物理内存的限制,而不是虚拟地址空间,它总是一个完整的32位。原则上,即使只有几MB的物理内存,您也可以使用完整的64位虚拟地址空间;当然,你可以通过交换,或者你想在大多数地址映射同一页面的专门任务(例如某些稀疏数据操作)来实现这一目的。

我认为真正的答案是AMD只是很便宜,希望现在没有人会关心,但我没有提到引用。

答案 2 :(得分:9)

阅读wikipedia article

的限制部分
  

一台PC不能包含4PB的内存(由于当前内存芯片的大小,如果没有其他内容),但AMD设想大型服务器,共享内存集群,以及在可预见的未来可能接近这个的物理地址空间的其他用途, 52位物理地址提供了充足的扩展空间,同时不会产生实现64位物理地址的成本

也就是说,此时没有必要实现完整的64位寻址,因为我们无法构建一个可以完全利用这样一个地址空间的系统 - 所以我们选择一些对今天(和明天的)系统来说很实用的东西。

答案 3 :(得分:9)

内部本机寄存器/操作宽度不需要反映在外部地址总线宽度中。

假设你有64位处理器,只需要访问1兆字节的RAM。只需一个20位地址总线。为什么要担心您不会使用的所有额外引脚的成本和硬件复杂性?

摩托罗拉68000是这样的;内部32位,但带有23位地址总线(和16位数据总线)。 CPU可以访问16兆字节的RAM,并且加载本机数据类型(32位)需要两次内存访问(每个访问带有16位数据)。

答案 4 :(得分:6)

有一个比在CPU地址路径中保存晶体管更严重的原因:如果增加地址空间的大小,则需要增加页面大小,增加页面表的大小,或者有更深的页表结构(即更多级别的转换表)。所有这些都增加了TLB未命中的成本,这会损害性能。

答案 5 :(得分:6)

从我的角度来看,这是页面大小的结果。每个页面最多包含4096/8 = 512个页面表项。并且2 ^ 9 = 512。所以9 * 4 + 12 = 48。

答案 6 :(得分:3)

要回答最初的问题:不需要添加超过48位的PA。

服务器需要最大的内存量,所以我们尝试更深入地研究。

1)最大(常用)服务器配置是8套接字系统。 8S系统只不过是8个服务器CPU,它们通过高速一致的互连(或简称为高速“总线”)相连,形成一个节点。那里有更大的集群,但它们之间相距甚远,我们在这里谈论的是常用配置。请注意,在实际使用中,2套接字系统是最常用的服务器之一,而8S通常被认为是非常高端的。

2)服务器使用的主要内存类型是字节可寻址的常规DRAM内存(例如DDR3 / DDR4内存),内存映射IO-MMIO(例如附加卡使用的内存)以及配置空间用于配置系统中存在的设备。第一种类型的存储器通常是最大的类型(因此需要最大数量的地址位)。根据系统的实际配置,某些高端服务器也会使用大量的MMIO。

3)假设每个服务器CPU可以在每个插槽中容纳16个DDR4 DIMM。 DDR4 DIMM的最大大小为256GB。 (根据服务器的版本,每个插槽可能的DIMM数量实际上少于16个DIMM,但为示例起见,请继续阅读。)

因此,每个插槽理论上可以具有16 * 256GB = 4096GB = 4 TB。 对于我们的示例8S系统,DRAM大小最大为4 * 8 = 32 TB。这意味着 寻址此DRAM空间所需的最大位数为45(= log2 32TB / log2 2)。

我们将不讨论其他类型的内存(MMIO,MMCFG等)的详细信息,但这里的要点是,对于当今拥有最大类型的DDR4 DIMM的8插槽系统,最“需求”的类型的内存(256 GB DIMM)仅使用45位。

对于支持48位(例如WS16)的OS,还有(48-45 =)3个剩余位。 这意味着,如果仅将低45位用于32TB DRAM,我们仍然有2 ^ 3倍的可寻址内存,可用于MMIO / MMCFG,总共有256TB的可寻址空间。

因此,总结一下: 1)48位的物理地址足以支持当今最大的系统,这些系统已“满载”了大量的DDR4,以及许多其他需要MMIO空间的IO设备。确切地说是256TB。

请注意,此256TB地址空间(= 48位物理地址)不包括SATA驱动器之类的任何磁盘驱动器,因为它们不是地址映射的一部分,它们仅包括可字节寻址的内存,并且暴露于操作系统。

2)CPU硬件可以选择实现46位,48位或> 48位,具体取决于服务器的生成。但是另一个重要因素是操作系统可以识别多少位。 今天,WS16支持48位物理地址(= 256 TB)。

这对用户意味着,即使拥有大型超现代服务器CPU可以支持> 48位寻址,但是如果您运行的操作系统仅支持48位PA,那么您只能利用256 TB。

3)总而言之,有两个主要因素可以利用更多的地址位(=更多的存储容量)。

a)您的CPU硬件支持多少位? (这可以通过Intel CPU中的CPUID指令确定。)

b)您正在运行哪个OS版本以及它可以识别/支持多少PA。

(a,b)的最小值将最终确定系统可以利用的可寻址空间量。

我写此回复时没有详细研究其他回复。另外,我没有详细研究MMIO,MMCFG的细微差别以及整个地址映射结构。但我确实希望这会有所帮助。

谢谢, Anand K Enamandram, 服务器平台架构师 英特尔公司

答案 7 :(得分:1)

仅使用64位VA的低位48位并不是真的,至少使用Intel 64.高16位是使用的,有点像。

第3.3.7.1节英特尔®64和IA-32架构软件开发人员手册中的典型寻址说:

  

规范地址必须将第63到48位设置为0或1(取决于第47位是零还是一位)

因此,第47位至第63位形成一个超级位,全部为1或全部为0.如果地址不是规范形式,则实现应该是错误的。

在AArch64上,这是不同的。根据 ARMv8指令集概述,它是一个49位VA。

  

AArch64内存翻译系统支持49位虚拟地址(每个转换表48位)。虚拟地址从49位进行符号扩展,并存储在64位指针中。可选地,在系统寄存器的控制下,64位指针的最高8位可以保存“标记”,当用作加载/存储地址或间接分支的目标时将忽略该标记

答案 8 :(得分:1)

许多人都有这种误解。但是我向您保证,如果您仔细阅读本文,在阅读完所有这些错误观念后,这些错误就会消除。

要说32位或64位处理器并不意味着它应该分别具有32位地址总线或64位地址总线!...我重复一遍!

32位处理器意味着它具有32位ALU(算术和逻辑单元)...这意味着它可以在32位二进制操作数上运行(或者简单地说是具有32位的二进制数),而类似地64位处理器可以在32位二进制操作数上运行64位二进制操作数。因此,使用32位或64位处理器并不意味着可以安装最大内存量。它们只是显示操作数有多大...(类推,您可以想到一个10位的计算器最多可以计算10位的结果...它不能给我们11位或任何其他更大的结果...尽管它是以十进制表示,但为了简单起见,我在讲这个类比)...但是您要说的是地址空间,即最大可直接接口存储的内存(RAM)。 RAM的最大可能大小由地址总线的大小决定,而不是数据总线的大小,甚至不是定义处理器大小(32/64位)的ALU的大小。是的,如果处理器具有32位“地址总线”,那么它能够寻址2 ^ 32字节= 4GB的RAM(或者对于64位,它将为2 ^ 64)...但是说32位或64位处理器具有与该地址空间无关(地址空间=它可以访问内存的距离或RAM的最大大小),并且仅取决于其ALU的大小。当然,数据总线和地址总线的大小可能相同,然后似乎32位处理器意味着它将访问2 ^ 32字节或4 GB内存...但这只是一个巧合,而且不会相同对于所有...。例如,Intel 8086是一个16位处理器(因为它具有16位ALU),因此您可以说它应该访问2 ^ 16字节= 64 KB的内存,但这不是事实。拥有20位地址总线,它最多可以访问1 MB的内存。...如果有任何疑问,可以用Google搜索:)

我想我已经阐明了我的观点。现在问您一个问题……因为64位处理器并不意味着它必须具有64位地址总线,因此在一个64位处理器中没有48位地址总线没有什么不对。 64位处理器...它们保持较小的地址空间,以降低设计和制造的成本。...因为没有人会使用如此大的内存(2 ^ 64字节)...如今2 ^ 48字节已绰绰有余

答案 9 :(得分:0)

CPU主要根据其数据总线的大小以及其大部分实体(内部体系结构)被视为“ N位” :寄存器,累加器,算术逻辑单元(ALU) ),指令集等。例如:老式的Motorola 6800(或Intel 8050)CPU是8位CPU。它具有8位数据总线,8位内部体系结构和16位地址总线。


  • 尽管N位CPU可能具有除N尺寸实体以外的其他实体。例如6809在6800之上的改进(它们都是具有8位数据总线的8位CPU)。在6809中引入的重大改进包括使用两个8位累加器(A和B,可以组合成一个16位寄存器D),两个16位索引寄存器(X,Y)和两个16位堆栈指针。