web-dev-qa-db-ja.com

ロード可能なカーネルモジュールをツリー内としてマークする

この質問はLinuxカーネル4.10に関するものです。

ツリー外のLKMをロードすると、カーネルは警告を出力します。

_module: loading out-of-tree module taints kernel._

これは、このチェックインから発生します module.cif (!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など)を追加することによって、または特定の方法などでモジュールを構築することによって行われますか?

7
Mr M.

つまり、ビルドシステムは、モジュールがツリー内でビルドされている場合にのみ、行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」ファイルを形成します。

8
Ian Abbott