内核中的模块参数

前言

最近在看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参数赋值,关闭掉模块的日志输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值