Linux / proc / meminfo“映射”主题是什么意思?

时间:2009-08-30 06:59:08

标签: linux memory kernel

Linux / proc / meminfo“映射”主题是什么意思?我已经看到几个单行器告诉我它是“设备或库用mmap映射的内存总大小(以千字节为单位)”。但我现在花了将近二十个小时搜索2.6.30.5内核源代码试图证实这个陈述,而我却无法这样做 - 事实上我看到了一些似乎与之相冲突的事情。

“已映射”计数保存在global_page_state[NR_FILE_MAPPED]中。声明NR_FILE_MAPPED附近的评论说:“Pagecache页面映射到页面表。仅从进程上下文修改。”

  1. meminfo的“缓存”主题所引用的所有页面都不是由文件支持的吗?这是不是意味着所有这些页面都必须“映射”?我从几个不同的架构中查看了几十个meminfo列表,并且“Mapped”值总是小于“Cached”值。

  2. 在任何给定时间,大部分内存都充满了可执行映像和共享库。看看/ proc / pid / smaps,我看到所有这些都被映射到VMA中。是否所有这些都使用mmap()映射到内存中?如果是这样,为什么“Mapped”如此之小?如果它们没有使用mmap()映射到内存中,它们如何映射? handle_mm_fault调用get_user_pages和各种与体系结构相关的页面错误处理程序,会增加“映射”计数,并且它们似乎对与VMA关联的任何页面都这样做。

  3. 我查看了一堆驱动程序的mmap()函数。其中许多调用vm_insert_pageremap_vmalloc_range来建立映射,这些函数会增加“映射”计数。但是很多其他司机似乎打电话给remap_pfn_range,据我所知,这不会增加“映射”次数。

2 个答案:

答案 0 :(得分:2)

  1. 反过来说。 Mapped中的所有内容也都在Cached中 - Mapped是已映射到进程虚拟内存空间的pagecache数据。缓存中的大多数页面都不会被进程映射。

  2. 同一页面可以映射到许多不同的页面表中 - 但它只会在Mapped中计算一次。因此,如果您有100个正在运行的进程,每个进程都有{2}映射的/lib/i686/cmov/libc-2.7.so,那么仍然只会向Mapped添加2MB。

答案 1 :(得分:0)

我认为其目的是计算从文​​件映射的页数。在我的源代码副本(2.6.31)中,如果要删除的页面未被匿名映射,则它在page_add_file_rmap中递增,在page_remove_rmap中递减。例如,在page_add_file_rmap中调用__do_fault,以防映射不是匿名的。

所以它看起来一直对我来说......