カーネルは、スワップパーティションまたはスワップファイルのスワップメモリ​​ページをどのように処理しますか?

カーネルは、スワップパーティションまたはスワップファイルのスワップメモリ​​ページをどのように処理しますか?

スワップパーティションには構造化ファイルシステムは含まれていません。カーネルは、スワップ領域としてマークされたパーティションにメモリページを格納するため、必要ありません。スワップ領域に複数のメモリページがある可能性があるため、プロセスがそのページをメモリにロードするように要求すると、カーネルは各ページをどのように検索しますか?詳しく説明します。 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仮想メモリマネージャについて

おすすめ記事