web-dev-qa-db-ja.com

Linuxカーネルモジュールは一種のLinuxシステムページプールですか?

Linuxカーネルはページング可能ではないことをいつも読んでいます。
Windowsを誤っていない場合は、代わりに、システム仮想メモリをページパーツ(ページプール)と非ページパーツ(非ページプール)に分割します。
非ページパーツは物理メモリに直接マップされ、カーネルが実行する必要のある最も重要なタスクを処理し、重要度の低い部分は処理しないため、常にそこにとどまります。代わりに、Linuxカーネルはロード可能なモジュールに分割されていますが、これらのモジュールの実装方法について収集した情報はありません。
ページングされているかどうかわからないため、一時的にディスクに転送できます。私が普段読んでいるのは、メモリをアンロードすることでメモリを「解放」できるということです。これが何を意味するのかはまだわかりません。
この投稿に沿って「ページング」または「ページング可能」と書いたとき、これらのページをディスク上でスワップアウトできることを暗黙に示しました。通常、Linuxカーネルはページングされていると見なされますが、スワップアウトできないため、これに対処しました

5

Linuxカーネルのどの部分もページアウトできません。モジュールに由来する部分もページアウトできます。

カーネルモジュールをロードして、(モジュールがサポートしている場合は)アンロードできます。これは常に、init_moduleおよびdelete_moduleシステムコール(通常、ロード用のinsmodまたはmodprobeユーティリティ、およびrmmod(アンロードの場合)。

ロードされたモジュールは、カーネルの他の部分と同様に、カーネルの一部になります。特に、特定のモジュールで使用されているメモリを分離する方法はありません。カーネルは、メモリのどの部分に特定のモジュールのコードが含まれているかを追跡しますが、モジュールがデータを格納した場所は追跡しません。結局のところ、モジュールはカーネルのデータ構造を変更できます。

モジュールは、カーネルサブシステムにコードを追加する可能性があります。ほとんどのモジュールはハードウェアドライバですが、そうでないものもあります(たとえば、セキュリティ機能、ファイルシステム、ネットワーク機能などを提供できます)。モジュールが使用するデータまたはコードをスワップアウトできる場合、カーネルの残りの部分は必要に応じてそれをロードする必要があり、システムの設計が非常に複雑になります。カーネルはまた、スワップアウトされたメモリのどの部分も、それをスワップインして戻すために必要となることがないようにする必要があります。これは困難です。スワップがネットワークファイルシステムのスワップファイルにあり、モジュールがファイルを格納するサーバーとの通信に関与するファイアウォール機能を提供する場合はどうなりますか?

モジュールが何にも必要ないことを保証するコードを提供するのはモジュールの仕事なので、モジュールを完全にアンロードすることは可能です。カーネルはモジュールのexit関数を実行し、その関数がモジュールを安全にアンロードできると報告した場合にのみ、モジュールをアンロードします。出口関数は、モジュールが「所有」している残りのデータメモリ(つまり、モジュールが必要とするが、カーネルの他の部分は必要としないデータ)を解放する必要があり、モジュールのコードが登録されていないときに呼び出されることを確認する必要があります。何かが起こります。モジュールのデータを保存してスワップする方法はありません。モジュールは、RAMから削除できます。データが残っていない場合のみです。

メモリページのスワップ( "ページング"と呼びます)とLinuxカーネルモジュールのロード/アンロードは、2つのまったく異なる機能です。

Linuxカーネルモジュールは、カーネルにロードできます。その後、カーネルの一部になります。ここでの目標は、カーネルを特定のハードウェアに調整することです。たとえば、数百種類のネットワークカードがあり、これらのカードをサポートする多くのカーネルモジュールがありますが、特定のマシンでは常に1種類のネットワークカードしかありません。 Linuxはこのカードに適切なカーネルモジュールを選択してロードし、他のすべてのモジュールを外部メモリに残します。

カーネルモジュールの詳細については、 ここ を参照してください。

5
HEKTO