Question

Le drapeau de protection affecte-t-il le partage entre les processus? Si j'ai PROT_READ | PROT_WRITE, la région de mémoire mmapped protégée est-elle toujours entièrement partagée tant que je n'y ai pas écrit?

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 voudrais apporter une petite modification à une petite partie de la région de mémoire après l'avoir cartographiée, puis la protéger à nouveau, car c'est plus simple que de protéger de petites portions lorsque j'en ai besoin.

La question est de savoir si le fichier complet copié par processus ou uniquement les portions que j'ai modifiées par processus ont été forcés.

Était-ce utile?

La solution

Selon le mmap (2) Sur la page de manuel d'un système Linux récent, MAP_PRIVATE alloue la mémoire à l'aide de copie sur -écrire (COW). Cela signifie que votre mémoire ne sera pas dupliquée à moins que vous n'y apportiez des modifications. COW étant une méthode efficace pour implémenter cela, je suppose que cela se fait également de cette manière dans d'autres systèmes * NIX.

La mémoire de mmap est organisée en morceaux 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 de mémoire, il ne faut qu'au moins une page à copier.

La taille de la page dépend de votre système. Pour x86, elle est généralement de 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 () pointera déjà sur un multiple de la taille de la page et vous devez transmettre à mprotect () une adresse alignée sur une limite de page.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top