ウィキペディアのコピー オン ライトの記事によると、コピー オン ライトは通常、ページへの読み取り専用アクセスを与えることで実装されるため、ページが書き込まれると、ページ フォールト トラップ ハンドラーが一意の物理メモリ ページをマップできます。私の質問は、そのようなページ フォールトが発生したときに、ユーザー レベルのアプリケーションが SIGSEGV シグナルを受信しないのはなぜですか? 結局、SIGSEGV に関するウィキペディアの記事によると、SIGSEGV はプロセスが無効なメモリ参照またはセグメンテーション違反を行ったときにプロセスに送信されるシグナルです。したがって、この場合、それはコピーオンライトのケースであり、なぜSIGSEGVがプロセスに送信されないのですか。
2 に答える
4
これが尋ねられてからしばらく経ちましたが、アレクセイの答えを少し広げたいと思いました。
コピーオンライト(ファイルシステムではなく仮想メモリについて話していると思います)は通常、次のように機能します。
- OS は、書き込み時にどのページをコピーする必要があるかを認識しています。(プロセス専用のページです。) これらのページは、ハードウェアで読み取り専用としてマークされます。ただし、プロセスの仮想メモリ マップには、読み取り可能および書き込み可能としてマークされたページがあります。これは、ユーザー プロセスが問題のページへのフル アクセス権を持っていると認識していることを意味します。
- ユーザー プロセスがこれらのページの 1 つに書き込もうとすると、ページが読み取り専用であることをプロセッサが認識するため (以前のハードウェア マークに基づいて) 、ページ フォールトが生成されます。ページ フォールトはセグメンテーション フォールトに似ていますが、ユーザー プロセスではなくカーネルに対して発生します。
- これにより、ページ フォールト ハンドラーがカーネル内で実行されます。カーネルは、問題のページを調べて、まだコピーされていないプライベート ページであることを確認します。ハンドラーはページのコピーを作成し、そのコピーを書き込み可能としてマークします。
- 次に、ハンドラーは仮想から物理への変換テーブルで古いページのアドレスを新しいアドレスに置き換えて終了します。
- この時点で最後の命令がユーザー プロセスによって再試行されます。今回は、新しいページが仮想メモリ マップ (ユーザー プロセスのメモリ アクセス許可のビュー) とハードウェア (カーネルのビューのメモリ アクセス許可) の両方で書き込み可能であるため、書き込みは成功します。メモリ許可) レベル。
ページ フォールトはセグメンテーション フォールトが発生するたびに生成されますが、ほとんどのページ フォールトはカーネルによって処理され、ページ フォールトを引き起こしたプロセスにセグメンテーション フォールトとして渡されることはありません。ページ フォールトが下位レベルで処理される理由は、次のように多数あります。
- アクセスされたページは、長期間使用されていなかったため、ディスクにページアウトされました。プロセスが再び使用できるように、OS はそれをメモリに戻す必要があります。
- プロセスは、新しく割り当てられたページに初めてアクセスしており、実際の物理ページはまだ割り当てられていません。メモリが実際に使用される前に、OS はページを割り当て、それを仮想から物理への変換テーブルに挿入する必要があります。
- OS は、特定のページへのアクセスを監視できるようにするために、ハードウェア ページ アクセス許可のトリックを実行しています。これはコピー オン ライトで発生することですが、他の用途にも使用できます。のような OS レベルの仮想化テクノロジを考えてみましょう
kvm
。ゲスト OS のメモリ内のメモリ マップド デバイスの場所への書き込みは、実際にはホスト OS のファイルまたはディスプレイに書き込む必要があります。
于 2013-06-18T18:29:35.877 に答える
1
COW の主なアイデアは、COW がユーザー プロセスに対して完全に透過的であり、あたかも共有することなくメモリを完全に所有しているかのように扱うことです。
于 2012-04-21T03:41:46.810 に答える