Linuxでコンテキスト切り替え後にページテーブルを更新する方法

Linuxでコンテキスト切り替え後にページテーブルを更新する方法

Linuxの仮想メモリシステムが次の状況を処理する方法:

  1. プロセス1は、仮想ページの1つを物理フレーム1にマッピングする。
  2. プロセス2へのコンテキスト切り替え。
  3. プロセス2はフレーム1を置き換え、それをそれ自体の内容に置き換えます。
  4. コンテキストを再びプロセス 1 に切り替えます。

プロセス1は、フレーム1の内容を所有せずに交換する必要があることをどのように理解できますか?

答え1

技術的には、「process1」はこれを知りません。各プロセスには一連のページテーブルがあります。カーネルはどのプロセスに切り替えるかを知り、ページテーブルを切り替えます。これらのページテーブルの一部はカーネルであり、すべてのプロセス間で共有されます(したがって、アドレス範囲の一部は通常0xc0000000から0xffffffffの範囲にあります - これらのページはすべて存在しませんが)。一般に、この共有部分は、すべてのページテーブルセットが「カーネルページテーブルビット」の同じ共有部分を指すようにすることによって実装されます。

この共有セクションを使用すると、現在実行中のプロセスまたはそのプロセスが実行している操作に関係なく、カーネル呼び出し、トラップ、および割り込みをカーネルに入れることができます。

これが機能する正確な方法は、カーネルが構築されているアーキテクチャによって異なりますが、たとえばx86(32ビットと64ビット)では、CR3は現在のページテーブルを指すレジスタです。したがって、各プロセスはページテーブルへのポインタを持ち、新しいプロセスに切り替えるプロセスの一部としてCR3にロードされます。プロセス1のレジスタ値(少なくともスタックポインタ)が復元されるのと同じです。点灯しています。

答え2

問題は、仮想メモリアドレス空間ではなく、2つのプロセス間のコンテキスト切り替え時のページフレームの競合に関するものです(仮想メモリアドレス空間は各プロセスに固有であり、これはニュースではありません)。このスタックオーバーフローリンクには、同じ質問と正確な答えがあります。 https://stackoverflow.com/questions/16581490/how-does-kernel-know-which-pages-in-the-virtual-address-space-correspond-to-as?lq=1

関連情報