1

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

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

対:

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

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

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

4

1 に答える 1

1

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

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

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

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

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

于 2009-03-02T17:49:38.233 に答える