Linuxカーネルモジュールの欠点?

Linuxカーネルモジュールの欠点?

Linuxカーネルモジュールの使用の欠点を理解しようとしています。私はこれを使用すると、基本システムを再コンパイルして再起動することなく、実行中のシステムに動的にコードを挿入できるという利点を理解します。これらのパフォーマンスを考慮すると、ほとんどのカーネルコードがデフォルトのカーネルの一部ではなくカーネルモジュールに存在する必要があると思いました。しかし実際にはそうではないようです。多くのコアサブシステム(メモリ管理など)はまだカーネルに含まれています。基本カーネル。

私が考えることができる理由の1つは、カーネルモジュールが起動プロセスの非常に遅くロードされるため、コア機能がデフォルトのカーネルに入る必要があることです。私が読んだもう一つの理由は、断片化に関するものでした。

カーネルモジュールがメモリの断片化を引き起こす理由はよくわかりません。誰かが説明できますか?カーネルモジュールを使用すると、他の欠点がありますか?

ベストアンサー1

はい、基本コンポーネント(mmなど)がロード可能なモジュールになることができない理由は、これらのコンポーネントが必須であるためです。カーネルがないと、カーネルは機能しません。

ロード可能モジュールに対するメモリ断片化の影響が重要であると主張する参照は見つかりませんが、この部分LLKM How-To Guideが面白いかもしれません。

私はこの問題が実際にメモリ断片化の問題の大部分だと思います。これは、通常、カーネルmmサブシステムによって管理される物理メモリの断片化と、非常に大きなアプリケーションで発生する可能性がある仮想アドレス空間の断片化という2つのレベルで発生します。私の考えでは主に設計とコンパイル方法の結果です。

実際のメモリの断片化に関しては、ページサイズ(4KB)よりも細かい単位ではこれが可能ではないと思います。したがって、実際には1024ページで100%断片化されている1MBの仮想連続空間を読む場合おそらく1,000件の追加の軽微な手術が必要です。方法ガイドのこの部分では、次の内容を読みました。

デフォルトのカーネルには、貴重な連続ドメインに再利用可能な大規模メモリ(kmallocプール)が含まれています。一部のバージョンのLinuxでは、モジュールローダーは最初にこのプールから連続メモリーを解放してLKMをロードしようとし、空き容量が不足している場合にのみvmallocスペースに移動します。 Andi Kleenは、2002年10月にLinux 2.5でこれを行うコードを提出しました。彼はその差が数パーセントの範囲にあると主張した。

ここで、vmallocスペース(ユーザースペースアプリケーションが存在する場所)はページに簡単に分割できます。これが現代のオペレーティングシステムの現実です(すべて仮想アドレス指定によってメモリを管理します)。仮想アドレッシングは、ユーザースペースで「数パーセントポイント」のパフォーマンスが低下する可能性がありますが、仮想アドレッシングに関する限り、これを介して推論することができます。必要で避けられないユーザー領域では、完全に理論的な内容にのみ関連しています。

プロセスの仮想アドレス空間(その後の物理メモリではなく)の断片化は、断片化をより複雑にする可能性がありますが、これはカーネルモジュールには適用されません(最後の段落では明らかに適用されます)。

私の意見が欲しいなら、考慮する価値はありません。高度にモジュール化されたカーネルを使用しても、最も一般的に使用されるコンポーネント(ファイルシステム、ネットワークなど)は非常に早くロードされ、ロードされた状態を維持する傾向があるため、物理メモリの連続領域にあります。それは価値があることです。 (これがしないでください)。無意味なモジュールのロードとアンロード)。

おすすめ記事