19

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

64 位架构的分页

正如我们在前几节中看到的,32 位微处理器通常使用两级分页。然而,两级分页不适用于采用 64 位架构的计算机。让我们用一个思想实验来解释原因:

首先假设标准页面大小为 4 KB。因为 1 KB 覆盖了 2 10 个地址的范围,4 KB 覆盖了 2 12 个 地址,所以 Offset 字段是 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处理器规格不包括此规格。

回答:

有关第一个问题的合理答案,请参见Paul Betts 的答案

4

7 回答 7

10

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

于 2010-07-10T19:58:03.683 回答
6

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

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

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

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

如何知道处理器的地址引脚数量(= 地址总线的大小)。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)地址空间是一个限制。如果你真的遇到了这个限制。请举个例子。

两个词:内存映射文件

于 2010-07-10T14:39:26.990 回答
5

当前没有任何 x86-64 设计为此使用超过48 位- 所以这是一个方便选择的数字,它在 Windows 上也自动具有相同的限制。

于 2010-07-10T14:43:24.847 回答
2

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

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

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

因此,SQL 数据库(例如)在 RAM 超过 4GB 的机器上可能会更快。

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

于 2010-07-10T14:44:03.857 回答
2

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

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

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

我很确定,虽然有些 PC 可能会被推到 10 年,但 20 年的扩展空间似乎是一个不错的权衡:20 年后的计算机将会有所不同——它们不会使用相同的 CPU 和 RAM 总线,就像他们在 20 年前不一样。在界面中设计超过 20 年的余量对于永远不会被使用的工程设计简直是愚蠢的。

而且它并没有那么短,以至于现有硬件存在过早被淘汰的真正风险。

于 2010-07-10T19:52:53.520 回答
1

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

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

于 2010-07-10T20:10:57.003 回答
0

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

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

许多人对切换到 64 位感到恼火,因为他们的程序消耗了如此多的内存。他们会想要48 位指针,如果没有对齐限制,CPU 制造商可能会制造 48 位架构。

请注意,如果您非常需要内存,以至于您希望指针为 6 个字节,那么有办法做到这一点。但是执行时间会受到惩罚。

于 2014-02-04T14:10:17.420 回答