您的位置:首页 > 其它

如何给内核模块传递参数

2011-07-18 15:57 295 查看
在编写内核模块的时候,经常需要在加载内核模块的时候传递一些参数,Linux内核提供了简单便捷的方法向内核模块传递参数。以2.6内核为例,内核模块设置参数需要用到module_param()宏,定义如下:

module_param(var_name, var_type, var_mode);

var_name:参数对应的变量名称;

var_type:参数变量类型;

var_mode:访问权限,与文件的访问权限定义方法相同;

还有一个宏MODULE_PARM_DESC()可以对指定的参数进行说明。

内核模块的参数使用不是很复杂,下面来个简单的例子说明一下:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/version.h>

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

执行结果可以看出来,向内核模块传递的参数可以正确的打印出来。
本文出自 “内核技术” 博客,请务必保留此出处http://freshpassport.blog.51cto.com/2359526/615725
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: