2009-03-02 6 views
1

プロセス間の共有に保護フラグが影響しますか? PROT_READ | PROT_WRITEで保護されたメモリ領域がある場合は、書き込まれていない限り、それは完全に共有されていますか?それはmprotectingよりも簡単ですので、私は、それのすべてを再MPROTECT、私はそれをマッピングしてきた後にメモリ領域の小さな部分に小さな変更をしたいと思いますmmap protectionフラグプロセス間の共有に与える影響

int prot = PROT_READ|PROT_WRITE|PROT_EXEC; 
image = mmap(...) 

:対

int prot = PROT_READ|PROT_EXEC; 
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0); 

私はそうする必要があるときに小さな部分。

問題は、プロセスごとにコピーされたファイル全体またはプロセスごとに変更された部分だけを強制終了するかどうかです。

答えて

1

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

mmapのメモリは、同じサイズのチャンク(いわゆるページ)で構成されています。メモリは常にページサイズの倍数、つまり全ページにマッピングされます。各ページは独立してスワップすることができます。したがって、このmmap'edメモリ範囲に何かを書き込むと、少なくとも1ページだけがコピーされなければなりません。

ページサイズはシステムによって異なりますが、x86では通常4096バイトです。システムのページサイズに興味がある場合はsysconf(3)を使用できます。アドレスがページ境界に整列している)

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

あなたは(MMAPから入手ポインタ)は、すでにページサイズの倍数を指します、あなたは(MPROTECTを渡す必要があります。