前言
最近在看kernel源码的时候看到了下面这个宏定义
module_param_named(name, name, type, perm)
记得之前在买的书《奔跑吧 Linux内核——入门篇》中看过这方面的内容,现在就将它摘抄出来,以方便日后查看吧,权当一个学习笔记吧。
正文
内核模块作为一个可扩展的动态模块,为Linux内核提供了灵活性。但是有时候要根据不同的应用场景给内核模块传递不同的参数,所以Linux内核就提供了一个宏来实现模块的参数传递。
#define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
#define MODULE_PRAM_DESC(_parm, desc) \
__MODULE_INFO(parm, _parm, #_parm ":" desc)
module_param()宏由3个参数组成,name表示参数名,type表示参数类型,perm表示参数的读写等权限。MODULE_PARAM_DESC()宏为这个参数的简单说明,参数类型可以是byte、short、ushort、uint、long、ulong、char和bool等类型。perm指定在sysfs中相应文件的访问权限,如设置为0表示不会出现在sysfs文件系统中;设置为S_IRUGO(0444)可以被所有人读取,但是不能被修改;设置为S_IRUGO|S_IWUSR(0644),说明可以让root权限的用户修改这个参数。下面以一个代码示例来说明:
#include <linux/module.h>
#include <linux/init.h>
static int debug = 1;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "enable debugging information");
#define dprintk(args...) \
if (debug) { \
printk(KERN_DEBUG args); \
}
static int mytest = 100;
module_param(mytest, int, 0644);
MODULE_PARM_DESC(mytest, "test for module parameter");
static int __init my_test_init(void)
{
dprintk("my first kernel module init\n");
dprintk("module patameter = %d\n", mytest);
return 0;
}
static void __exit my_test_exit(void)
{
printk("goodbye\n");
}
module_init(my_test_init);
module_exit(my_test_exit);
MODULE_LICENSE("GPL");
我们可以看到模块定义了一个参数debug,初始值为1,表明打印是默认输出的;另外一个参数mytest,初始值为100。
当加载上面编译出来的模块后,我们可以看到内核打印为:
my first kernel module init
module patameter = 100
但是当通过下面的命令来加载模块时:
insmod mymodule.ko mytest=200
内核的打印输出就是
my first kernel module init
module patameter = 200
当然,我们可以也通过给debug参数赋值,关闭掉模块的日志输出。