【问题标题】:What does the Linux /proc/meminfo "Mapped" topic mean?Linux /proc/meminfo“映射”主题是什么意思?
【发布时间】:2010-11-24 02:35:51
【问题描述】:

Linux /proc/meminfo“映射”主题是什么意思?我见过几个单行字,告诉我它是“设备或库使用 mmap 映射的内存总大小(以千字节为单位)”。但是我现在花了将近 20 个小时搜索 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(由get_user_pages 和各种依赖于体系结构的页面错误处理程序调用)增加“映射”计数,并且它们似乎对与VMA 关联的任何页面都这样做。

    李>
  3. 我查看了一堆驱动程序的 mmap() 函数。其中许多调用vm_insert_pageremap_vmalloc_range 来建立它们的映射,并且这些函数确实增加了“映射”计数。但是许多其他驱动程序似乎调用remap_pfn_range,据我所知,这并没有增加“映射”计数。

【问题讨论】:

    标签: linux memory kernel


    【解决方案1】:

    我认为其目的是计算从文​​件映射的页数。在我的源副本 (2.6.31) 中,如果要删除的页面不是匿名映射的,则它在 page_add_file_rmap 中递增,并在 page_remove_rmap 中递减。例如,page_add_file_rmap__do_fault 中被调用,同样是在映射不是匿名的情况下。

    所以在我看来一切都是一致的......

    【讨论】:

      【解决方案2】:
      1. 情况正好相反。 Mapped 中的所有内容也都在 Cached 中 - Mapped 是已映射到进程虚拟内存空间的页面缓存数据。 Cached 中的大多数页面都没有被进程映射。

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

      【讨论】:

      • 啊! 进程内存空间。这可能是一个足够的线索 - 谢谢!
      • 是的,现在我正在寻找它,我看到handle_mm_fault 的调用者,例如arch/arm 中的do_page_fault,测试以查看故障是否具有用户上下文。但是不是页面缓存中的所有页面都会出现页面错误吗?
      • 我相信他们应该只受到写入错误的影响,而不是不存在的错误。但这对这个问题有什么影响?
      • 我希望任何文件支持的页面如果已被分页,或者如果它从未完全加载过,都会受到不存在的错误的影响。让我感到困惑的一件事是handle_mm_fault 似乎可以处理任何页面的错误。如果它不处理普通的文件支持页面的错误,那么如何处理这些错误?
      • 如果它被调出,它就不再在页面缓存中了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多