【问题标题】:Writing to MAP_PRIVATE mmaped file写入 MAP_PRIVATE 映射文件
【发布时间】:2017-03-14 18:28:31
【问题描述】:

我正在尝试理解这个肮脏的 CoW 概念证明:https://github.com/dirtycow/dirtycow...ter/dirtyc0w.c

当子线程(上面链接中的 procselfmemThread)写入由父线程映射为 MAP_PRIVATE 和 PROT_READ 的内存时会发生什么?具体来说,内核是否将现有映射修改为匿名和可写的?什么时候进行写时复制?让我们假设另一个子线程(上面链接中的 madviseThread)没有运行。

【问题讨论】:

    标签: memory-management linux-kernel copy-on-write


    【解决方案1】:

    要准确回答您的问题,请分两部分回答 1.内存映射一个只读文件 由于您已经使用 PROT_READ 和 MAP_PRIVATE 映射了一个文件,这将为您的文件创建 VMA(虚拟内存区域)。 VMA 只不过是一种元数据结构,用于管理您的进程区域,如文本、数据和 mmap 区域。 VMA 将有开始和结束地址,这些开始和结束地址基本上是您的进程虚拟地址,用于文件支持的内存映射区域和红色唯一区域(从 PROT_READ 开始)。

    1. 写入 /proc/self/mem
      /proc/self/mem 是一个允许访问进程虚拟地址空间的特殊文件,因为在 u 提到的程序中,它会寻找内存映射区域(MAP_PRIVATE)的文件描述符。它基本上是写入早期映射文件的内存映射区域,因为它在写入时是只读映射,它会创建页面副本并在写入时进行复制。 Notr:这里写入的 /proc/self/mem 文件不是文件的内存映射区域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2015-07-17
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多