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

er4*_*z0r 88 x86-64 cpu-architecture virtual-memory processor-architecture

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

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

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

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

jal*_*alf 126

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

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

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

  • 任何人都可以使用640kb. (107认同)
  • @bdares:糟糕的比喻.8088/8086 arch的指令集内置了640k的限制.只有制造新的ISA(386)才有可能打破障碍.另一方面,x86_64支持ISA中的所有64位.它只是当前一代的硬件无法全部使用它们...... (23认同)
  • http://lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a/ < - 这个回复三年后,我们已经达到了这些限制:) HP机器将拥有320TB的内存并且无法将其作为平面地址提供空间因为48位寻址限制. (22认同)
  • @R.实际上,CPU的限制是1兆字节.IBM PC为内存映射外围设备,BIOS等指定了一部分.其他一些8088/8086设计(Zenith Z100,如果内存服务)指定较少的外围设备等,并且相应地更多的应用程序. (16认同)
  • 你还在运行8088系统,bdares? (7认同)
  • 目前,x86-64架构使用四级分页层次结构,其中树的每个级别处理地址空间的9位.九个来自每个4KB页面上的512个64位条目.这将线性地址空间限制为48位(256TB).层次结构中的另一个级别将其扩展到57位(128PB).页表的格式具有最高位的XD(执行禁用)和PKEY(保护密钥),但物理地址范围可以扩展到59位,而不会改变分页结构(512PB). (3认同)
  • @BryanBuckley具体来说,你的问题是什么?CPU侧需要处理更大的地址空间(特别是更大的页表).CPU设计人员试图通过更大的地址空间获得的好处来平衡它.48位是一个非常巨大的地址空间,不是吗? (2认同)
  • http://os.phil-opp.com/entering-longmode.html#paging解释了x86_64如何进行**分页**,虚拟内存地址(由CPU指令使用)和物理地址(硬件)的映射.一个内存"页面"长4千字节.页面内指针的低12位.页面位于四级trie中,每个级别具有512个条目(9位)表.12 + 4*9总共提供48位(256太字节)的可映射虚拟内存.*物理*页面地址最多可以使用52位(4千兆字节),因为高12位是为标记页面"不可执行"的内容保留的. (2认同)

R..*_*R.. 17

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

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

  • "便宜"我想你的意思是不添加永远不会使用的引脚,不占用不会使用的晶体管的芯片空间,并使用释放空间来使现有指令更快?如果这很便宜,我就在! (13认同)

Dam*_*ver 9

阅读维基百科文章的限制部分:

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

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


小智 9

内部寄存器天然/操作宽度不需要在外部地址总线宽度中得到反映.

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

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


haf*_*031 9

很多人都有这样的误解。但我向你保证,如果你仔细阅读本文,读完本文后,你所有的误解都会清除。

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

32 位处理器意味着它具有 32 位 ALU(算术和逻辑单元)...这意味着它可以对 32 位二进制操作数(或简单地说具有 32 位的二进制数)进行操作,类似地 64 位处理器可以对 64 位二进制进行操作操作数。因此,处理器是 32 位还是 64 位并不意味着可以安装的最大内存量。它们只是显示操作数可以有多大...(打个比方,您可以认为 10 位计算器可以计算最多 10 位数字的结果...它不能给我们 11 位数字或任何其他更大的结果...尽管它是以十进制表示,但为了简单起见,我讲这个类比)...但你所说的是地址空间,它是内存(RAM)的最大直接可接口大小。RAM 的最大可能大小由地址总线的大小决定,而不是数据总线的大小,甚至不是定义处理器大小的 ALU(32/64 位)的大小。是的,如果处理器有 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 字节已经足够了。

  • 嗯...2步操作。段寄存器仅包含高 16 位。然后乘以 10H 使其成为 20 位,然后加上偏移量。 (3认同)

Bre*_*dan 6

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

  • 【Intel提出5级分页方案】(https://software.intel.com/sites/default/files/managed/2b/80/5-level_paging_white_paper.pdf)从目前的48位扩展到57位. (与当前的 x86-64 页表相同,每级 9 位/4k 页)。每级使用 10 或 11 位将需要更改页面遍历硬件,因此这可能不是大内存的最佳设计,但它是双模式 CPU 的明智扩展,它还需要支持 4-当前格式的级别表。 (2认同)

lin*_*ian 6

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