0

私はmmapを理解しようとし、次のリンクを読んでもらいました:http:
//duartes.org/gustavo/blog/post/page-cache-the-affair-between-memory-and-files

私は一般的にテキストを理解していて、それは私にとって理にかなっています。しかし、最後に段落がありますが、それは私が本当に理解していないか、私の理解に適合していません。

上記の読み取り専用ページテーブルエントリは、マッピングが読み取り専用であることを意味するのではなく、可能な限り最後の瞬間まで物理メモリを共有するためのカーネルトリックにすぎません。更新にのみ適用されることを思い出すまで、「プライベート」が少し誤称であることがわかります。この設計の結果、ファイルをマップする仮想ページは、ページがから読み取られただけである限り、他のプログラムによってファイルに加えられた変更を非公開で確認します。。コピーオンライトが実行されると、他のユーザーによる変更は表示されなくなります。この動作はカーネルによって保証されていませんが、x86で得られるものであり、APIの観点からは理にかなっています。対照的に、共有マッピングは単にページキャッシュにマッピングされ、それだけです。更新は他のプロセスに表示され、最終的にディスクに保存されます。最後に、上記のマッピングが読み取り専用の場合、ページフォールトは、コピーオンライトではなくセグメンテーションフォールトをトリガーします。

次の行は私には一致しません。意味がわかりません。

この設計の結果、ファイルをマップする仮想ページは、ページがから読み取られただけである限り、他のプログラムによってファイルに加えられた変更を非公開で確認します。

プライベートです。そのため、他の人による変更を確認することはできません。

最後に、上記のマッピングが読み取り専用の場合、ページフォールトは、コピーオンライトではなくセグメンテーションフォールトをトリガーします。

これで作者が何を意味するのかわからない。彼らの旗は「MAP_READ_ONLY」ですか?書き込みが発生するまで、プログラムvirtual-pagesからpage-cache内のpage-table-entriesへのすべてのポインタは読み取り専用です。

この2行を理解するのを手伝ってくれませんか。ありがとう

更新
いくつかの助けを借りて、それはそれを手に入れたようです。

この設計の結果、ファイルをマップする仮想ページは、ページが読み取られただけである限り、他のプログラムによってファイルに加えられた変更を非公開で認識します。

マッピングはプライベートですが、仮想ページは、それ自体がページを変更するまで、他の人による変更を実際に見ることができます。変更は非公開になり、書き込みプログラムの仮想ページにのみ表示されます。

最後に、上記のマッピングが読み取り専用の場合、ページフォールトは、コピーオンライトではなくセグメンテーションフォールトをトリガーします。

ページ自体にも権限(読み取り/書き込み/実行)を設定できると言われています。

私が間違っているかどうか教えてください。

4

1 に答える 1

1

このフラグメント:

この設計の結果、ファイルをマップする仮想ページは、ページがから読み取られただけである限り、他のプログラムによってファイルに加えられた変更を非公開で確認します。

は、カーネルが最適化の名の下に少し不正行為をしていることを示しています。プライベートマッピングを要求した場合でも、カーネルは実際には最初は共有マッピングを提供します。次に、ページを作成すると、非公開になります。

ファイルにアクセスしているすべてのプロセスがでそれを行っている場合、この「不正行為」は問題ではない(違いはありません)ことに注意してMAP_PRIVATEください。その場合、ファイルへの実際の変更は発生しません。さまざまなプロセスのマッピングは、各プロセスが最初にファイルに書き込むたびに応じて、さまざまな時点で「偽の不正行為MAP_PRIVATE」から真の「MAP_PRIVATE」に単純にアップグレードされます。これはおそらく一般的なシナリオです。違いが生じるのは、ファイルが他の手段(または通常の非I / O操作)によって同時に更新されている場合MAP_SHAREDのみPROT_WRITEですmmap

ページ自体にも権限(読み取り/書き込み/実行)を設定できると言われています。

確かに、彼らはできます。最初にファイルをマップするときに、必要なアクセス許可を要求する必要があります。実際には、への3番目の引数は、、、、、およびのmmap組み合わせにPROT_READなります。PROT_WRITEPROT_EXECPROT_NONE

于 2012-04-20T18:10:16.523 に答える