在编写内核模块的时候,经常需要在加载内核模块的时候传递一些参数,Linux内核提供了简单便捷的方法向内核模块传递参数。以2.6内核为例,内核模块设置参数需要用到module_param()宏,定义如下:
- module_param(var_name, var_type, var_mode);
var_name:参数对应的变量名称;
var_type:参数变量类型;
var_mode:访问权限,与文件的访问权限定义方法相同;
还有一个宏MODULE_PARM_DESC()可以对指定的参数进行说明。
内核模块的参数使用不是很复杂,下面来个简单的例子说明一下:
- #include
- #include
- #include
-
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("freshpassport@gmail.com");
-
- static int p_int;
- module_param(p_int, int, 0644);
- MODULE_PARM_DESC(p_int, "int param!\n");
-
- static char* p_pchar = "nothing parsed!";
- module_param(p_pchar, charp, 0644);
- MODULE_PARM_DESC(p_pchar, "char* param!\n");
-
- static int param_init(void)
- {
- printk(KERN_INFO "p_int = %d\n", p_int);
- printk(KERN_INFO "p_pchar = %s\n", p_pchar);
- return 0;
- }
-
- static void param_exit(void)
- {
- return;
- }
-
- module_init(param_init);
- module_exit(param_exit);
1~3行:老三样,内核模块的头文件;
8~10行:定义了一个名为p_int的int类型的变量,设置为内核模块参数并且进行了参数说明;
12~14行:同样的方法定义了p_pchar类型的一个参数,可以从命令行接收一个字符串;
16~21行:模块初始化函数,其中打印出了传入的内核模块参数。
这个程序中,内核模块参数p_pchar设置了默认值,防止没有传入参数的时候答应不正确。
下面是使用modinfo命令查看内核模块的信息:
- root@iscsia:/media/sf_bbu_source/kmodule_test# modinfo ./module_param_test.ko
- filename: ./module_param_test.ko
- author: freshpassport@gmail.com
- license: GPL
- srcversion: AFC86EFD9F79A6C287089EB
- depends:
- vermagic: 2.6.38.2 SMP mod_unload modversions
- parm: p_int:int param!
- (int)
- parm: p_pchar:char* param!
- (charp)
从modinfo给出的信息可以看到内核模块的参数类型和描述。下面是执行结果:
- root@iscsia:/media/sf_bbu_source/kmodule_test# insmod ./module_param_test.ko p_pchar="hello" p_int=123
- root@iscsia:/media/sf_bbu_source/kmodule_test# rmmod module_param_test
- root@iscsia:/media/sf_bbu_source/kmodule_test# dmesg | tail -n 2
- [ 6133.511086] p_int = 123
- [ 6133.511092] p_pchar = hello
执行结果可以看出来,向内核模块传递的参数可以正确的打印出来。
阅读(4946) | 评论(0) | 转发(0) |