内核模块参数示例

我们可以用
“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数,例如下列代码定义了一个整型参数和一个字符指针参数:

static char *book_name = "Linux Driver";
static int num = 4000;

module_param(num, int, S_IRUGO);

module_param(book_name, charp, S_IRUGO);

///S_IRUGO        任何用户(UGO)都可以读(R)


在装载内核模块时,用户可以向模块传递参数,形式为“insmode(或 modprobe) 模块名 参数名=参数值”,如果不传递,参数将使用模块内定义的默认值。

参数类型可以是 byte、short、ushort、int、uint、long、ulong、charp(字符指针)、bool 或 invbool(布尔的反),

在模块被编译时会将 module_param 中声明的类型与变量定义的类型进行比较,判断是否一致。


模块被加载后,在/sys/module/目录下将出现以此模块名命名的目录。当“参数读/写权限”为 0 时,表示此参数不存在 sysfs 文件系统下对应的文件节点,

如果此模块存在“参数读/写权限”不为 0 的命令行参数,在此模块的目录下还将出现 parameters目录,

包含一系列以参数名命名的文件节点,这些文件的权限值就是传入module_param()的“参数读/写权限”,而文件的内容为参数的值。

除此之外,模块也可以拥有参数数组,形式为“module_param_array(数组名,数组类型,数组长,参数读/写权限)”。

从 2.6.0~2.6.10 版本,需将 数组长变量名赋给“数组长”,从 2.6.10 版本开始,需将 数组长变量的指针赋给“数组长”,

当不需要保存实际输入的数组元素个数时,可以设置“数组长”为 NULL。

运行 insmod 或 modprobe 命令时,应使用逗号分隔输入的数组元素。

现在我们定义一个包含3个参数的模块 book.c (如下代码所示),并观察模块加载时被传递参数和不传递参数时的输出。

/*======================================================================

    A kernel module: book

    This example is to introduce module params         

    The initial developer of the original code is Baohua Song

    <author@linuxdriver.cn>. All Rights Reserved.

======================================================================*/

#include <linux/init.h>                                

#include <linux/module.h>                                


MODULE_LICENSE("Dual BSD/GPL");


static char *book_name = "dissecting Linux Device Driver";

static int num = 4000;

static int temp = 20;
                                

static int book_init(void)                                

{                                

	printk(KERN_INFO " book name:%s\n",book_name);                        

	printk(KERN_INFO " book num:%d\n",num);                               

	return 0;                                
}                                



static void book_exit(void)                                
{
    printk(KERN_INFO " Book module exit\n ");
}                                



module_init(book_init);                                
module_exit(book_exit);                                


module_param(num, int, S_IRUGO);                                
module_param(book_name, charp, S_IRUGO);
module_param(temp, int, 0); 
                                

MODULE_AUTHOR("Song Baohua, author@linuxdriver.cn");
MODULE_DESCRIPTION("A simple Module for testing module params");
MODULE_VERSION("V1.0");

Makefile:

obj-m += book.o
KDIR=/home/gudujian/work/linux-2.6.35.9
EXTRA_CFLAGS=-g -O0

build:kernel_modules

kernel_modules:
	make -C $(KDIR) M=$(CURDIR) modules

clean:
	make -C $(KDIR) M=$(CURDIR) clean

编译得到上述的模块:book.ko,加载 可以看到内核的输出:

查看内核参数:


可见  读/写权限为 0 的参数  temp没有出现在parameters目录下。


当执行 insmod book.ko book_name="Driver" num=2000时,输出的是用户传递的参数:









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值