我最近在思考为什么 32 位处理器只能支持最多 4 GB 的内存,我不明白为什么处理器的位数会限制其内存。我理解,正如这里的其他问题所述,32 位二进制数最多只能寻址 4 GB。但为什么计算机不能使用两个变量来引用内存,并有效地“表现”得像 64 位一样(有点像 32 位处理器可以使用 64 位整数)?
这可能吗?这会降低性能吗?如果这会降低性能,那么如果操作系统对某些程序(而不是整个系统)使用“伪” 64 位内存引用,结果会怎样?
答案1
维基百科关于 PAE 的文章: “Windows XP 和 Windows XP SP1 的原始版本使用 PAE 模式允许 RAM 超出 4 GB 地址限制。但是,这会导致与第三方驱动程序的兼容性问题,因此 Microsoft 在 Windows XP Service Pack 2 中取消了此功能。” 某些“32 位 Windows 版本(Windows XP SP2 及更高版本、Windows Vista、Windows 7)通过许可限制机制将物理地址空间限制为前 4 GB,以实现驱动程序兼容性。” “如果使用适当的选项启动,Microsoft Windows 支持 PAE,但根据 Geoff Chappell 的说法,Microsoft 可能会根据其许可政策将 32 位版本的 Windows 限制为 4 GB。”
Mark Russinov 的博客“32 位 Windows 将继续忽略其以上的内存,因为仍然存在一些难以衡量的风险,而 OEM 正在(或至少应该)转向 64 位 Windows,因为在 64 位 Windows 中不存在这个问题。”
Windows 2000 DataCenter 32 位最高支持 32GB,较新版本最高支持 64GB。
后来,维基百科文章讨论了 FreeBSD,并说:“并非所有驱动程序都支持超过 4 GB 的物理内存;这些驱动程序无法在具有 PAE 的系统上正常工作。” 因此,驱动程序兼容性问题困扰的不仅仅是 Microsoft Windows。
因此,总而言之,没有任何技术原因可以解释为什么软件绝对不可能引用超过 32 位的地址空间。像您理论的那样,改进/解决方法可能存在,但这种支持尚未得到广泛部署,显然是由于兼容性和稳定性问题。
答案2
为什么计算机可用的 RAM 数量受到处理器位数的限制?不是。从历史上看,地址大小没有大于或小于 CPU 的“位数”的例子。
看看 8 位 CPU,例如 6502 和 Z80,它们可寻址 64KiB。16 位 8086 寻址 20 位,16 位 80286 寻址 24 位。
另一方面,32 位 Motorola 68000 具有 32 位寻址,但仅运行 24 位线路,将其限制为 16MiB。这是我所知道的 x64 芯片的方法,它们不会向外界运行 64 条线路。
当 32 位架构被制定时,4GiB 内存几乎是不可想象的。80386于 1985 年推出。1996 年,微软发布了 MS-DOS 3.2,它仍然将硬盘分区的最大大小限制为 32MiB。很少有人考虑使用 GiB 硬盘,更不用说内存了。超高速串行总线于 1987 年推出。PowerPC 6011992 年,即使还没有达到 GiB 硬盘的水平,现在我们也快要达到这个水平了。Unix 工作站可能有两位数 MiB 的 RAM。超过 4GiB 的需求仍然遥遥无期。增加硬件和支持超过 32 位地址的复杂性是不值得的。
一旦架构确定下来,并且在使用中,你就不能轻易改变基本要素,比如地址大小。你可以添加一些内容,比如 x86 上的 PAE,或者外部存储器控制器在 6502 上。
编辑添加 反过来也发生了。IBM 360于 1964 年推出,是一款 32 位计算机,具有 24 位寻址。而 1985 年推出的 CRAY-2 是一款 64 位计算机,具有 32 位寻址。(如果我读的是本手册正确,请参阅第 6 页的“架构和设计”。)注意,CRAY-2 似乎是 64 位字可寻址的,因此 32 位寻址将提供 8 * 4 Gi 或 32 GiB 的地址空间。
另一点
我一直在谈论地址空间。问题标题是关于 RAM 的。如果没有重新映射内存的外部内存控制器,RAM 将受到来自 CPU 的地址线数量的限制。有些 CPU 的地址线比地址空间中的位数少。一个著名的例子是 Motorola 68000,它有 32 位地址空间,只有24 条地址线另一个例子是英特尔80386SX,同样是 32 位寻址和 24 条地址线。
答案3
处理器设计为使用一个变量作为指令指针,另一个变量作为堆栈指针。所有代码都是以此为前提编写的,如果你开始使用两个变量,那么你将破坏那里的每一段代码。
你可以做的是改变哪个您一次使用的内存为 4gb。这就是 TOOGAM 所说的 PAE。任何一个程序仍将被限制在 4gb 以内,除非它为了访问额外的内存而费尽周折(现在没有应用程序程序员会这样做 - 如果您正在执行实际上需要超过 4gb 的任务,那么您的任务就足够繁重,您可以向用户规定条件:64 位,否则我就不运行),并且您会在进程间通信方面遇到麻烦。共享纯数据块是可以的,共享包含指针的数据块将导致问题,因为指针将指向第二个程序地址空间中的错误位置。这就是 TOOGAM 提到的驱动程序麻烦的原因。