为什么操作系统不能使用整个64位进行寻址?为什么只有48位?

时间:2010-07-10 14:32:20

标签: windows memory-management 64-bit linux-kernel address-space

我正在阅读“了解Linux内核”。

  

为64位架构进行分页

     

正如我们在前面所看到的那样   部分,两级分页是常见的   由32位微处理器使用。   但是,两级分页不是   适用于采用的计算机   64位架构。我们来用吧   思想实验解释原因:

     

首先假设标准页面大小   4 KB。因为1 KB涵盖范围   2个 10 地址,4 KB覆盖2 12   地址,因此偏移字段为12   位。这留下了多达52位的   要分发的线性地址   表和目录之间   领域。 如果我们现在决定使用   64位中只有48位用于寻址   (这个限制让我们留下了一个   舒适的256 TB地址空间!) ,   剩余的48-12 = 36位将   必须在表和之间分开   目录字段。如果我们现在决定   为这两个中的每一个保留18位   字段,页面目录和   每个进程的页表应该   包括2个 18 条目,超过   256,000个条目。

  1. “如果我们现在决定只使用64位中的48位进行寻址”。为什么? &安培;为什么只有48位?为什么不是其他一些号码?

  2. 好吧,我只是一个普通的PC用户&程序员。我很难相信32位寻址,即4GB(2GB / 3GB更正确)每个进程的地址空间是一个限制。如果确实遇到此限制。请举个例子。

  3. Windows的限制是什么?

  4. 我知道虚拟内存!=物理内存&处理器地址引脚与虚拟内存无关。这是一个完全不同的问题。如何知道处理器的地址引脚数(=地址总线的大小)。处理器的http://ark.intel.com规格不包括此规范。

  5. 答案:

    有关第一个问题的合理答案,请参阅Paul Betts's answer

7 个答案:

答案 0 :(得分:8)

这些答案都不对,操作系统不使用完整的64位的原因是因为页表会大得多(64位已经达到3级页表),并且没有为了支付额外的间接费用,48位就足够了。 48位也很方便,因为你得到一些额外的位来存储(指针标记)

中的标志

答案 1 :(得分:6)

  

“如果我们现在决定只使用64位中的48位进行寻址”。为什么? &安培;为什么只有48位?为什么不用其他数字?

系统架构师进行权衡。 256TB似乎足以容纳1个进程的地址空间。记住虚拟地址!=物理地址,一般来说,每个进程都有自己的地址空间。

只要指针是64位,这就更像是一个性能问题。如果&当48位成为限制时,可以调整OS以使用64位地址空间的更多位,而不会破坏应用程序的不兼容性。目前,建筑师只是在非常舒适的时间内购买。

它可能与处理器端虚拟寻址功能有关,因为许多处理器现在有memory management units来处理虚拟 - >物理内存映射。

  

如何知道处理器的地址引脚数(=地址总线的大小)。处理器的http://ark.intel.com规格不包括此规范。

这在很大程度上是无关紧要的。这是处理器实现各种物理寻址方案的一种方式。如果总线是同步的,并且地址位及时复用,则64位处理器可以通过64,32,16,8,4,2或1地址引脚实现外部地址/数据总线的完整地址空间。再次,虚拟地址!=物理地址; 64位虚拟寻址可以用48位或32位物理地址实现(只是你将被限制为2 48 或2 32 字的内存。

更新:如果您真的想知道,您必须查看相关处理器的数据表。例如。 Intel Core 2 Duo - 数据表第4.2节讨论了信号 - 地址总线是36位宽(但实际上是33条信号线;数据宽度是64位= 8字节,所以其他3条线是可能没有必要与正确的数据对齐)

  

好吧,我只是一个普通的PC用户&程序员。我很难相信32位寻址,即4GB(2GB / 3GB更正确)每个进程的地址空间是一个限制。如果你真的遇到这个限制。请举个例子。

两个字: memory-mapped files

答案 2 :(得分:5)

目前没有x86-64设计使用超过48 bits的内容 - 所以这是一个方便的数字选择,它在Windows上也会自动达到相同的限制。

答案 3 :(得分:2)

  

我很难相信32位寻址,即4GB(2GB / 3GB更正确)每个进程的地址空间是一个限制。如果你真的遇到这个限制。请举个例子。

从RAM获取数据比从磁盘获取数据更有效(更快)。

SQL服务器的速度部分取决于它能够保存在RAM中而不是磁盘上的数据量(例如,其索引和数据页的数量)。

因此,在具有4GB以上RAM的计算机上,SQL数据库(例如)可能会更快。

对于其他类型的服务器(例如文件服务器,HTTP代理等)也是如此,如果它们可以拥有更大的RAM缓存,则可以更快。

答案 4 :(得分:2)

我认为最简单的答案是 - 摩尔定律。

摩尔定律基本上说IC每18个月的成本减半。有一些方法可以解释这一点:PC中安装的内存量往往会每18个月翻一番。有效速度加倍(至少如果您采用核心* MHz而不仅仅是MHz)。

无论如何,我们刚刚耗尽32位地址空间,因此从32 - 48跳转意味着,在硬件方面,我们为摩尔定律的大约16次迭代分配了扩展空间 - 大约20年。

我很确定虽然有些PC可能会被推到10年,但20年的扩展空间似乎是一个不错的权衡:20年后的计算机将会有所不同 - 他们将不会使用相同的CPU和RAM总线,就像它们20年前不同。将超过20年的扩展空间设计到界面中只是愚蠢的工程设计,无论如何都不会看到使用。

现在的硬件确实存在过早被淘汰的风险。

答案 5 :(得分:1)

  

我很难相信32位寻址,即4GB(2GB / 3GB更正确)每个进程的地址空间是一个限制。如果你真的遇到这个限制。请举个例子。

它不再存在(除了一些旧员工个人机器),但我在20世纪90年代末/ 21世纪初期开发了一套名为RealiMation的软件。它是用于可视化和模拟的实时3D引擎。我们的一位客户定期创建高度详细的型号,达到2GB内存限制。我们会在需要时动态加载纹理,并且必须添加代码来检查内存分配失败,以便我们可以继续显示模型,尽管没有纹理。

答案 6 :(得分:0)

从硬件角度来看,另一个考虑因素是对齐。

一旦需要超过4个字节的数据类型(例如6),您需要将它们放在8字节边界上以在单个指令中检索它们。如果不对齐,则需要进行位屏蔽和移位,并在(汇编)代码中添加对此的检查。

许多人因为转换到64位而烦恼,他们的程序消耗了更多的内存。他们会想要想要 48位指针,如果没有对齐的限制,那么CPU制造商可能会制造一个48位架构。

请注意,如果您因为内存而缺乏指针,那么您希望指针为6个字节,那么就有办法做到这一点。但执行时间会受到惩罚。