32位Linux内核的最大内存分配

32位Linux内核的最大内存分配

我正在阅读这篇文章,其中讨论了即使总 RAM 容量 >4GB,32 位 Windows 中用于内核使用的最大 RAM 容量也只有 2GB。

http://www.brianmadden.com/blogs/brianmadden/archive/2004/02/19/the-4gb-windows-memory-limit-what-does-it-really-mean.aspx\

  1. 这对于 32 位 linux 环境(例如 32 位 ubuntu 10.04)是否相同?即使总主内存 >4GB,IE 的最大内核分配也是 2GB RAM?

  2. 如果通过重新编译启用 PAE 选项的内核将总内存量增加到 64GB,那么可以分配给内核使用的最大内存量是多少?还是 2GB 吗?或者可以增加吗?

答案1

两个内核都将虚拟地址空间分为用户部分和内核部分。内核部分由系统中的所有进程共享,因此内核只能使用那么多的直接可寻址内存。系统中的每个用户进程都有自己的地址空间用户部分。通常,这种分割是在中间进行的,每半部分为 2gb。可以使用 /3gb boot.ini 开关指示 Windows 将分割移动到用户 3gb 和内核 1gb。Linux 内核在构建时相当可配置,上次我检查时,Ubuntu 内核以 3:1 分割方式构建。

PAE 允许寻址 64 GB 的物理 RAM,但任何给定的页表仍然限制为 4 GB。由于系统上的所有进程之间只共享该地址空间的一个内核部分,因此无论如何它都限制为 1 或 2 GB 的直接可寻址 RAM。可以使用额外的物理内存,但在任何给定时间它只能部分映射到虚拟地址空间,并且映射在需要时更改。由于每个进程都有单独的用户地址空间,因此您可以拥有例如 5 个不同的进程,每个进程都有 2 GB 的内存,这些内存映射到您已安装的 16 GB 物理 RAM 的不同部分,而内核使用另外 2 GB。

请注意,文件系统缓存不必始终保持页面映射,因此它可以使用更多的物理内存,并且内核会在需要时自动映射部分内存,然后取消映射以便可以映射其他页面。即使内核只有 1GB 的虚拟地址空间可供使用,这种技巧也允许内核将许多 GB 的内存用于缓存,并将几百 MB 用于其他用途。

同样值得注意的是,在 Windows 的最新版本中,微软制定了各种人为的产品许可限制。我工作电脑上安装的 Windows 7 Pro 拒绝使用大于 4gb 的物理 RAM 地址,即使我启用了 PAE,也会导致它只能使用已安装的 4.0 gb RAM 中的 3.4,因为一部分 RAM 被重新定位到 4gb 标记之外,以便为位于 4gb 以下的视频 RAM 等留出空间。

答案2

通常,Windows 无法分配所有内存的原因是部分内存空间用于视频内存 (Video Ram)。

至于你关于 PAE 的问题,我不确定。如果你有 64GB 内存和 PAE,你可能总共可以使用超过 4 GB 的内存,但我认为每个单独的程序都会被限制在 4 GB 内存。

该问题来自 32 位整数提供的地址空间。2^32 提供 4294967295 个值,因此 RAM 限制为 4GB。

答案3

根据本文Linux 在 3G 处拆分,因此你应该可以同时使用 3G 的 RAM,就像 Windows 一样/3GB 开关应用于 boot.ini

至少理论上是这样。由于某些我不知道的原因,测试刚刚证明我只能使用这部分内存的一部分:

08048000-0804b000 data?
0804b000-081ce000 heap
65e00000-b7395000 mmap-ed heap
b7395000-b73ac000 mmap-ed code
bf93f000-bf960000 stack

我不知道为什么我无法malloc()从这个范围开始。081ce000-65e00000

相关内容