写入MAP_PRIVATE mmaped文件

时间:2016-11-01 15:19:54

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

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

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

1 个答案:

答案 0 :(得分:0)

要准确回答您的问题,请分两部分回答 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文件写的不是文件的内存映射区域。