(前言:我知道有类似的问题,但我特别想了解为什么当拥有 2个 32 个地址足以访问 3.5 GB 的 RAM 时,拥有超过 32 位有助于访问 0.5 GB。)
我正在学习操作系统并阅读到在 4GB RAM 上运行 64 位操作系统允许用户充分利用 4GB,而这对于 32 位操作系统是不可能的(如果我理解正确,原因这是因为 4GB 与其他硬件组件共享,我知道其中之一是 GPU。)。
谁能帮我解释一下这是怎么可能的?如果 32 位操作系统不能使用所有 2个 32地址位置(即 4GB),那么将操作系统一次可以使用的位数增加到 64 位如何解决问题?
一个 32 位操作系统可以寻址 4GB 的地址空间,但是在该地址空间中不仅有 RAM,还有各种影子 内存和内存映射设备。在 x86 中端口映射的 IO 更常见,但仍然有很多内存映射的东西
例如,其中一些可能保留给 COM 和 LPT 端口,而剩余的一些将保留给网络接口和图形卡。如果您的系统上有 1GB GPU,那么操作系统的 RAM 最多只有 3GB 的地址空间。那甚至不是3.5GB
在大多数 RISC 架构上,内存映射 IO 更常用,因此 32 位 RISC 操作系统可以寻址更少的 RAM
然而,这还不是全部,因为许多 32 位架构使用超过 32 位的地址,因此在这些架构上运行的 32 位操作系统不一定限于 4GB 的 RAM。例如,在 x86 中有PAE,它允许操作系统使用至少 36 位的地址,这意味着它们可以寻址 64GB 或更多的 RAM。ARM 中的等价物是LPAE
但只有操作系统才能使用如此大量的 RAM。在该操作系统上运行的 32 位进程仍然使用 32 位地址,因此仍然只能寻址 2 32 个不同的内存位置,这些位置在大多数现代架构中都是字节,因此理论上它们最多可以访问 4GB 的 RAM
实际上只有一部分属于进程,因为内核为自己保留了剩余的地址空间。在 Windows 上,默认拆分为 2GB/2GB(在Meltdown之前)。这就是为什么 Adobe Premiere CS4(仍然是仅 32 位版本)为系统中的每 2GB RAM 生成一个进程,以便利用操作系统中的所有可用 RAM
额外的 32 位有助于访问比 4GB 地址空间大32倍的新空间 2,因此显然它克服了几乎所有可以想象的限制。0.5GB 在那个空间里什么都不是
为什么不?如果您有更大的空间,那么显然有更多的空间可以将 0.5GB 映射到其中。如果您有这么多可用空间,则可以将某些设备映射到 4GB 以上。在内存映射机制中,每个设备都将被映射到可用地址空间中的一个范围内。如果另一个设备正在使用地址空间,这并不意味着 RAM 空间会缩小。32位操作系统不能使用它不是因为地址空间更小,而是因为某些地址范围被映射到另一个设备而不是RAM
例如,如果我们有 4GB 的地址空间,那么 RAM 可能会映射到 0-2GB 的范围内,而具有 1GB VRAM 的 GPU 将映射到顶部的 1GB(即地址 0xC0000000)。但是,如果我们有 4294967296GB 的地址空间,那么 GPU 可以映射到 12345678GB 的地址,从而为 RAM 留下 4GB 的低范围,现在您可以使用整个 4GB 内存(粗略地说,因为总是有小内存页由于阴影和其他原因不可用)
您没有看到具有 8GB 或更多显存的现代 GPU 吗?一个系统中甚至可以有多个 GPU 和 NIC。有时可能会发生映射错误,例如 PCIe 设备映射到 2GB 的位置并限制可用 RAM。在这种情况下,需要进行一些调整来更改映射以最大化可用 RAM。看
为什么 32 位操作系统只能使用 3.5 GB?
据我了解,限制的主要原因是 CPU 寄存器在 32 位和 64 位之间的差异
为什么 32 位限制在 4 GB 以下
但不管是什么原因,上述限制对于现代操作系统来说是不够的,所以使用了 64 位系统。
64 位操作系统可以寻址 18,446,744,073,709,551,616 字节(或大约 18.4 艾字节)的内存。