2

したがって、カーネル モジュール コードは、公開されている限り、静的にコンパイルされたカーネル コード内のあらゆるものを使用できると考えています。しかし、静的にコンパイルされたカーネル コードがモジュール コードでグローバル変数を使用したい場合、それは可能でしょうか?

たとえば、1 つのカーネル モジュール コード (ロード可能なカーネル モジュールが何であれ) に "int a " というグローバル変数があります。静的にコンパイルされたカーネル コード (たとえば、/linux/sched/fair.c) で、その変数にアクセスしたいと考えています。

モジュールは最後に (静的にコンパイルされたカーネル コードがコンパイルされた後) コンパイルされ、最初はロードされないため、これによりコンパイル エラーが発生します。

この変数を静的にコンパイルされたヘッダー ファイルで最初に宣言するとどうなりますか? ただし、モジュールがロードされる前は、その変数は無意味です。

ありがとう、

4

2 に答える 2

1

カーネルとモジュールは、find_symbol (kernel/module.c で定義) を使用して、静的にコンパイルされているかどうかに関係なく、カーネルまたは読み込まれたモジュール内の他のシンボルのアドレスを検出できると思います。

于 2012-09-19T20:26:52.873 に答える
1

正確に必要なものに応じて、さまざまなソリューションが可能になる可能性があります。少なくとも静的にリンクされたコードを制御し、必要に応じて変更できると想定しています。

方法 1

静的にリンクされたコードが関数 (のようなものset_my_good_var_ptr()) をエクスポートできる場合、動的にロードされたモジュールはその関数を呼び出して、必要な変数のアドレスを前者に渡すことができます。

または、おそらく、静的にリンクされたコードは、動的にロードされたモジュールが get/set コールバックを提供するために使用できるインターフェイスを提供して、変数にアクセスできるようにすることができます。

これらすべてがプロジェクトに適していない場合 (たとえば、動的にロードされたモジュールのコードを変更できない場合)、次の方法が役立つかもしれませんが、私はそれを良い習慣とは呼びません。

方法 2

ロードする変数を提供するカーネル モジュールを監視します (たとえば、 register_module_notifier()関数を参照)。

モジュールがロードされた後、初期化関数が呼び出される前に、通知関数が呼び出されることに注意してください。

通知関数が呼び出されると、kallsyms_lookup_name()またはkallsyms_on_each_symbol()を使用して、必要な変数のアドレスを取得できます。

これには、カーネル構成で設定する必要がCONFIG_KALLSYMSあります。CONFIG_KALLSYMS_ALLこれらのオプションの 1 つまたは両方が設定されていない場合でも実行可能ですが、やや困難です (たとえば、モジュールのバイナリ ファイルでシンボルを見つけ、シンボルが属する ELF セクションのアドレスとそのオフセットを取得し、すべてを渡します)。これをあなたのコードなどに)

変数のアドレスを見つけた後、静的にリンクされたコードは、変数が実際にいつ使用できるか (変数が初期化されたときなど) を何らかの方法で決定する必要があります。それを行う方法は、関連するモジュールが実際に何をするかによって異なります。私はそれについてアドバイスすることはできません.

于 2012-09-20T07:41:44.177 に答える