/*Linux驱动源码hellop.c*/
#include<linux/init.h>
#include<linux/module.h>
#include<linux/moduleparam.h>
static char *whom="bufan";
static int howmany=1;
static int paramA[] = {1,2,3,4,5,6,7,8};
static int paramA_no = 1;
module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);
module_param_array(paramA, int , ¶mA_no , S_IRUGO);
static int __init hellop_init(void)
{ /*模块初始化函数*/
int i;
for (i = 0; i < howmany; i++)
printk(KERN_ALERT "(%d) Hello, %s !\n", i, whom);
for (i = 0; i < paramA_no; i++)
printk(KERN_ALERT "paramA[%d] : %d\n", i, paramA[i]);
return 0;
}
static void __exit hellop_exit(void)
{ /*模块卸载函数*/
printk(KERN_ALERT "Goodbye,cruelworld\n");
}
module_init(hellop_init);
module_exit(hellop_exit);
MODULE_LICENSE("DualBSD/GPL");
要使用模块参数,需要包含头文件linux/moduleparam.h,该文件中有对
module_param宏的声明。
module_param()宏来声明模块参数,module_param()宏有三个参数,变量名,类型,以及用于sysfs入口项的许可掩码
模块参数类型有:
布尔值:bool,invbool
字符串:charp
不同长度整形值:int,long,short,uint,ulong,ushort
访问许可掩码
任何人可读取该参数,但不能修改:S_IRUGO
允许root用户可以修改:S_IRUGO|S_IWUSR
1.单一的模块参数
在驱动中就可以使用howmany,whom这两个变量了,这两个变量定义了初值,如果insmod时没有指定参数时,程序采用的是初值。
insmod hellop.ko howmany=10 whom="hello"
如果insmod时指定了参数值,则程序将使用传进来的值,即howmany的值为10,whom的值为hello。
2.数组参数
使用宏module_param_array来声明
module_param_array(name,type, nump, perm)
name为数组名
type为数组元素类型
nump是一个整形变量
perm为访问掩码
static int paramA[] = {1,2,3,4,5,6,7,8};
static int paramA_no = 1;
module_param_array(paramA, int , ¶mA_no , S_IRUGO);
如果不指定数组参数,paramA_no为初始值1,如果指定了数组参数,则paramA_no会被设置为提供数组参数的元素个数
如insmod hellop.ko paramA=5,6,4,1,3
paramA_no为5
如果insmod指定参数时超过paramA容量,比如8,则hellop.ko是不能被加载的
注意paramA_no这个不是模块参数,不能在加载时指定其大小,它是自动计算数组元素数目的值
要编译该驱动,直接修改hello的Makefile,将hello.o改成hellop.o即可