この質問はLinuxカーネル4.10に関するものです。
ツリー外のLKMをロードすると、カーネルは警告を出力します。
_module: loading out-of-tree module taints kernel.
_
これは、このチェックインから発生します module.c :if (!get_modinfo(info, "intree")) {
_get_modinfo
_を読み取ると、「intree」は_.ko
_ファイル内の単なるマジックストリングlivnigであることがわかります。
システムで見つけたランダムなLKMでreadelf
を実行すると、次のようになります。
_readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1
_
単純なカスタムhello_worldLKMでintree
を検索している間、結果は返されません。
これは実際に当てはまりますか?
一部のモジュールはどのようにツリー内としてマークされますか?モジュールにマクロ(MODULE_LICENCEなど)を追加することによって、または特定の方法などでモジュールを構築することによって行われますか?
つまり、ビルドシステムは、モジュールがツリー内でビルドされている場合にのみ、行MODULE_INFO(intree, "Y");
を "modulename。mod.c"ファイルに追加するように工夫しています。
モジュールの通常の「.c」ファイルの1つにその行を追加することでシステムをだます方法は明らかですが、なぜそうしたいかはわかりません。
長いバージョン...
外部モジュールは通常、次のようなコマンドで作成されます。
_$ make M=`pwd` modules
_
または古い構文:
_$ make SUBDIRS=`pwd` modules
_
空でないM
またはSUBDIRS
が存在すると、カーネルの最上位の「Makefile」が_KBUILD_EXTMOD
_変数を設定します。通常のカーネルビルドには設定されません。
モジュール構築のステージ2(「モジュールの構築、ステージ2」というメッセージが出力された場合)の場合、makeは「scripts/Makefile.modpost」makefileを実行します。 _scripts/mod/modpost
_が設定されている場合、さまざまなオプションを使用して_KBUILD_EXTMOD
_を実行します。特に、_-I
_オプションは、_KBUILD_EXTMOD
_が設定されている場合に使用されます。
「scripts/mod /modpost.c」のmodpost
のソースを見ると、_external_module
_変数の初期値は0ですが、_-I
_オプションはそれを1に設定します。 function add_intree_flag()
は、2番目のパラメーター_is_intree
_を_!external_module
_に設定して呼び出されます。 add_intree_flag()
関数は、_is_intree
_パラメーターがtrueの場合にのみ、MODULE_INFO(intree, "Y");
を "modulename。mod.c"ファイルに書き込みます。
したがって、内部モジュールと外部モジュールの違いは、「modulename。mod.c」ファイルにMODULE_INFO(intree, "Y");
マクロ呼び出しが存在することです。これは「modulename。mod.o」にコンパイルされ、モジュールの他のオブジェクトファイルとリンクされて「modulename。ko」ファイルを形成します。