3

我试图使 linux 内存管理更加清晰,以用于调整和性能目的。

通过阅读IBM 网站上的这本非常有趣的红皮书“Linux 性能和调优指南”,我发现了一些我不完全理解的东西。

在 IA-32 等 32 位架构上,Linux 内核只能直接寻址物理内存的第一个 GB(考虑保留范围时为 896 MB)。所谓上面的内存ZONE_NORMAL必须映射到下面的1 GB。这种映射对应用程序是完全透明的,但分配内存页面ZONE_HIGHMEM会导致性能下降。

  1. 为什么896 MB以上的内存必须映射到较低的1GB?
  2. 为什么分配内存页面会影响性能ZONE_HIGHMEM
  3. 那有什么ZONE_HIGHMEM用呢?
  4. 为什么能够识别高达 4gb ( CONFIG_HIGHMEM=y) 的内核只能使用第一个千兆字节?

提前致谢

4

1 回答 1

4

当用户进程陷入内核时,页表不会改变。这意味着一个线性地址空间必须能够覆盖用户进程可用的内存地址和内核可用的内存地址。

在允许 4GB 线性地址空间的 IA-32 上,通常将线性地址空间的前 3GB 分配给用户进程,将线性地址空间的最后 1GB 分配给内核。

内核必须使用其 1GB 的地址范围来寻址它需要的物理内存的任何部分。896MB 以上的内存不会“映射到低 1GB” - 发生的情况是 896MB 以下的物理内存在内核的线性地址空间部分中分配了一个永久线性地址,而高于该限制的内存必须分配一个临时映射线性地址空间的剩余部分。

将页面映射到用户空间进程时对性能没有影响ZONE_HIGHMEM- 对于用户空间进程,所有物理内存页面都是相等的。当内核需要访问非用户页面时,就会对性能产生影响ZONE_HIGHMEM——为此,如果尚未映射,它必须将其映射到线性地址空间。

于 2011-05-27T06:08:05.827 回答