为什么OS不能使用整个64位进行寻址? 为什么只有48位?

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

分页为64位体系结构

正如我们在前面的章节中看到的那样,32位微处理器通常使用两级分页。 但是,两级分页不适用于采用64位体系结构的计算机。 让我们用思维实验来解释为什么:

首先假设一个4 KB的标准页面大小。 由于1 KB覆盖2 10个地址的范围,因此4 KB覆盖2 12个地址,所以偏移字段为12位。 这会在表格和目录字段之间分配最多52位的线性地址。 如果我们现在决定只使用64位中的48位来寻址(这个限制使我们有一个舒适的256 TB地址空间!) ,其余的48-12 = 36位将不得不在表和字段字段之间拆分。 如果我们现在决定为这两个字段中的每一个保留18位,则每个进程的Page Directory和Page Table都应该包含2 18个条目,即超过256,000个条目。

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

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

  3. 这个窗口的限制是什么?

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

回答:

第一个问题见Paul Betts的答案是合理的。

“如果我们现在决定只使用64位中的48个寻址”。 为什么? &为什么只有48位? 为什么不是其他号码?

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

只要指针是64位,这就是性能问题。 如果48位成为限制,则可以调整操作系统以使用64位地址空间的更多位,而不会破坏应用程序不兼容性。 现在,建筑师们正在为自己购买一段非常舒适的时间。

这可能与处理器端虚拟寻址功能有关,因为许多处理器现在都有内存管理单元来处理虚拟 – >物理内存映射。

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

这大部分是不相关的。 这是处理器实现各种物理寻址方案的一种方式。 如果总线是同步的,并且地址位得到复用,64位处理器可以用64,32,16,8,4,2或1个地址引脚实现外部地址/数据总线。 再次,虚拟地址!=物理地址; 可以使用48位或32位物理地址来实现64位虚拟寻址(仅限于2 48或2 32字的内存)。

更新:如果你真的想知道,你必须看看有问题的每个处理器的数据表。 例如, Intel Core 2 Duo – 数据表的第4.2节讲述了这些信号 – 地址总线是36位宽(但实际上是33条信号线;数据宽度是64位= 8字节,所以其余3行是可能没有适当的数据对齐)

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

两个字: 内存映射文件

这些答案都不是正确的,操作系统不使用完整的64位的原因是因为页表将会更大(64位已经达到3级页表),并且没有理由支付额外的间接需要,48位就够了。 48位也很方便,因为您可以获得一些额外的位来存储标志(指针标记)

目前的x86-64设计中没有超过48位 ,所以这是一个方便的选择,而且它在Windows上的限制也是自动的。

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

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

SQL服务器的速度在一定程度上取决于有多少数据(例如,它的索引和数据页面的数量)能够保存在RAM而不是磁盘上。

所以,SQL数据库(例如)在超过4GB内存的机器上可能会更快。

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

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

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

无论如何,32位地址空间已经用完了,所以从32到48的跳跃意味着,在硬件方面,我们已经分配了约16次迭代的摩尔定律的扩展空间,这个时间大约需要20年。

林肯定,虽然有些电脑可能会被推到10年,20年的扩张空间似乎是一个体面的权衡:在20年的时间计算机将是不同的 – 他们不会使用相同的CPU和RAM总线,就像20年前的不同。 将超过20年的设计空间设计到一个界面中,对于永远不会看到使用的工程来说,是愚蠢的。

而且现有的硬件还没有那么短,真的有太早被淘汰的风险。

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

现在已经不存在了(除了一些老员工的个人计算机),但是在20世纪90年代末/ 21世纪初,我开发了一套名为RealiMation的软件。 这是一个可视化和模拟的实时3D引擎。 我们的一个客户经常创建高度详细的模型,达到2GB的内存限制。 我们会在需要的时候随时加载纹理,并且必须添加代码来检查内存分配失败,所以我们可以继续显示模型,虽然没有纹理。

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

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

很多人对64位的切换感到恼火,他们的程序消耗了更多的内存。 他们会想要 48位的指针,如果对齐方面的限制不存在,那么CPU制造商可能会做出48位的架构。

请注意,如果你的内存太饿了,你希望你的指针是6个字节,有办法做到这一点。 但是执行时间有一个惩罚。