Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1401688
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: LINUX

2012-05-13 15:23:55

在编写内核模块的时候,经常需要在加载内核模块的时候传递一些参数,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
  2. #include
  3. #include
  4. MODULE_LICENSE("GPL");
  5. MODULE_AUTHOR("freshpassport@gmail.com");
  6. static int p_int;
  7. module_param(p_int, int, 0644);
  8. MODULE_PARM_DESC(p_int, "int param!\n");
  9. static char* p_pchar = "nothing parsed!";
  10. module_param(p_pchar, charp, 0644);
  11. MODULE_PARM_DESC(p_pchar, "char* param!\n");
  12. static int param_init(void)
  13. {
  14. printk(KERN_INFO "p_int = %d\n", p_int);
  15. printk(KERN_INFO "p_pchar = %s\n", p_pchar);
  16. return 0;
  17. }
  18. static void param_exit(void)
  19. {
  20. return;
  21. }
  22. module_init(param_init);
  23. 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

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

阅读(4946) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~