在书中,我读到以下内容:
32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间
我的期望是,如果它是64位处理器,则地址空间也应该是2 ^ 64。
所以我想知道限制的原因是什么?
The 32-bit processors have 2^32 possible addresses
不一定,也可以存在32位cpu,但只有24个“引脚”可用于寻址内存。例如68EC020(更便宜的68020版本)是32位的CPU,但具有24位用于寻址存储器。
在书中,我读到以下内容:
32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间
我的期望是,如果它是64位处理器,则地址空间也应该是2 ^ 64。
所以我想知道限制的原因是什么?
The 32-bit processors have 2^32 possible addresses
不一定,也可以存在32位cpu,但只有24个“引脚”可用于寻址内存。例如68EC020(更便宜的68020版本)是32位的CPU,但具有24位用于寻址存储器。
Answers:
因为这就是所有需要的东西。48位为您提供256 TB的地址空间。好多啊。您不会很快看到一个系统需要更多的系统。
因此,CPU制造商采取了捷径。他们使用的指令集允许完整的64位地址空间,但是当前的CPU仅使用低48位。另一种选择是浪费晶体管来处理更大的地址空间,这是多年以来不需要的。
因此,一旦我们接近48位的限制,就只需要释放处理全部地址空间的CPU即可,但是它不需要对指令集做任何更改,也不会破坏兼容性。
关于总线大小和物理内存的任何答案都有些错误,因为OP的问题是关于虚拟地址空间而不是物理地址空间。例如,所谓的对386的类似限制是对他们可以使用的物理内存的限制,而不是对虚拟地址空间的限制,虚拟地址空间始终是完整的32位。原则上,即使只有几MB的物理内存,您也可以使用完整的64位虚拟地址空间。当然,您可以通过交换来完成,或者对于要在大多数地址处映射同一页面的特殊任务(例如某些稀疏数据操作)来执行此操作。
我认为真正的答案是AMD只是便宜而已,希望现在没人会在意,但我没有引用。
__far
(或更糟糕的是FAR
/ far
!)指针...
阅读Wikipedia文章的限制部分:
PC不能包含4 PB的内存(由于当前内存芯片的大小,如果没有其他限制),但是AMD设想了大型服务器,共享内存群集以及在可预见的将来可能会达到此目的的其他物理地址空间使用,以及52位物理地址为扩展提供了足够的空间,而不会产生实现64位物理地址的成本
也就是说,此时无法实现完整的64位寻址,因为我们无法构建可以完全利用这样的地址空间的系统-因此,我们选择了对于当今(以及未来)系统非常实用的东西。
宽度不内部本地寄存器/操作需要被反映在外部地址总线宽度。
假设您有一个64位处理器,只需要访问1 MB的RAM。仅需要20位地址总线。为什么不使用所有多余的额外引脚的成本和硬件复杂性呢?
摩托罗拉68000就是这样。内部32位,但具有23位地址总线(和16位数据总线)。CPU可以访问16 MB的RAM,并且要加载本机数据类型(32位)需要进行两次内存访问(每个访问16位数据)。
还有一个更严重的原因,不仅仅是在CPU地址路径中保存晶体管:如果增加地址空间的大小,则需要增加页面大小,增加页面表的大小或具有更深的页面表结构(即是翻译表的更多级别)。所有这些都增加了TLB丢失的成本,这会损害性能。
要回答原始问题:不需要添加超过48位的PA。
服务器需要最大的内存量,因此让我们尝试更深入地研究。
1)最大(常用)服务器配置是8套接字系统。8S系统只不过是8个服务器CPU,它们通过高速一致的互连(或简称为高速“总线”)连接起来,形成一个节点。那里有更大的集群,但它们之间相距甚远,我们在这里谈论的是常用配置。请注意,在实际使用中,2套接字系统是最常用的服务器之一,而8S通常被认为是非常高端的服务器。
2)服务器使用的主要内存类型是字节可寻址的常规DRAM内存(例如DDR3 / DDR4内存),内存映射的IO-MMIO(例如附加卡使用的内存)以及用于配置的配置空间系统中存在的设备。第一种类型的存储器通常是最大的类型(因此需要最大数量的地址位)。一些高端服务器也会根据系统的实际配置使用大量的MMIO。
3)假设每个服务器CPU可以在每个插槽中容纳16个DDR4 DIMM。最大容量为256GB的DDR4 DIMM。(根据服务器的版本,每个插槽可能的DIMM数量实际上少于16个DIMM,但为示例起见,请继续阅读)。
因此,每个插槽理论上可以具有16 * 256GB = 4096GB = 4 TB。对于我们的示例8S系统,DRAM大小最大为4 * 8 = 32 TB。这意味着寻址此DRAM空间所需的最大位数为45(= log2 32TB / log2 2)。
我们将不介绍其他类型的内存(MMIO,MMCFG等)的详细信息,但是这里的要点是,对于当今拥有最大类型的DDR4 DIMM(256 GB)的8插槽系统,最“需求”的类型的内存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)。
对于用户而言,这意味着,即使一个服务器具有可以支持> 48位寻址的超大型大型服务器CPU,但是如果您运行的操作系统仅支持48位PA,则您只能利用256 TB的内存。
3)总而言之,有两个主要因素可以利用更高数量的地址位(=更多的存储容量)。
a)您的CPU硬件支持多少位?(这可以由Intel CPU中的CPUID指令确定)。
b)您正在运行什么操作系统版本以及它可以识别/支持多少位PA。
(a,b)的最小值将最终确定系统可以利用的可寻址空间量。
我写此回复时没有详细研究其他回复。另外,我没有详细研究MMIO,MMCFG的细微差别以及地址映射结构的整体。但我确实希望这会有所帮助。
感谢,英特尔公司服务器平台架构师Anand K Enamandram
许多人有这种误解。但是,如果您仔细阅读本文,我向您保证,读完本文后,您所有的误解都会消失。
说一个32位或64位处理器并不表示它应该分别具有32位地址总线或64位地址总线!...我再说一遍!
32位处理器意味着它具有32位ALU(算术和逻辑单元)...这意味着它可以在32位二进制操作数上运行(或者简单地说是具有32位的二进制数),类似地64位处理器可以在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内存...但这只是一个巧合,而且不会相同对所有人.... 例如,英特尔8086是16位处理器(因为它具有16位ALU),因此,正如您所说的,它应该已经访问了2 ^ 16字节= 64 KB的内存,但这不是事实。它可以访问最多1 MB的内存以拥有20位地址总线...。如果您有任何疑问,可以用Google搜索:)
我想我已经阐明了我的观点。现在来问您的问题...因为64位处理器并不意味着它必须具有64位地址总线,因此在64位处理器中具有48位地址总线没有任何问题...他们将地址空间缩小以降低设计和制造的成本。...因为没有人会使用如此大的内存(2 ^ 64字节)...如今2 ^ 48字节已绰绰有余。
至少在Intel 64中仅使用了64位VA的低阶48位是不正确的。使用的高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位可以保存一个“标签”,当用作加载/存储地址或间接分支的目标时,该标签将被忽略
[vsyscall]
页面。(这可能是导出诸如当前PID之类的内容,所以它getpid()
纯粹是用户空间。也gettimeofday()
可以仅在内核导出的用户空间+比例因子中使用rdtsc。尽管我认为[vdso]
其中有些是在顶部附近的)下半部分。)
__VMALLOC_BASE
。大概不直接使用。
CPU主要根据其数据总线大小以及其大部分实体(内部体系结构)被认为是“ N位”:寄存器,累加器,算术逻辑单元(ALU),指令集等。例如:较旧的摩托罗拉6800(或Intel 8050)CPU是8位CPU。它具有8位数据总线,8位内部体系结构和16位地址总线。