在编写内核模块的时候,经常需要在加载内核模块的时候传递一些参数,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("freshpassport@gmail.com");  
  7.  
  8. static int p_int;  
  9. module_param(p_int, int, 0644);  
  10. MODULE_PARM_DESC(p_int, "int param!\n");  
  11.  
  12. static char* p_pchar = "nothing parsed!";  
  13. module_param(p_pchar, charp, 0644);  
  14. MODULE_PARM_DESC(p_pchar, "char* param!\n");  
  15.  
  16. static int param_init(void)  
  17. {  
  18.     printk(KERN_INFO "p_int = %d\n", p_int);  
  19.     printk(KERN_INFO "p_pchar = %s\n", 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:         freshpassport@gmail.com  
  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 

执行结果可以看出来,向内核模块传递的参数可以正确的打印出来。