質問

保護フラグはプロセス間の共有に影響しますか? PROT_READ | PROT_WRITEで保護されたmmappedメモリ領域がある場合、まだ書き込まない限り、完全に共有されますか?

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

必要に応じて小さな部分を保護するよりも簡単なので、マップした後にメモリ領域の小さな部分に小さな変更を加え、すべてを再保護したいです。

問題は、プロセスごとにファイル全体をコピーするのか、プロセスごとに変更した部分だけをコピーするのか、ということです

役に立ちましたか?

解決

mmap(2) 最近のLinuxシステムのマニュアルページ、MAP_PRIVATEは copy-onを使用してメモリを割り当てます-write (COW)。つまり、変更を加えない限り、メモリは複製されません。 COWはこれを実装するための効率的な方法であるため、他の* NIXシステムでもこの方法で行われると想定しています。

mmapのメモリは、ページと呼ばれる同じサイズのチャンクで構成されています。メモリは常にページサイズの倍数、つまりページ全体にマッピングされます。各ページは個別に交換できます。したがって、このmmapされたメモリ範囲に何かを書き込む場合、少なくとも1ページだけをコピーする必要があります。

ページサイズはシステムによって異なりますが、x86では通常4096バイトです。システムのページサイズに関心がある場合は、 sysconf(3)

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

mmap()から取得するポインターは、すでにページサイズの倍数を指しているため、mprotect()にページ境界に揃えられたアドレスを渡す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top