(前言:我知道有类似的问题,但我特别想了解为什么拥有超过 32 位有助于访问 0.5 GB,而拥有 2 32 个地址足以访问 3.5 GB 的 RAM。)
我正在学习操作系统,并了解到在 4GB RAM 上运行 64 位操作系统可以让用户充分利用 4GB,而在 32 位操作系统上这是不可能的(如果我理解正确的话,原因是 4GB 与其他硬件组件共享,其中之一我知道是 GPU。)。
有人能帮我解释一下这是怎么可能的吗?如果 32 位操作系统无法使用所有 2 32 个地址位置(即 4GB),那么将操作系统一次可以使用的位数增加到 64 位如何解决问题?
答案1
换句话说,如果 32 位操作系统只能使用 3.5 GB
32 位操作系统可以寻址 4GB 的地址空间,但该地址空间中不仅有 RAM,还有各种有阴影的 回忆和内存映射设备。在 x86 中,端口映射 I/O 更常见,但仍然有很多内存映射的东西
例如,其中一些可能为 COM 和 LPT 端口保留,其余一些将保留用于网络接口和显卡。如果您的系统上有 1GB GPU,那么操作系统的 RAM 最多只有 3GB 的地址空间。这甚至不到 3.5GB
在大多数 RISC 架构中,内存映射 I/O 的使用更为普遍,因此 32 位 RISC 操作系统可以处理更少的 RAM
但这并不是全部,因为许多 32 位架构使用超过 32 位的地址,因此 32 位操作系统在这些机器上运行并不一定限制在 4GB RAM 上。例如在 x86 中聚丙烯酰胺凝胶电泳这使得操作系统可以使用至少 36 位地址,这意味着它们可以寻址 64GB 或更多的 RAM。ARM 中的等效代码是低分子肺动脉高压
但只有操作系统才能使用如此巨大的 RAM。32 位过程在该操作系统上运行仍然使用 32 位地址,因此仍然只能寻址 232 个不同的内存位置,在大多数现代架构中这些位置都是字节,因此理论上它们最多可以访问 4GB 的 RAM
实际上,只有一部分属于进程,因为内核为自己保留了剩余的地址空间。在 Windows 上,默认分割是 2GB/2GB(之前崩溃)。这就是为什么 Adobe Premiere CS4(目前仍为 32 位版本)会为系统中每 2GB RAM 生成一个进程,以便利用操作系统中所有可用的 RAM
额外的 32 位如何帮助访问剩余的 0.5 GB
额外的 32 位有助于访问比 4GB 地址空间大 2 32倍的新空间,因此显然它克服了几乎所有可以想象的限制。0.5GB 在那个空间里不算什么
将我的操作系统从 32 位升级到 64 位,同时保持 RAM 不变为 4GB,是否有助于访问 32 位操作系统无法访问的剩余 0.5GB?如果可以,怎么做?无论操作系统是否可以访问 2^23 或 2^64 地址空间,这 0.5GB 是否仍必须与其他资源共享?
为什么不呢?如果你有更大的空间,那么显然有更多的空间可以映射 0.5GB。如果你有这么多可用空间,那么一些设备可以映射到 4GB 以上。在内存映射机制中,每个设备都将映射到可用地址空间中的某个范围。这并不意味着如果另一个设备正在使用地址空间,RAM 空间就会缩小。32 位操作系统无法使用它,不是因为地址空间较小,而是因为某些地址范围映射到另一个设备而不是 RAM
例如,如果我们有 4GB 的地址空间,那么 RAM 可能会被映射到 0-2GB 范围内,而具有 1GB VRAM 的 GPU 将被映射到顶部 1GB(即地址 0xC0000000)。但如果我们有 4294967296GB 的地址空间,那么该 GPU 可以映射到 12345678GB 的地址,将低 4GB 范围留给 RAM,现在您可以使用整个 4GB 内存(大致如此,因为总会有一些小的内存页面由于阴影和其他原因而不可用)
你没看到现代 GPU 有 8GB 或更多的 VRAM 吗?而且一个系统中甚至可以有多个 GPU 和 NIC。有时可能会发生映射错误,例如 PCIe 设备被映射到 2GB 的位置并限制了可用的 RAM。在这种情况下,需要进行一些调整来更改映射以最大化可用的 RAM。请参阅
答案2
为什么32位操作系统只使用3.5 GB?
据我了解,限制的主要原因是 32 位和 64 位 CPU 寄存器之间的差异
CPU 寄存器存储内存地址,这是处理器从 RAM 访问数据的方式。寄存器中的一个位可以引用内存中的单个字节,因此 32 位系统最多可以寻址 4 GB(4,294,967,296 字节)的 RAM。实际限制通常更少 - 大约 3.5 GB - 因为注册表的一部分用于存储除内存地址之外的其他临时值。
但无论确切原因是什么,上述限制对于现代操作系统来说是不够的,因此使用 64 位系统。
64 位操作系统可以寻址 18,446,744,073,709,551,616 字节(或大约 18.4 EB)的内存。