プロセス (プロセス アドレス空間にマップされる) 用にページが作成されると、そのページはカーネル アドレス空間にマップされますか?
そうでない場合、カーネル仮想アドレスはありません。次に、必要に応じて、スワッパーがページを見つけてそれを交換する方法は?
プロセス (プロセス アドレス空間にマップされる) 用にページが作成されると、そのページはカーネル アドレス空間にマップされますか?
そうでない場合、カーネル仮想アドレスはありません。次に、必要に応じて、スワッパーがページを見つけてそれを交換する方法は?
x86 または同様の (ページ変換に関して) アーキテクチャについて話している場合、常に 1 つの仮想アドレス空間があり、通常、その一部はカーネル用に予約され、もう 1 つはユーザーモード プロセス用に予約されています。
2 つのプロセス間のコンテキスト スイッチでは、仮想アドレス空間のユーザー モード部分のみが変更されます。
このような組織では、カーネルは常に現在のユーザー モード プロセスに完全にアクセスできます。これは、カーネルとユーザー モード プロセスの両方に対して、常に現在の仮想アドレス空間が 1 つしかないためです。2 つではなく、1 つです。 . したがって、カーネルは、ユーザー モード ページ用に別の追加のマッピングを実際に持つ必要はありません。しかし、それは主なポイントではありません。
重要な点は、カーネルがすべてのページに対して何らかの統計を保持し、必要に応じてディスクに保存して別の場所で再利用できることです。CPU は、ページが最初に読み取られたとき、またはページに書き込まれたとき、および最初に書き込まれたときpage table entry (PTE)
として、各ページにマークを付けます。accessed
dirty
カーネルは定期的に PTE をスキャンし、マーカーaccessed
とdirty
マーカーを読み取って統計を更新し、クリアaccessed
しますdirty
。これにより、後でそれらの変更を検出できます (もちろん、変更がある場合)。この統計に基づいて、めったに使用されない、または長期間使用されず、再利用できるページを特定します。
「スワッパー」が現在のプロセスのコンテキストで実行され、カーネルで実行されている場合、理論的には、カーネルからの十分な情報 (めったに使用されない、または長期間使用されていないページのリスト) を保存してマップ解除するdirty
か、単にマップ解除する場合ではなくdirty
)、関心のあるページへの十分なアクセス。
「スワッパー」自体がユーザーモードプロセスとして実行される場合、デフォルトでは別のプロセスのページにアクセスできず、マッピングを作成するか、カーネルに追加の作業を依頼する必要があるため、事態はさらに複雑になります。関心のあるプロセスのコンテキスト。
そのため、めったに使用されず、長く使用されていないページとそのアドレスの検索は、カーネルで行われます。accessed
CPU は、PTE をおよびとして自動的にマークすることで支援しますdirty
。dirty
ページを所有するプロセスのコンテキストではなくディスクに保存される場合は、ページへの追加のマッピングが必要になる場合があります。