mmap()の研究では、mmapはページエラーのために仮想メモリアドレスに達した場合にのみ要求ページングを使用してデータをカーネルページキャッシュにコピーすることを知っています。
ページキャッシュより大きいファイルを読み取る場合は、ページキャッシュの一部の古いページをリサイクルのために置き換える必要があります。だから私の質問は、ページテーブルが更新され、その仮想メモリアドレスがキャッシュ内の古い古いページ(新しいデータが含まれている)アドレスにマッピングされるのですか?どうやってこれが起こったのですか?これはmmap()システムコールの一部ですか?
答え1
その仮想メモリアドレスをキャッシュ内の古い古いページ(現在の新しいデータを含む)アドレスにマッピングするようにページテーブルが更新されますか?どうやってこれが起こったのですか?
呼び出されると、mmap()
プロセスの仮想アドレス空間で指定されたファイルのマッピングを作成します。このマッピングは、実際にアクセスしたときにこれらのページをロードする機能のみを設定し、まだメモリに何もロードしていません。これらのページにアクセスすると、ページフォルトが作成され、ページテーブルエントリが更新され、仮想アドレスを新しくロードされたページの物理アドレスにマッピングしてファイルにアクセスできます。これはで起こりましたfilemap_fault
。
これは、削除されたマップされたページにアクセスしても機能する方法です。カーネルはページエラーを処理し、ファイルの内容をページに戻しますが、アプリケーションの観点から何も起こりません。
ここにはそれ自体には特別なものはありませんmmap()
。これは、需要ページングがLinuxカーネルで一般的に機能する方法であり、ほとんどすべて、一般的なプログラムメモリ、ファイルキャッシュエントリにも使用されます。
[...]対応する仮想メモリアドレスマッピング[...]
reads を使用する場合、カーネルは通常(ユーザーが表示した) または(カーネルで表示した) 役に立たないという表示がmmap()
ない限り、ページエラーを生成した単一ページよりも多くのコンテンツをロードするために先読みを使用します。ヒューリスティック)。MADV_RANDOM
MMAP_LOTSAMISS