我试图使linux内存管理在调优和性能方面更加清晰。
通过阅读这本非常有趣的红皮书“指南”,我发现了一些我不完全理解的东西。
在32位架构(如IA-32 )上,Linux内核只能直接寻址物理内存的第一个千兆字节(当考虑保留范围时为896 MB )。所谓的
ZONE_NORMAL上面的内存必须映射到1GB以下的内存中.这种映射对应用程序是完全透明的,但是在ZONE_HIGHMEM中分配内存页会导致较小的性能下降。
ZONE_HIGHMEM中分配内存页会对性能产生影响?ZONE_HIGHMEM是用来做什么的呢?CONFIG_HIGHMEM=y )的内核只能使用第一个千兆字节?提前感谢
发布于 2011-05-27 06:08:05
当用户进程陷入内核时,页面表不会更改。这意味着一个线性地址空间必须能够覆盖用户进程可用的内存地址和内核可用的内存地址。
在IA-32上,允许一个4GB的线性地址空间,通常将线性地址空间的前3GB分配给用户进程,最后1GB的线性地址空间分配给内核。
内核必须使用其1GB的地址范围,以便能够处理它需要的物理内存的任何部分。896 be以上的内存没有“映射到低1GB”--所发生的情况是,在内核的线性地址空间的一部分中,为896 be以下的物理内存分配了一个永久的线性地址,而当内存超过这个限制时,必须在线性地址空间的其余部分分配一个临时映射。
当将ZONE_HIGHMEM页面映射到用户空间进程时,性能不会受到影响--对于用户空间进程,所有物理内存页都是相等的。当内核需要访问ZONE_HIGHMEM中的非用户页面时,它必须将其映射到线性地址空间(如果还没有映射),就会对性能产生影响。
https://stackoverflow.com/questions/6145456
复制相似问题