2009-03-02 7 views
1

L'indicateur de protection affecte-t-il le partage entre les processus? Si j'ai la région de mémoire mouillée PROT_READ | PROT_WRITE protégée, est-elle encore entièrement partagée tant que je n'y ai pas écrit?Effet du drapeau de protection mmap sur le partage entre les processus

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

Je veux faire petite modification à la petite partie de la région de mémoire après que je l'ai cartographié, puis re-mprotect tout cela, car il est plus simple que mprotecting petites portions quand je dois le faire.

La question est de savoir si elle finit par forcer le fichier entier copié par processus ou seulement les parties que j'ai modifiées par processus?

Répondre

1

Selon la page de manuel mmap(2) sur un système Linux récent, MAP_PRIVATE alloue la mémoire en utilisant copy-on-write (COW). Cela signifie que votre mémoire ne sera pas dupliquée à moins d'y apporter des modifications. Comme COW est une méthode efficace pour implémenter ceci, je suppose que c'est également fait de cette façon dans d'autres systèmes * NIX.

La mémoire de mmap est organisée en blocs de taille égale, appelés pages. La mémoire sera toujours mappée en multiples de la taille de la page, c'est-à-dire des pages entières. Chaque page peut être permutée indépendamment. Donc, si vous écrivez quelque chose dans cette plage mémoire mmap'ed, seulement une page au moins doit être copiée.

Le format de la page dépend de votre système, sur x86, il est généralement 4096 octets. Si la taille de la page de votre système vous intéresse, vous pouvez utiliser sysconf(3).

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

Le pointeur que vous obtenez de mmap() va déjà pointer vers un multiple de la taille de la page et vous devriez passer mprotect() une adresse étant alignée sur une frontière de page.

Questions connexes