![为什么 32 位操作系统无法寻址超过 3.2/3.2 GB 的内存?](https://linux22.com/image/1256763/%E4%B8%BA%E4%BB%80%E4%B9%88%2032%20%E4%BD%8D%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%97%A0%E6%B3%95%E5%AF%BB%E5%9D%80%E8%B6%85%E8%BF%87%203.2%2F3.2%20GB%20%E7%9A%84%E5%86%85%E5%AD%98%EF%BC%9F.png)
不知道这里是不是问这个问题的合适地方。
我读到过 32 位操作系统(比如我现在正在运行的 Ubuntu)无法处理超过 3.2gb 或 3.3gb 的 RAM 内存。
我记得我以前的计算机架构课程中,内存限制是 2^32 个“指针”(不记得正确的词了)。我的意思是,内存被表示为一个数组,CPU 可以直接访问它,但有上限。如果 CPU 是 32 位的,那么它可以寻址 2^32 个字,如果是 64 位的,那么它可以寻址 2^64 个字,等等。
因此,如果我之前说的是正确的,那么我的操作系统应该能够寻址 2^32 = 4294967296 = 4Gb。
我在想也许某种空间是为内核、缓存、缓冲或交换的特定用途保留的。但没有正确的答案。
你能给我一点提示吗?
答案1
Windows 使用一些用于寻址内存的硬件地址来处理其他硬件(如 USB、SATA、磁盘控制器等)。因此,其中一些硬件地址不能用于您的内存。因此存在限制。
据我所知,Unix/Linux 可以寻址比 Windows 3.2GB 的限制稍大一点的空间。这是因为 Linux 使用了不同的寻址方案。
还有一个名为 PAE(物理地址扩展)的功能,它使 32 位操作系统使用超过 4GB 的内存。
答案2
这与 BIOS 必须为基本进程(例如将数据传输到设备和视频内存)保留的内存有关。超过 3.2GB 的内存(因系统而异,我见过 3.6GB 和 3.1GB)会被重新映射到 4GB 边界,此时需要 PAE 才能访问它。不同的系统对这种情况的处理方式不同。有些系统不会费心访问它,只为进程提供 3.2GB 左右的 RAM。其他系统则无缝地使用速度较慢的 PAE 来处理进程。
答案3
PAE 不是 Linux 2.6 内核的标准。但它在 2.3.23 内核以上受支持。
PAE 允许在 32 位系统上使用最多 64GB 的 RAM,但是将单个进程限制在 32 位空间内..并且会降低整体性能/而不仅仅是使用 4GB 以上..
我不得不将一些不断增长的数据库操作系统更改为 64 位,以便 MySQL 能够利用已安装的 RAM。速度差异很明显 :D
看看这里 http://en.wikipedia.org/wiki/Physical_Address_Extension#Linux
答案4
== 题外话 ==
这让我想起了 DOS 的旧时代,当时计算机只能看到 640k RAM,尽管可以安装更多。尽管从架构上讲 2^20 字节 (1024k) 是可访问的,但顶部 384k(上部内存区域)只能通过技巧来寻址。