保护标志会影响进程之间的共享吗?如果我有PROT_READ | PROT_WRITE保护的mmapped内存区域,只要我没有写入它,它是否仍然完全共享?

int prot = PROT_READ|PROT_EXEC;
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0);

VS

int prot = PROT_READ|PROT_WRITE|PROT_EXEC;
image = mmap(...)

我想在映射后对内存区域的一小部分进行小修改,然后重新保护它,因为它比我需要时保护小部分更简单。

问题是它是否最终强制每个进程复制整个文件,或者只是每个进程修改的部分?

有帮助吗?

解决方案

根据 mmap(2) 最新Linux系统上的手册页,MAP_PRIVATE使用 copy-on分配内存 - 写(COW)。这意味着,除非您对内存进行更改,否则不会复制您的内存。由于COW是实现这一目标的有效方法,我认为它也是在其他* NIX系统中以这种方式完成的。

mmap的内存以相同大小的块组织,即所谓的页面。内存将始终以页面大小的倍数映射,即整页。每个页面都可以独立交换。因此,如果您在此mmap的内存范围内写入内容,则只需至少复制一页。

页面大小取决于您的系统,在x86上它通常是4096字节。如果您对系统的页面大小感兴趣,可以使用 sysconf(3)

   #include <unistd.h>
   long pagesize = sysconf(_SC_PAGESIZE);

从mmap()获得的指针已经指向页面大小的倍数,你应该传递mprotect()一个与页面边界对齐的地址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top