efecto de indicador de protección mmap para compartir entre procesos

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

  •  03-07-2019
  •  | 
  •  

Pregunta

¿La bandera de protección afecta el intercambio entre procesos? Si tengo la región de memoria mmapped protegida con PROT_READ | PROT_WRITE, ¿se sigue compartiendo completamente siempre que no haya escrito en ella?

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

Me gustaría hacer una pequeña modificación en una pequeña porción de la región de memoria después de haberlo mapeado, luego volver a protegerlo todo, porque es más simple que proteger pequeñas porciones cuando necesito hacerlo.

La pregunta es si termina forzando todo el archivo copiado por proceso o solo las porciones que modifiqué por proceso.

¿Fue útil?

Solución

Según el mmap (2) página de manual en un sistema Linux reciente, MAP_PRIVATE asigna la memoria usando copia -escribir (VACA). Esto significa que su memoria no se duplicará a menos que realice cambios en ella. Como COW es un método eficiente para implementar esto, supongo que también se hace de esta manera en otros sistemas * NIX.

La memoria para mmap está organizada en partes iguales, llamadas páginas. La memoria siempre se asignará en múltiplos del tamaño de la página, es decir, páginas enteras. Cada página se puede intercambiar de forma independiente. Entonces, si escribe algo en este rango de memoria mmap'ed, solo se debe copiar al menos una página.

El tamaño de la página depende de su sistema, en x86 suele ser 4096 bytes. Si está interesado en el tamaño de página de su sistema, puede usar sysconf (3) .

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

El puntero que obtienes de mmap () ya apuntará a un múltiplo del tamaño de página y debes pasar a mprotect () una dirección que se alinea con el límite de una página.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top