2016-08-04 4 views
1
char *p = (char*) mmap(...); 
....; /* check if p is not -1 */ 
a = *p; 

、ページフォールトが発生します。カーネル内のフォルトハンドラは、物理メモリにページを割り当て、ファイルからそのページに4Kバイトをコピーし、ページエントリを変更します。今回は、*pの命令が再度実行されます。mmapが呼ばれた後のファイルのパス名はどこですか?最後の文を実行している間

しかし、どのように障害ハンドラーは、ページに関連付けられているファイル名とパスを知っているん。ファイル名(またはfd)はどこに保存されていますか?ファイル内のオフセット。プロセスのデータセグメント内のページがスワップアウトされた場合(スワップファイルの中に、私は推測する)何

?カーネルは、後でページをスワップする必要があるときに、どこからコピーするかをどのように知っていますか?

答えて

0

マッピングが作成された後にファイルがファイルシステムから削除された場合でも、マッピングはし続けているので、それは、あなたが言うことができます(これらを使用しないため、ハンドラは、ファイル名またはパスを知りませんすべての開いているファイル記述子とメモリマッピングが閉じられるまで、ファイルの内容は有効です。それはどちらかfdを使用していない

。あなたはmmapコールの直後に fdmmapに渡され、マッピングが有効なままであることが許可されています(実際には開いているファイルハンドルに対してはulimitの低いシステムで必要ですが、10,000ファイルを一度にマップできますfdsの場合ulimitが1000の場合は、すべてfdを開いておくことができませんでした。

OSの仮想メモリマネージャは、mmap時には、基本的に「このメモリは次のディスクセクタによってバックアップされています」という仮想メモリテーブルを設定します。スワップファイルに書き込まれたデータを読み込む際には、非常に似たプロセスを使用します。唯一の違いは、メモリとディスクがどれほど積極的に同期されているか、特定のディスクセクタへのマッピングが静的か動的か「実際の」ファイルであっても、ディスクセクタは、コピーオンライトファイルシステムに書き込むときなど)、メモリを書き込む必要があるか(スワップするか、単にドロップすることができるかなど)(mmap -edメモリの圧力などの下でファイル)。

CPUとOSによって異なるいくつかの仮想メモリアドレス変換のレイヤがあるため、正確な仕組みは異なりますが、基本的な考え方はmmapの後に、ディレクトリ構造をバイパスし、名前やパスのようなものを無視する方法で基礎となるディスクセクタと対話しています。

+0

、ShadowRanger、ありがとうございました。その場合、私はこのスレッドで間違っていたのですか? http://stackoverflow.com/questions/38850533/how-does-the-page-fault-handler-know-where-to-get-the-4k-bytes/38975619#38975619私は答えを見つけたと思った。 – xiaokaoy

関連する問題