
私はいつもLinuxカーネルがページング可能ではないことを読んだ。
私の記憶が正しい場合、Windowsはシステム仮想メモリをページングプールと非ページングプールに分割します。
ページングされていない部分は物理メモリに直接マッピングされ、カーネルが完了する必要がある最も重要な作業を担当しますが、それほど重要ではない部分はそうでない可能性があるため、常にそこに残ります。代わりに、Linuxカーネルはロード可能なモジュールに分かれていますが、これらのモジュールがどのように実装されているかについての情報は収集していません。
一時的にディスクに転送できるようにページングされたかどうかはわかりません。私が主に読んでいるのは、メモリをアンロードすることでメモリを「解放」できることです。これが意味するのはまだ私にあいまいです。
この記事で「ページング済み」または「ページング可能」と書いたことは、ディスク上でこれらのページを交換できることを意味します。通常、Linuxカーネルはページングされていると見なされますが、交換できないため、この問題を解決しました。
答え1
Linuxカーネルのどの部分も呼び出すことはできず、モジュールの一部も呼び出すことはできません。
モジュールでサポートされている場合は、カーネルモジュールをロードおよびアンロードできます。これは、ユーザー空間プロセスがシステムコール(通常はロードユーティリティ、アンロードユーティリティを介して)を介して明示的な要求をするinit_module
ときに常に発生します。delete_module
insmod
modprobe
rmmod
モジュールがロードされると、カーネルの他の部分と同様にカーネルの一部になります。特に、特定のモジュールで使用されているメモリを切り離す方法はありません。カーネルは特定のモジュールのコードを含むメモリ部分を追跡しますが、モジュールがデータを保存できる場所は追跡しません。結局のところ、モジュールはすべてのカーネルデータ構造を変更できます。
モジュールは、すべてのカーネルサブシステムにいくつかのコードを追加できます。ほとんどのモジュールはハードウェアドライバですが、一部はそうではありません(セキュリティ機能、ファイルシステム、ネットワーク機能などを提供できます)。モジュールが使用するデータまたはコードを交換できる場合は、必要に応じて残りのカーネルがそれをロードする必要があるため、システム設計が複雑になります。さらに、カーネルは交換されたメモリ部分を再交換する必要がないことを確認する必要がありますが、これは困難です。スワップがネットワークファイルシステムのスワップファイルにあり、そのモジュールがファイルが保存されているサーバーとの通信に関連するファイアウォール機能を提供する場合はどうなりますか?
モジュールが何もする必要がないようにするコードを提供することはモジュールの作業であるため、モジュールを完全に削除することが可能です。カーネルはモジュールの終了関数を実行し、その関数がモジュールをアンロードしても安全であると報告する場合にのみモジュールをアンロードします。シャットダウン関数は、モジュールが「所有している」残りのデータメモリ(つまり、モジュールには必要ですがカーネルの他の部分には不要なデータ)を解放し、場合によっては呼び出すコードがモジュールに登録されていないことを確認する必要があります。発生します。交換のためにモジュールのデータを保存する方法はありません。モジュールは、残っているデータがない場合にのみRAMから削除できます。
答え2
メモリページスワッピング(「ページング」と呼ばれる)とLinuxカーネルモジュールのロード/アンロードは、まったく異なる2つの機能です。
Linuxカーネルモジュールはカーネルにロードでき、その後カーネルの一部になります。ここでの目標は、カーネルを特定のハードウェアに合わせて調整することです。たとえば、数百種類のネットワークカードがあり、これらのカードをサポートする多くのカーネルモジュールがありますが、特定のシステムでは、特定の瞬間に1種類のネットワークカードしか使用できません。 Linuxはカードに適した正しいカーネルモジュールを選択してそれをロードし、他のすべてのモジュールは外部メモリに残ります。
カーネルモジュールの詳細については、次を参照してください。ここ。