2013-03-21 107 views
13

ドライバを初期化するときにmodule_initsubsys_initcallの違いは何ですか?ドライバの初期化中にmodule_initとsubsys_initcallの違いは何ですか?

+0

マニュアルページを確認しましたか? – rekire

+1

マニュアルページのエントリがありません。 – kzs

+1

あなたは常にソースを使ってgrepすることができます。ちょうどソースを見ていくことで、多くのことを説明することができます。 –

答えて

17

この違いは、タイミング、より正確には実行の順序に関係します。つまり、subsys_initcallと宣言された手続きは、手続きがmodule_initと宣言される前に実行されることが保証されています。この順序付けは、デバイスドライバが前者の機能を利用しようとする前に、サブシステムドライバおよびプラットフォームドライバが初期化されることを保証する(例えば、デバイスドライバはサブシステムデバイスとして登録する)。

それぞれの実際のマクロ定義は、カーネルが(ロード可能な)モジュール用に構成されているかどうかによって異なります。これらのマクロ(および他の初期マクロ)の定義は、

にあります。subsys_initcall()は、組み込みの(静的にリンクされた)モジュールでのみ使用できます。
module_initは、組み込みモジュールまたはロード可能モジュールのどちらでも使用できます。

+0

非常にクリア..ありがとう.. – kzs

+2

ロード可能な '* .ko'モジュールの場合、' subsys_initcall() 'は' module_init() 'と同じ' 'device_initcall()' 'にマップされています。 ://lxr.free-electrons.com/source/include/linux/init.h#L298 – TheCodeArtist