32位和64位内核上的zone_NORMAL和ZONE_HIGHMEM

时间:2011-05-26 21:42:49

标签: linux-kernel virtual-memory

我试图让linux内存管理更加清晰,以便进行调优和演出。

通过阅读IBM website上发现的非常有趣的红皮书“Linux性能和调优指南”,我发现了一些我并不完全理解的内容。

  

在诸如IA-32之类的32位体系结构上,Linux内核可以直接仅处理第一千兆字节的物理内存(考虑保留范围时为896 MB)。所谓的ZONE_NORMAL上方的内存必须映射到较低的1 GB。此映射对应用程序完全透明,但在ZONE_HIGHMEM中分配内存页会导致性能下降。

  1. 为什么896 MB以上的内存必须映射到较低的1GB?
  2. 为什么在ZONE_HIGHMEM中分配内存页面会对性能产生影响?
  3. 当时使用的ZONE_HIGHMEM是什么?
  4. 为什么能够识别高达4gb(CONFIG_HIGHMEM=y)的内核可以只使用第一个千兆字节?
  5. 提前致谢

1 个答案:

答案 0 :(得分:4)

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

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

内核必须使用其1GB范围的地址才能解决所需的物理内存的任何部分。高于896MB的内存“映射到低1GB” - 会发生的情况是,低于896MB的物理内存在内核的线性地址空间中被分配了一个永久线性地址,而作为超过该限制的内存必须在线性地址空间的剩余部分中分配临时映射。

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