2009-03-02 7 views
1

Beeinflusst das Schutz-Flag die Freigabe zwischen Prozessen? Wenn ich PROT_READ | PROT_WRITE --geschützte MMAPapped Speicherregion habe, ist es noch vollständig freigegeben, solange ich nicht in es geschrieben habe?mmap-Schutz-Flag-Effekt für die Freigabe zwischen Prozessen

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

Ich möchte eine kleine Änderung an kleinen Teil des Speicherbereichs machen, nachdem ich es kartiert haben, dann wieder mprotect sie alle, weil es einfacher ist als mprotecting kleine Portionen wenn ich es brauche.

Die Frage ist, ob es am Ende zwingt, die gesamte Datei pro Prozess kopiert oder nur die Abschnitte I pro Prozess verändert?

Antwort

1

Gemäß der mmap(2) man-Seite eines aktuellen Linux-Systems weist MAP_PRIVATE den Speicher unter Verwendung von copy-on-write (COW) zu. Dies bedeutet, dass Ihr Speicher nur dann dupliziert wird, wenn Sie Änderungen daran vornehmen. Da COW eine effiziente Methode zur Implementierung ist, gehe ich davon aus, dass dies auch in anderen * NIX-Systemen geschieht.

Der Speicher für mmap ist in gleich großen Blöcken, sogenannten Pages, organisiert. Speicher wird immer in Vielfachen der Seitengröße, d. H. Ganzen Seiten, abgebildet. Jede Seite kann unabhängig voneinander ausgetauscht werden. Wenn Sie also etwas in diesen MMAP-Speicherbereich schreiben, muss nur mindestens eine Seite kopiert werden.

Die Seitengröße hängt von Ihrem System ab, auf x86 sind es normalerweise 4096 Bytes. Wenn Sie an der Seitengröße Ihres Systems interessiert sind, können Sie sysconf(3) verwenden.

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

Der Zeiger Sie von mmap() erhalten wird darauf bereits auf ein Vielfaches der Seitengröße und Sie sollten an einer Seitengrenze passieren mprotect() eine Adresse ausgerichtet ist.

Verwandte Themen