9

2 つの Linux カーネル モジュールがあり、そのうちの 1 つは別の機能を提供する可能性があります。ただし、その機能の使用は必須ではありません。最初のモジュールが存在しなくても、2 番目のモジュールは動作する可能性があります (そして動作するはずです)。

最初のモジュールから関数をエクスポートして2番目のモジュールで使用すると、2番目のモジュールはそのシンボルに依存し、最初のモジュールなしではロードできません。

解決策の 1 つは、最初のモジュールの関数について /proc/kallsym を調べるユーザー スクリプトを用意することです。そこに存在する場合、スクリプトはそのアドレスをパラメーターとして 2 番目のモジュールに渡し、それからポインターを作成します。 . しかし、明らかな理由から、私はその解決策が好きではありません。

2番目のモジュールが最初のモジュールのシンボルのアドレスを取得できるようにするより正確でエレガントなソリューションがある場合、ハード依存を回避しますか?

4

3 に答える 3

7

最後に解決策を見つけました: カーネルには symbol_get() と symbol_put() があり、別のモジュールで任意のシンボルを検索する機会が与えられ (もちろん、エクスポートする必要があります)、使用中にモジュールがアンロードされるのを防ぎます。シンボル。

于 2013-05-15T15:28:04.750 に答える
1

モジュール B がモジュール A に依存している場合、モジュール A が最初に読み込まれなければ、モジュール B は正常に読み込まれないと思います。

実際、モジュール A が最初に挿入された後でのみ、モジュール A からエクスポートされたモジュール B が必要とするシンボルが /proc/kallsym ファイルに表示されます。

あなたの状況の解決策: モジュール B では、 module_init() 関数には、モジュール A が既に存在するかどうかを確認するコードが必要です。存在しない場合は、最初に A をロードします。つまり、request_module() を使用して A をロードするか、try_then_request_module() を使用するより凝った方法を作成します。

于 2013-03-29T08:22:19.680 に答える