
Bryant と O'Hallaron による Linux 系システムのページ テーブルの (やや抽象化された) モデルによれば、各ページ テーブル エントリ (PTE) には、次の 3 種類の値のいずれかを保持するアドレス フィールドがあります。(1) 仮想ページがマップされる物理アドレス (実際にはページ番号)、(2) 長期ストレージ デバイスの同等の位置識別子 (ページが見つかる場所)、(3) 0 (未割り当てページ)。ページが長期ストレージからメイン メモリにスワップインされたとします。このアカウントでは、カーネルは長期ストレージ アドレス (2) を物理アドレス (1) に置き換えます。次に、物理メモリ内の同じページを、他のページをスワップインするためのスペースを確保するために削除する必要があるとします。元の長期ストレージ アドレスが物理アドレスで上書きされた場合、PTE に元の長期ストレージ アドレスを復元するにはどうすればよいでしょうか。よろしくお願いします。
答え1
PTEはバーチャルページ。おっしゃるとおり、仮想ページがメイン メモリ内に存在する場合、PTE のアドレス フィールドには物理ページ フレーム番号 (PFN) が保持されます。
それぞれ物理的なページには対応する がありますstruct page
。これには次のものがあります:
以下
flags
は:struct address_space *mapping;
ページ キャッシュ (ほとんどのシステムでページの大部分を占める) にあるページの場合、
mapping
ページをバックアップするファイルにアクセスするために必要な情報を指します。ただし、ページが匿名ページ (スワップによってバックアップされるユーザー空間メモリ) の場合は、構造体mapping
を指しますanon_vma
[...]--構造体ページにさらに詰め込む、LWN.net
次に、このpage→index
フィールドは匿名ページの構造を格納するために使用されますswp_entry_t
(ページ キャッシュ内のページの場合、これはファイル オフセットを保持します)。
swp_entry_t
スワップ デバイスのインデックスと、そのスワップ デバイス内の場所を保持します。
2004年にこれがどのように機能したかの具体的な詳細は、Linux 仮想メモリ マネージャーの理解 - スワップ管理メル・ゴーマン著。
答え2
あなたの質問からは、ped ファイル、スワップ、またはページ キャッシュ内のパッシブにマップされたファイルのどれについて尋ねているのかが完全にはわかりませんのでmmap()
、すべてについてお答えします。
mmap 以外のケースでは、削除は削除です。ページがクリーンになると、簡単に削除できます。ファイルにバックアップされていないページがメイン メモリから削除された場合、通常、アドレスを復元する必要はありません。次回ファイルにアクセスしたときに、新しいキャッシュ エントリにページ フォールトが発生するだけだからです。スワップの場合も同様のことが起こります。スワップからページ フォールトが発生し、後で同じページを削除する必要がある場合、次回は新しいスワップ アドレスを指定してそれを PTE に設定するだけです (または、ページが存在しクリーンな場合はスワップ キャッシュを使用します)。*
mmap の場合、ライフサイクルはmmap()
システム コールによって制御されます。範囲は の仮想メモリの連続した部分に明示的にマップされmmap()
、このマッピングのメタデータ (参照カウントを持つバッキング FD、オフセット、サイズなど) は関連する仮想メモリ領域 (VMA) に格納されます。ページが削除された場合でも、VMA はマッピング情報を保持するため、カーネルは次にアクセスしたときにどこからフォールトするかを知ることができます。
* 実際には、スワッピングも一般的なページング アクティビティも通常はページ レベルでは発生せず、スワップ クラスターや先読みバッチなどのより低い粒度で発生することがよくあります。