Эффект флага защиты mmap для совместного использования между процессами - PullRequest
1 голос
/ 02 марта 2009

Влияет ли флаг защиты на совместное использование процессов? Если у меня есть область памяти mmapped, защищенная 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(...)

Я бы хотел внести небольшую модификацию в небольшую часть области памяти после того, как я отобразил ее, а затем заново защитить все, потому что это проще, чем защищать небольшие части, когда это необходимо.

Вопрос в том, приводит ли он к принудительному принудительному копированию всего файла, скопированного для процесса, или только частей, которые я изменил для процесса?

1 Ответ

1 голос
/ 02 марта 2009

Согласно справочной странице mmap (2) в новейшей системе Linux, MAP_PRIVATE выделяет память, используя копирование при записи (COW). Это означает, что ваша память не будет дублироваться, если вы не внесете в нее изменения. Поскольку COW - эффективный метод для реализации этого, я предполагаю, что это также делается в других * NIX системах.

Память для mmap организована в виде кусков одинакового размера, так называемых страниц. Память всегда будет отображаться кратно размеру страницы, то есть целым страницам. Каждая страница может быть заменена независимо. Поэтому, если вы что-то записываете в этот диапазон памяти mmap, нужно скопировать хотя бы одну страницу.

Размер страницы зависит от вашей системы, на x86 он обычно составляет 4096 байт. Если вас интересует размер страницы вашей системы, вы можете использовать sysconf (3) .

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

Указатель, который вы получаете от mmap (), уже будет указывать на число, кратное размеру страницы, и вы должны передать mprotect () адрес, выровненный по границе страницы.

...