カーネルモジュールにパラメータを渡す方法


カーネルモジュールを作成する際には、カーネルモジュールをロードするときにパラメータを渡す必要があります.Linuxカーネルは、カーネルモジュールにパラメータを渡す簡単な方法を提供します.2.6カーネルを例にとると、カーネルモジュール設定パラメータにはmodule_が必要です.param()マクロは、次のように定義されます.

  
  
  
  
  1. module_param(var_name, var_type, var_mode); 

var_name:パラメータに対応する変数名;
var_type:パラメータ変数タイプ;
var_mode:ファイルのアクセス権定義方法と同じアクセス権;
もう一つマクロMODULE_PARM_DESC()は、指定されたパラメータについて説明することができる.
カーネルモジュールのパラメータの使用は複雑ではありません.簡単な例を説明します.

  
  
  
  
  1. #include <linux/module.h>  
  2. #include <linux/init.h>  
  3. #include <linux/version.h>  
  4.  
  5. MODULE_LICENSE("GPL");  
  6. MODULE_AUTHOR("[email protected]");  
  7.  
  8. static int p_int;  
  9. module_param(p_int, int, 0644);  
  10. MODULE_PARM_DESC(p_int, "int param!
    "
    );  
  11.  
  12. static char* p_pchar = "nothing parsed!";  
  13. module_param(p_pchar, charp, 0644);  
  14. MODULE_PARM_DESC(p_pchar, "char* param!
    "
    );  
  15.  
  16. static int param_init(void)  
  17. {  
  18.     printk(KERN_INFO "p_int = %d
    "
    , p_int);  
  19.     printk(KERN_INFO "p_pchar = %s
    "
    , p_pchar);  
  20.     return 0;  
  21. }  
  22.  
  23. static void param_exit(void)  
  24. {  
  25.     return;  
  26. }  
  27.  
  28. module_init(param_init);  
  29. module_exit(param_exit); 

1~3行:旧三様、カーネルモジュールのヘッダファイル;
8~10行:p_という名前で定義されていますintのintタイプの変数は、カーネルモジュールパラメータに設定され、パラメータの説明が行われている.
12~14行:同様の方法でp_を定義したpcharタイプのパラメータで、コマンドラインから文字列を受信できます.
16~21行:入力されたカーネルモジュールパラメータが印刷されたモジュール初期化関数.
このプログラムでは、カーネルモジュールパラメータp_pcharはデフォルト値を設定し,パラメータが入力されていない場合の承諾が正しくないことを防止した.
次はmodinfoコマンドを使用してカーネルモジュールの情報を表示します.

  
  
  
  
  1. root@iscsia:/media/sf_bbu_source/kmodule_test# modinfo ./module_param_test.ko   
  2. filename:       ./module_param_test.ko  
  3. author:         [email protected]  
  4. license:        GPL  
  5. srcversion:     AFC86EFD9F79A6C287089EB  
  6. depends:          
  7. vermagic:       2.6.38.2 SMP mod_unload modversions   
  8. parm:           p_int:int param!  
  9.  (int)  
  10. parm:           p_pchar:char* param!  
  11.  (charp) 

modinfoから与えられた情報から、カーネルモジュールのパラメータタイプと説明が表示されます.次に、実行結果を示します.

  
  
  
  
  1. root@iscsia:/media/sf_bbu_source/kmodule_test# insmod ./module_param_test.ko  p_pchar="hello" p_int=123   
  2. root@iscsia:/media/sf_bbu_source/kmodule_test# rmmod module_param_test   
  3. root@iscsia:/media/sf_bbu_source/kmodule_test# dmesg | tail -n 2      
  4. [ 6133.511086] p_int = 123  
  5. [ 6133.511092] p_pchar = hello 

実行結果から,カーネルモジュールに渡されたパラメータが正しく印刷されることが分かる.