mmap機能の読み取り専用仮想ページでの書き込み中のコピーはどのように機能しますか?

mmap機能の読み取り専用仮想ページでの書き込み中のコピーはどのように機能しますか?

私はCとLinuxに初めて触れました。関数の使い方に関する質問ですmmap。関数プロトタイプはmmap次のとおりです。

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

次のコードが表示されます。

char *srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);

これはPROT_READ、仮想ページを読むことしかできないことを意味します。MAP_PRIVATE個人書き込み中にコピーオブジェクトであることを示します。記録中のコピー技術は、両方のプロセスが同じオブジェクトを使用し、プロセスAがオブジェクトを変更する場合、これらの変更はプロセスAにのみ属し、プロセスBには表示されません。したがってMAP_PRIVATE、ユーザーが何かを書くことを許可しますが、PROT_READ読み取り専用としてマークするだけで読み取ることができるので、COWを使用する必要はありません(COWを使用する前に何かを書く必要があり、COWは変更を見ることができるだけです)。あなたのプロセスに応じて)お互いに矛盾していませんか?

ベストアンサー1

呼び出されると、mmap発信者は共有(MAP_SHARED)または個人()マッピングMAP_PRIVATEから選択する必要があります。書き込み中のコピーの使用は、実装の詳細と比較されます。POSIXの定義mmap

マッピングの種類(共有または個人)によって、書き込み時に発生する状況のみが決まります。したがって、この場合はPROT_READ重要ではなく、書き込み中にコピーを使用することも重要ではありません。サポートファイルに対するすべての変更は、プライベートマッピングを使用しても最終的にプロセスマッピングに表示されます。理論的には、この動作は次のように変更できます。

マッピング更新は、同じファイルをマッピングする他のプロセスには表示されず、デフォルトファイルに渡されません。呼び出し後にファイルへの変更がmmap()マップされた領域に表示されるかどうかは指定されません。

(からMAP_PRIVATE説明man 2 mmap)。

また、プロセスは以下を使用してメモリ保護を変更できます。mprotect、基本ファイルに書き込むことができるとします。マッピングの種類は変更できませんが、保護は変更できるため、プロセスはファイルを読み取り専用にマッピングしてから読み取り/書き込みに変更できます(ファイル自体が読み取り - 書き込みで開かれている場合は書き込み中にコピーされます)。重要。

(ありがとうございます。ユーザー 414777この回答の以前のバージョンでいくつかのエラーを修正するために使用されます。残っているエラーはすべて私のものです。 )

おすすめ記事