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”计数。
"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”计数。
handle_mm_fault
的地方,例如arch / arm中的do_page_fault
,测试以查看故障是否具有用户上下文。但是,页面缓存中的所有页面是否都会受到页面故障的影响呢? - EQvanhandle_mm_fault
似乎处理任何页面的错误。如果它不处理普通文件支持的页面错误,那么这些错误会如何处理呢? - EQvan