Linux /proc/meminfo中的“Mapped”主题是什么意思?

6
Linux的/proc/meminfo中的"Mapped"是什么意思?我看到了几个一行代码,告诉我它是“由具有mmap的设备或库映射的内存总大小(以千字节为单位)。”但是我现在已经花了近20个小时搜索2.6.30.5内核源代码来确认这个声明,但我无法这样做-实际上,我看到了一些似乎与它冲突的东西。
"Mapped"计数保存在global_page_state [NR_FILE_MAPPED]中。在NR_FILE_MAPPED的声明附近的注释说:“映射到页表中的Pagecache页面。只能从进程上下文修改。”
以下是需要回答的问题:
1. meminfo的"Cached"主题所涉及的所有页面不都是文件支持的吗?那不是意味着所有这些页面都必须是“Mapped”吗?我查看了几十个meminfo列表,来自几种不同的架构,总是“Mapped”值远小于“Cached”值。
2. 在任何给定时间,大多数内存都填充了可执行映像和共享库。查看/proc/pid/smaps,我发现所有这些都映射到VMAs中。所有这些是否都使用mmap()映射到内存中?如果是,为什么“Mapped”如此之小?如果它们没有使用mmap()映射到内存中,那么它们是如何映射的?对handle_mm_fault的调用(由get_user_pages和各种体系结构相关的页面错误处理程序调用)会增加“Mapped”计数,并且它们似乎会为与VMA关联的任何页面这样做。
3. 我看了一堆驱动程序的mmap()函数。其中许多调用vm_insert_page或remap_vmalloc_range来建立它们的映射,这些函数确实增加了“Mapping”计数。但是还有很多其他驱动程序似乎调用remap_pfn_range,据我所知,这不会增加“Mapping”计数。
2个回答

6
  1. 实际上是相反的。所有在Mapped中的数据都同时也在Cached中,Mapped是指已映射到进程虚拟内存空间的页面缓存数据。而Cached中的大多数页面并未被进程映射。

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


啊!<b>进程</b>的内存空间。这可能已经足够作为一个线索了——谢谢! - EQvan
是的,现在我在寻找它,我看到调用handle_mm_fault的地方,例如arch / arm中的do_page_fault,测试以查看故障是否具有用户上下文。但是,页面缓存中的所有页面是否都会受到页面故障的影响呢? - EQvan
我认为它们只应该受到写入错误的影响,而不是不存在的错误。但这对问题有什么影响呢? - caf
我期望任何有文件支持的页面,如果已经被分页或者一开始没有完全加载,都会受到未出现错误的影响。其中让我困惑的是,handle_mm_fault 似乎处理任何页面的错误。如果它不处理普通文件支持的页面错误,那么这些错误会如何处理呢? - EQvan
如果已经被分页,它就不再在页面缓存中。 - caf

0

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

所以对我来说看起来一切都很一致...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接