2

私はカーネルとドライバーのプログラミングに慣れていないので、質問が単純すぎないことを願っています。

独自の機能を追加するために、madwifi ドライバーを使用しています。私のコードでは、実際のコードを開始する前に初期化する必要があるいくつかの変数と構造を追加しました。
作業中に次の質問に遭遇しました: この変数/構造の初期化を担当する関数を配置するのに最適な場所はどこですか? 私が知る限り、モジュールをカーネルにロードする際に実行される特別なマクロ *module_init* がありますが、madwifi ドライバー コードでそれを見つけることができませんでした。私が代わりに見つけたのは、*exit_module* という別の有名なマクロです。私の質問は次のとおりです。

  1. init_module を追加して、そこですべての初期化を行うことをお勧めしますか?
  2. exit_module を使用して割り当てられたメモリを解放することをお勧めしますか?

助けてくれてありがとう!

オマー

4

2 に答える 2

5

すべてのモジュール (ドライバー) は 2 つの関数を定義します。1 つはモジュールがカーネルにロードされたときに呼び出され、もう 1 つはモジュールが削除されたときに呼び出されます。 module_init()とは、これらの役割に対して 2 つの関数を宣言するためmodule_exit()の 2 つの特別なカーネルマクロです。

あなたのドライバーには初期化機能があると思います。init()関数は通常、ドライバーの初期化または登録に使用されます。

機能もチェックprobe()。ドライバーが複数のデバイスをサポートできる場合、ドライバーが登録されると、カーネルはprobe()デバイスごとに 1 回呼び出します。このプローブ関数は、デバイスごとの初期化を開始します。つまり、ハードウェアを初期化し、リソースを割り当て、デバイスをブロックまたはネットワーク デバイスなどとしてカーネルに登録します。

于 2013-03-19T11:56:21.253 に答える
2

コメントで述べたように、初期化コードはinit_module関数内に含めることができます。

あなたの質問について:

  1. モジュール初期化関数(init_module)は、ドライバーレベルの初期化に適した場所です。C静的変数の初期化に十分な些細なニーズがない限り、これを使用することをお勧めします。
  2. クリーンアップ関数(cleanup_module)は、ドライバーが割り当てたリソースをすべて解放したことを確認する必要があります。初期化中に割り当てられたものをすべて解放するのに適した場所です。
于 2013-03-19T12:11:17.137 に答える