私は単純なcharデバイスドライバーを書いています。module_init() に渡す関数は、モジュールのインストール時に呼び出されます。
insmod コマンドを使用してモジュールを挿入すると、 module_init() に渡される関数が呼び出されます。
この module_init() 関数を呼び出す他の方法はありますか。
私は単純なcharデバイスドライバーを書いています。module_init() に渡す関数は、モジュールのインストール時に呼び出されます。
insmod コマンドを使用してモジュールを挿入すると、 module_init() に渡される関数が呼び出されます。
この module_init() 関数を呼び出す他の方法はありますか。
以外のものを使用することについて話している場合はinsmod
、no:insmod
がモジュールを初期化する唯一の方法です。
それ以外の場合、これmodule_init
はマクロであり、実際には関数呼び出しではありません (C ではグローバル スコープから関数を呼び出すことはできません)。動的モジュールとしてコンパイルするか、カーネルに組み込まれたオブジェクトとしてコンパイルするかに応じて、初期化関数を呼び出す定義済みの「モジュールコンストラクター」に展開されます。その役割は、モジュールを開発するときに多くのことをしなくて済むように#ifdef
し、開発プロセスを容易にすることです (これを参照してください)。
したがって、何らかの理由で (ただし、これを行うことはお勧めしません)、モジュール コードから初期化関数を呼び出したい場合は、それを直接呼び出してください。例えば:
static void some_other_function(void) {
// ...
initialize();
// ...
}
static int initialize(void) {
// your initialization code
}
module_init(initialize);
編集__init
:ユージーンのコメントに続いて削除されました。
ただし、module_init
展開のみが初期化関数を呼び出し、他の一般的なコードは別の関数にすることをお勧めします。
static void some_other_function(void) {
// ...
something_that_might_get_called_afterwards_also();
// ...
}
static int __init initialize(void) {
// your initialization code (done only once)
something_that_might_get_called_afterwards_also();
// some other one-time code
}
module_init(initialize);