为什么64位系统只有48位地址空间?
在一本书中,我读了以下内容:
32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间
我的期望是,如果它是一个64位的处理器,地址空间也应该是2 ^ 64。
所以我想知道这个限制的原因是什么?
因为这是所有需要的。 48位给你一个256兆字节的地址空间。 好多啊。 你不会看到一个系统比任何时候都要更快。
所以CPU厂商走捷径。 它们使用允许完整的64位地址空间的指令集,但是当前的CPU只使用较低的48位。 另一个办法是浪费晶体pipe来处理一个更大的地址空间,而这个地址空间已经不是多年需要的了。
所以一旦我们接近48位的限制,这只是释放处理完整地址空间的CPU的问题,但它不会要求对指令集进行任何更改,也不会破坏兼容性。
任何涉及总线大小和物理内存的回答都有些错误,因为OP的问题是关于虚拟地址空间而不是物理地址空间 。 例如,对于某些386来说,所谓的类似的限制是它们可以使用的物理内存的限制,而不是虚拟地址空间,它总是32位。 原则上,即使只有几MB的物理内存,也可以使用完整的64位虚拟地址空间; 当然你可以通过交换来实现,或者为了在大多数地址上映射相同页面的特殊任务(例如某些稀疏数据操作)。
我认为真正的答案是AMD正在便宜,希望现在没有人关心,但我没有提及引用。
内部本地寄存器/操作宽度不需要反映在外部地址总线宽度中。
假设你有一个64位的处理器,只需要访问1兆字节的RAM。 一个20位地址总线是所有需要的。 为什么还要花费所有额外的引脚的成本和硬件复杂性,你不会使用?
摩托罗拉68000就是这样的; 32位内部,但有一个23位地址总线(和一个16位数据总线)。 CPU可以访问16兆字节的RAM,并加载本地数据types(32位)进行了两次内存访问(每个访问16位数据)。
阅读维基百科文章的限制部分:
一台PC不能包含4PB的内存(由于当前内存芯片的大小,如果没有其他的话),但是AMD设想了大型服务器,共享内存集群和物理地址空间的其他用途,在可预见的将来可能会采用这种方式,52 bit物理地址提供了足够的扩展空间,而不会导致实现64位物理地址的成本
也就是说,在这一点上实现完整的64位寻址是毫无意义的,因为我们不能build立一个可以充分利用这样的地址空间的系统 – 所以我们select一些对今天(和未来)系统来说是实用的。
从我的angular度来看,这是页面大小的结果。每页最多包含4096/8 = 512个页表。 和2 ^ 9 = 512。 所以9 * 4 + 12 = 48。
还有一个更严重的原因,就是在CPU地址path中保存晶体pipe:如果增加地址空间的大小,则需要增加页面大小,增加页表的大小,或者使用更深的页表结构是更多层次的翻译表)。 所有这些都会增加TLB缺失的成本,这会损害性能。
64位VA的低位48位是不正确的,至less在64位的情况下是这样。高位16位被使用,有点类似。
第3.3.7.1节英特尔 ®64 和IA-32架构中的规范寻址软件开发人员手册说:
规范地址必须将位63到48设置为0或1(取决于位47是0还是1)
因此,第47到第63位形成一个超位,或者全是1,或者全为0.如果地址不是规范forms,则实现应该是错误的。
在AArch64,这是不同的。 根据ARMv8指令集概述 ,这是一个49位的VA。
AArch64内存转换系统支持一个49位的虚拟地址(每个转换表48位)。 虚拟地址从49位进行符号扩展,并存储在64位指针中。 可选地,在系统寄存器的控制下,64位指针的最高有效8位可以包含“标签”,当被用作加载/存储地址或间接分支的目标时将被忽略