要するに :あなたはほとんど 比較的幅広いバージョンのカーネルにロードできる便利なカーネル モジュールを作成できます。
CONFIG_MODVERSIONS
でコンパイルされたカーネルに対してモジュールをビルドする場合 (あなたの場合のように)カーネルからエクスポートされたすべてのシンボルについて、このシンボルのCRCはモジュールのファイルに保存されます。 CRC はある種の コントロール サム 、特に、関数のパラメーターに使用される型のレイアウトを考慮します。たとえば、架空の struct A
のレイアウトの場合 2 つのカーネルで異なり、関数 f(struct A *a)
の CRC これらのカーネルでも異なります。
モジュールが実行中のカーネルにロードされると、モジュール内のすべての関数の CRC がカーネルの CRC と比較されます。それらが異なる場合、カーネルはモジュールのロードを拒否します。このメカニズムの詳細については、カーネルのドキュメント (Documentation/kbuild/modules.txt) を参照してください。
したがって、モジュールを 2 つの異なるカーネルにロード可能にするには、両方のカーネルでパラメーターが同じレイアウトを持つ関数のみに制限されます。特に struct module
型のレイアウトの場合 両方のカーネルに対して単一のモジュールをロードすることはできません。
複数のカーネルに適したドライバーを提供するには、いくつかの方法があります。最も簡単な方法は、ドライバーの情報源を提供することです それらを dkms
に追加します .このように、実行中のカーネルにドライバーがビルドされていない場合、ドライバーは自動的にコンパイルされます