CH04:Linuxカーネルモジュール
Linuxカーネルモジュールは、次のコンポーネントで構成されています。
- ロード機能モジュール:カーネルモジュールのinsmodのコマンドをロードし、ロード機能モジュールがカーネルによって実行され、自動的に関連するモジュールの初期設定を完了します。
- モジュールのアンインストール機能:rmmodはコマンドモジュールをアンロードする場合、モジュールは自動的にカーネルによって実行される機能をアンインストールされますが、モジュールは逆の機能をローディングして完成されます。
- モジュールのライセンス声明:許可ライセンス(LICENSE)カーネルモジュールを記述した文で,,あなたがライセンスを宣言しない場合は、モジュールがロードされ、カーネルはの(カーネルが汚染された)汚染された警告が表示されます。
- モジュールパラメータ:パラメータは、モジュールがそれ自身の内部モジュールのグローバル変数に対応する値に渡すことができるロードされたときにモジュールです。
- モジュールエクスポートシンボル:カーネルモジュールエクスポートされたシンボル(シンボル、関数または変数に対応)は、誘導された場合、他のモジュールは、このモジュールの変数または関数を使用することができます。
- モジュールの作者やその他の情報の声明
モジュールのロード機能
一般に、__init
IDアサーション、コードの形で典型的な負荷の関数は次のように
static int __init initialization_func(void)
{
/*初始化代码*/
}
module_init(initialization_func);
ローディング関数モジュールmodule_init(函数名)
形式が指定され、整数値を返し、初期化が成功した場合、0を返す必要があり、初期化失敗エラーコードがLinuxカーネルに(戻され、エラーコードが0に近い負の値<linux/errno.h>
を含む、定義-ENODEV、-ENOMEM
シンボル値など)。
Linuxでは、次のように識別される__init
機能を直接カーネルにコンパイルされ、リンクが配置される場合、それは、カーネルイメージの一部になり.init.text
、このセクタ内。
#define __init __attribute__ ((__section__(".init.text")))
すべての__init
セクションの機能は.initcall.init
、これらにより関数ポインタを呼び出す初期化カーネルで、関数ポインタを保持する__init
の放出、機能、および初期化が完了したinit
メモリセグメント。
機能に加えて、データを定義することもでき__initdata
ますが、初期化フェーズに必要なデータは、初期化後のカーネルが完了すると、彼らはまた、占有メモリを解放することができます。例えば、以下のコードはhello_data
のように定義されます__initdata
。
static int hello_data __initdata = 1;
static int __init hello_init(void)
{
printk(KERN_INFO "hello,world %d\n,hello_data");
return 0;
}
module_init(hello_init);
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye,world\n");
}
module_exit(hello_exit);
- この記事は、から抜粋されたLinuxのデバイスドライバの開発を説明-最新のLinux 4.0カーネルに基づいて、nVIDIAのAGX-ザビエルプラットフォーム上で実行されています。
- この記事のコード