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

StackOverflow https://stackoverflow.com/questions/601806

  •  03-07-2019
  •  | 
  •  

Вопрос

Влияет ли флаг защиты на совместное использование процессов?Если у меня есть защищенная PROT_READ|PROT_WRITE область памяти mmapped, остается ли она полностью общей, пока я в нее не записывал?

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(...)

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

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top