スワップパーティションには構造化ファイルシステムは含まれていません。カーネルは、スワップ領域としてマークされたパーティションにメモリページを格納するため、必要ありません。スワップ領域に複数のメモリページがある可能性があるため、プロセスがそのページをメモリにロードするように要求すると、カーネルは各ページをどのように検索しますか?詳しく説明します。 Devuan OSでスワップパーティションのヘッダーを確認してください。
#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
struct swap_header_v1_2 {
char bootbits[1024]; /* Space for disklabel etc. */
unsigned int version;
unsigned int last_page;
unsigned int nr_badpages;
unsigned char uuid[SWAP_UUID_LENGTH];
char volume_name[SWAP_LABEL_LENGTH];
unsigned int padding[117];
unsigned int badpages[1];
};
したがって、mkswap
パーティションでコマンドが実行されると、そのパーティションにスワップヘッダが配置されます。
ここで、「プロセスA」のメモリページがスワップされ、スワップ領域にメモリページがあるシナリオを想定します。もちろん、スワップ領域には多くのメモリページがあります。 「プロセスA」はスワップされたメモリページにアクセスする必要があります。 「プロセスA」は、カーネルにスワップされたメモリページを取得できるかどうかを示します。カーネルはこう言いました:もちろん、親愛なる友人よ。カーネルは、スワップパーティション内の「プロセスA」のメモリページを探します。スワップパーティションは複雑な構造(ファイルシステムではない)ではないので、カーネルはスワップパーティションで「プロセスA」の特定のメモリページを見つける方法をどのように知っていますか?
カーネルはこれらのスワップページのセクタアドレスをどこかに保存するので、プロセスがメモリページを要求すると、カーネルはスワップパーティションから場所を見つけ、パーティションからメモリページを読み取ってメモリにロードする方法を知っています。
ベストアンサー1
スワッピングは特定の起動時にのみ有効であるため、すべてのトレース情報はメモリに保存されます。ページ内部と外部の置換は完全にカーネルによって処理され、プロセスに透過的です。デフォルトでは、メモリはページに分割され、ページテーブルで追跡されます。これは各CPUアーキテクチャによって定義された構造です。ページが置き換えられると、カーネルはこれを無効とマークします。したがって、次回ページにアクセスしようとすると、CPUにエラーが発生し、カーネルのハンドラが呼び出されます。ページ。
Linuxではswap_info
構造各スイッチングデバイスまたはファイルについて説明します。この構造内ではswap_map
メモリページをスワップデバイスまたはファイルのブロックにマップします。ページが置き換えられると、カーネルはそのページテーブルエントリにswap_info
インデックスとswap_map
オフセットを格納し、必要に応じてディスク上のページを見つけることができます。 (サポートされているすべてのアーキテクチャはページテーブルにこれに十分なスペースを提供しますが、制限があります。例えば空き容量は、Linuxがx86で最大64GiBのスワップスペースを管理できることを意味します。 )
詳細な説明は以下で確認できます。「交換管理」の章メルゴーマンLinux仮想メモリマネージャについて。