CH04-Linuxのカーネルモジュールのプログラム構造た.md

CH04:Linuxカーネルモジュール

Linuxカーネルモジュールは、次のコンポーネントで構成されています。

  • ロード機能モジュール:カーネルモジュールのinsmodのコマンドをロードし、ロード機能モジュールがカーネルによって実行され、自動的に関連するモジュールの初期設定を完了します。
  • モジュールのアンインストール機能:rmmodはコマンドモジュールをアンロードする場合、モジュールは自動的にカーネルによって実行される機能をアンインストールされますが、モジュールは逆の機能をローディングして完成されます。
  • モジュールのライセンス声明:許可ライセンス(LICENSE)カーネルモジュールを記述した文で,,あなたがライセンスを宣言しない場合は、モジュールがロードされ、カーネルはの(カーネルが汚染された)汚染された警告が表示されます。
  • モジュールパラメータ:パラメータは、モジュールがそれ自身の内部モジュールのグローバル変数に対応する値に渡すことができるロードされたときにモジュールです。
  • モジュールエクスポートシンボル:カーネルモジュールエクスポートされたシンボル(シンボル、関数または変数に対応)は、誘導された場合、他のモジュールは、このモジュールの変数または関数を使用することができます。
  • モジュールの作者やその他の情報の声明

モジュールのロード機能

一般に、__initIDアサーション、コードの形で典型的な負荷の関数は次のように

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);

おすすめ

転載: www.cnblogs.com/think123/p/11163220.html