ページエラーが発生した場合、Unixはエラーアドレスがスワップスペースにあるかどうかを確認します。

ページエラーが発生した場合、Unixはエラーアドレスがスワップスペースにあるかどうかを確認します。

プロセスの仮想アドレスでページエラーが発生した場合、Linux / Unixオペレーティングシステムは、そのページ(対応する仮想アドレスの)が以前にメモリに存在し、ディスクに置き換えられて交換された(つまり、ページが現在のメモリに存在するか)、どのように確認します。しますか?スワップ空間))またはページが以前にメモリにロードされたことがありません(つまり、ページがスワップ空間に存在しません)。

ベストアンサー1

まず、ハードウェアレベルで何が起こっているのかを見てください。ページ障害が発生した場合メモリ管理ユニット仮想アドレスを逆参照しようとしましたが、そのアドレスの誤った説明が見つかりました。これが発生すると、プロセッサはトラップを実行します。つまり、カーネルモードに切り替えて事前定義されたアドレス(トラップベクトル)にジャンプし、いくつかのレジスタを入力してページエラーが発生したことを示し、カーネルが何を決定するのに十分な情報を提供します。起こった。どのアドレスが要求されたか、どのコマンドでエラーが発生したか、どのタスクで発生したか。ここでは一般的なアイデアを示し、詳細はプロセッサアーキテクチャによって異なります。

トラップハンドラコードは、レジスタとメモリを調べてエラーの性質(他の種類の例外に対して同じハンドラを呼び出すことができます)、要求されたアドレス、および以前にアクティブになったプロセスを確認するカーネルの一部です。次に、そのアドレスの対応するプロセスでマッピングする必要があることを示すいくつかのデータ構造を見つけます。ここでも、データ構造の特性は、プロセッサアーキテクチャとUnixバリアントの間で異なります。一部のプロセッサアーキテクチャでは、MMUがスワップセクタ番号を格納するために解釈しない誤った記述子に十分なビットがあります。この場合、カーネルは他のデータ構造を参照する必要はありません。そうでない場合、カーネルはプロセスに接続されたデータ構造を参照し、対応するメモリマップを記述します。

同じメカニズムで、次のような他の事項も決定できます。

  • メモリマップされたファイルの場合は、ファイルからページをロードする必要があります。
  • メモリはマップされていますが、操作は承認されませんでした。たとえば、読み取り専用メモリに書き込もうとしました。この場合、カーネルはプロセスのSIGSEGV信号(存在する場合)に制御を切り替える準備をします。それ以外の場合、プロセスは終了します。
  • CPU読み取り専用としてマークされていますが、書き込み中にコピーとしてマークされたページに書き込もうとしました。この場合、カーネルはページをコピーします。

カーネルがプロセスに必要なコンテンツを含むページをRAMから取得すると、それを反映するためにプロセスのメモリマップが更新されます。その後、カーネルはコンテキスト切り替えと同様にプロセスに制御権を再送信しますが、プロセスによって実行されたコマンドの直後に制御権を返すのではなく、そのコマンドの前に制御権を返すことで、今回は正常に無効なコマンドを実行します。

おすすめ記事