我在一本书中读到以下内容:
32 位处理器有 2^32 个可能的地址,而当前的 64 位处理器有 48 位地址空间
我的期望是,如果它是 64 位处理器,地址空间也应该是 2^64。
所以我想知道这个限制的原因是什么?
我在一本书中读到以下内容:
32 位处理器有 2^32 个可能的地址,而当前的 64 位处理器有 48 位地址空间
我的期望是,如果它是 64 位处理器,地址空间也应该是 2^64。
所以我想知道这个限制的原因是什么?
因为这就是我们所需要的。48 位为您提供 256 TB 的地址空间。好多啊。你不会很快看到一个需要更多的系统。
于是CPU厂商走捷径。它们使用允许完整的 64 位地址空间的指令集,但当前的 CPU 只使用低 48 位。另一种方法是浪费晶体管来处理多年来不需要的更大地址空间。
因此,一旦我们接近 48 位限制,只需释放处理完整地址空间的 CPU,但不需要对指令集进行任何更改,也不会破坏兼容性。
任何关于总线大小和物理内存的答案都有点错误,因为 OP 的问题是关于virtual address space而不是physical address space。例如,对某些 386 的所谓类似限制是对它们可以使用的物理内存的限制,而不是对虚拟地址空间的限制,虚拟地址空间始终是完整的 32 位。原则上,即使只有几 MB 的物理内存,您也可以使用完整的 64 位虚拟地址空间;当然,您可以通过交换来做到这一点,或者对于您希望在大多数地址映射同一页面的特殊任务(例如某些稀疏数据操作)。
我认为真正的答案是 AMD 只是便宜并且希望现在没有人会关心,但我没有可引用的参考资料。
阅读维基百科文章的限制部分:
一台 PC 不能包含 4 PB 的内存(由于当前内存芯片的大小,如果没有别的),但 AMD 设想了大型服务器、共享内存集群和物理地址空间的其他用途,在可预见的将来可能会接近这一点,而 52位物理地址提供了充足的扩展空间,同时不会产生实现 64 位物理地址的成本
也就是说,此时实现完整的 64 位寻址毫无意义,因为我们无法构建一个可以完全利用这样一个地址空间的系统——所以我们选择了对今天(和明天)系统实用的东西。
内部本地寄存器/操作宽度不需要反映在外部地址总线宽度中。
假设您有一个 64 位处理器,它只需要访问 1 兆字节的 RAM。只需要一个 20 位地址总线。为什么要为您不会使用的所有额外引脚的成本和硬件复杂性而烦恼?
摩托罗拉 68000 是这样的;内部为 32 位,但带有 23 位地址总线(和 16 位数据总线)。CPU 可以访问 16 兆字节的 RAM,并且要加载本机数据类型(32 位)需要两次内存访问(每个访问 16 位数据)。
除了在 CPU 地址路径中节省晶体管之外,还有一个更严重的原因:如果增加地址空间的大小,则需要增加页面大小、增加页表的大小,或者拥有更深的页表结构(即是更多级别的翻译表)。所有这些都会增加 TLB 未命中的成本,从而损害性能。
从我的角度来看,这是页面大小的结果。每页最多包含 4096/8 = 512 个页表条目。2^9 = 512。所以 9 * 4 + 12=48。
回答原始问题:无需添加超过 48 位的 PA。
服务器需要最大的内存量,所以让我们尝试更深入地挖掘。
1) 最大(常用)的服务器配置是 8 Socket 系统。一个 8S 系统只不过是 8 个服务器 CPU 通过高速相干互连(或简称为高速“总线”)连接起来形成一个单一节点。那里有更大的集群,但它们很少而且相距甚远,我们在这里讨论的是常用配置。请注意,在实际使用中,2 Socket 系统是最常用的服务器之一,而 8S 通常被认为是非常高端的。
2)服务器使用的主要内存类型有字节可寻址的常规DRAM内存(如DDR3/DDR4内存)、Memory Mapped IO - MMIO(如外挂卡使用的内存),以及用于配置的Configuration Space系统中存在的设备。第一种类型的内存通常是最大的(因此需要最大数量的地址位)。一些高端服务器也会使用大量的 MMIO,具体取决于系统的实际配置。
3) 假设每个服务器 CPU 可以在每个插槽中容纳 16 个 DDR4 DIMM。最大尺寸 DDR4 DIMM 为 256GB。(根据服务器的版本,每个插槽可能的 DIMM 数量实际上少于 16 个 DIMM,但为了示例,请继续阅读)。
所以每个socket理论上可以有16*256GB=4096GB=4TB。对于我们的示例 8S 系统,DRAM 大小可以最大为 4*8= 32 TB。这意味着寻址该 DRAM 空间所需的最大位数为 45 (=log2 32TB/log2 2)。
我们不会详细介绍其他类型的内存(MMIO、MMCFG 等),但这里的重点是,对于 8 插槽系统来说,最“要求”的内存类型具有当今可用的最大类型 DDR4 DIMM(256 GB) DIMM)仅使用 45 位。
对于支持 48 位的操作系统(例如 WS16),还有 (48-45=) 3 个剩余位。这意味着如果我们仅将低 45 位用于 32TB 的 DRAM,我们仍然有 2^3 倍的可寻址内存可用于 MMIO/MMCFG,总共 256 TB 的可寻址空间。
因此,总结一下: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)您正在运行什么操作系统版本以及它识别/支持多少位 PA。
(a,b) 的最小值最终将决定您的系统可以利用的可寻址空间量。
我写了这个回复,没有详细研究其他回复。此外,我还没有深入研究 MMIO、MMCFG 和整个地址映射结构的细微差别。但我确实希望这会有所帮助。
谢谢,英特尔公司服务器平台架构师 Anand K Enamandram
仅使用 64 位 VA 的低 48 位是不正确的,至少在 Intel 64 中是这样。使用高 16 位,有点,有点。
英特尔® 64 和 IA-32 架构软件开发人员手册中的第 3.3.7.1 节规范寻址说:
规范地址必须将位 63 到 48 设置为零或一(取决于位 47 是零还是一)
所以位 47 到 63 形成一个超位,要么全为 1,要么全为 0。如果地址不是规范形式,则实现应该出错。
在 AArch64 上,这是不同的。根据ARMv8 指令集概述,它是 49 位 VA。
AArch64 内存转换系统支持 49 位虚拟地址(每个转换表 48 位)。虚拟地址从 49 位进行符号扩展,并存储在 64 位指针中。可选地,在系统寄存器的控制下,64 位指针的最高有效 8 位可以保存一个“标记”,当用作加载/存储地址或间接分支的目标时,该标记将被忽略
很多人都有这种误解。但是我向你保证,如果你仔细阅读这篇文章,读完之后你所有的误解都会被清除。
说处理器 32 位或 64 位并不意味着它应该分别具有 32 位地址总线或 64 位地址总线!...我再说一遍,没有!
32 位处理器意味着它具有 32 位 ALU(算术和逻辑单元)......这意味着它可以在 32 位二进制操作数(或简单地说具有 32 位的二进制数)上运行,类似地,64 位处理器可以在 64 位二进制上运行操作数。因此,32 位或 64 位处理器并不意味着可以安装的最大内存量。它们只是显示了操作数可以有多大......(为了类比,你可以想象一个 10 位计算器可以计算高达 10 位的结果......它不能给我们 11 位或任何其他更大的结果......虽然它是用十进制表示,但为了简单起见,我说这个类比)......但你所说的是地址空间,它是内存(RAM)的最大直接可接口大小。内存' s 最大可能大小由地址总线的大小决定,而不是数据总线的大小,甚至不是定义处理器大小(32/64 位)的 ALU 的大小。是的,如果处理器具有 32 位“地址总线”,那么它能够寻址 2^32 字节=4GB 的 RAM(或者对于 64 位,它将是 2^64)......但是说处理器 32 位或 64 位有与此地址空间无关(地址空间=它可以访问内存的距离或 RAM 的最大大小),它仅取决于其 ALU 的大小。当然,数据总线和地址总线的大小可能相同,然后看起来 32 位处理器意味着它将访问 2^32 字节或 4 GB 内存……但这只是巧合,不会相同对全部.... 例如,英特尔 8086 是一个 16 位处理器(因为它具有 16 位 ALU),所以正如您所说,它应该访问 2^16 字节 = 64 KB 的内存,但事实并非如此。它可以访问高达 1 MB 的内存来拥有 20 位地址总线....如果您有任何疑问,您可以谷歌 :)
我想我的观点已经很清楚了。现在来回答你的问题……因为 64 位处理器并不意味着它必须有 64 位地址总线,所以在 64 位处理器中拥有 48 位地址总线并没有错...他们使地址空间更小,以使设计和制造便宜....因为没有人会使用这么大的内存(2^64 字节)...如今 2^48 字节已经绰绰有余了。
CPU 被认为是“N 位”主要取决于它的数据总线大小,以及它的大部分实体(内部架构):寄存器、累加器、算术逻辑单元 (ALU)、指令集等。例如:老式的摩托罗拉 6800(或 Intel 8050)CPU 是 8 位 CPU。它具有 8 位数据总线、8 位内部架构和 16 位地址总线。