1

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

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

与:

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

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

问题是它最终是强制每个进程复制整个文件还是只是我在每个进程中修改的部分?

4

1 回答 1

1

根据最近 Linux 系统上的mmap(2)手册页,MAP_PRIVATE 使用写时复制(COW) 分配内存。这意味着,除非您对其进行更改,否则您的记忆将不会被复制。由于 COW 是实现这一点的一种有效方法,我认为在其他 *NIX 系统中也是如此。

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

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

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

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

于 2009-03-02T17:49:38.233 回答