Domanda

Il flag di protezione influisce sulla condivisione tra processi? Se ho un'area di memoria mmapped protetta da PROT_READ | PROT_WRITE, è ancora completamente condivisa fintanto che non ci ho scritto?

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

Vorrei apportare piccole modifiche a una piccola porzione della regione di memoria dopo averla mappata, quindi riproprimere tutto, perché è più semplice che proteggere piccole porzioni quando devo farlo.

La domanda è se finisce per forzare l'intero file copiato per processo o solo le parti che ho modificato per processo?

È stato utile?

Soluzione

Secondo il mmap (2) pagina man su un recente sistema Linux, MAP_PRIVATE alloca la memoria usando copy-on -write (COW). Ciò significa che la tua memoria non sarà duplicata a meno che non apporti delle modifiche. Poiché COW è un metodo efficiente per implementarlo, suppongo che sia stato fatto in questo modo anche in altri sistemi * NIX.

La memoria per mmap è organizzata in blocchi di dimensioni uguali, le cosiddette pagine. La memoria sarà sempre mappata in multipli della dimensione della pagina, cioè intere pagine. Ogni pagina può essere scambiata in modo indipendente. Pertanto, se si scrive qualcosa in questo intervallo di memoria con mmap, è necessario copiare solo almeno una pagina.

Le dimensioni della pagina dipendono dal tuo sistema, su x86 di solito è 4096 byte. Se sei interessato alle dimensioni della pagina del tuo sistema, puoi usare sysconf (3) .

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

Il puntatore che ricevi da mmap () punterà già a un multiplo della dimensione della pagina e dovresti passare a mprotect () un indirizzo allineato a un limite di pagina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top