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

EQv*_*van 6 linux memory kernel

Linux /proc/meminfo“Mapped”主题是什么意思?我见过几句俏皮话,告诉我这是“由设备或库使用 mmap 映射的内存总大小(以千字节为单位)”。但我现在花了近二十个小时搜索 2.6.30.5 内核源代码,试图确认这一说法,但我一直无法这样做——事实上,我看到了一些似乎与其相冲突的东西。

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

  1. meminfo 的“缓存”主题引用的所有页面不是都有文件支持吗?这是否意味着所有这些页面都必须“映射”?我查看了来自几种不同架构的几十个 meminfo 列表,并且“映射”值始终比“缓存”值小得多。

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

  3. 我研究了一些驱动程序的 mmap() 函数。其中许多函数调用vm_insert_page或remap_vmalloc_range建立它们的映射,并且这些函数确实增加了“映射”计数。但是很多其他驱动程序似乎都调用了remap_pfn_range,据我所知,这不会增加“映射”计数。

caf*_*caf 6

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

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