Linux内核模块参数
1传递单个参数
module_param(name, type, perm);
name 既是用户看到的参数名,又是模块内接受参数的变量;
type 表示参数的数据类型,是下列之一:byte, short, ushort, int, uint, long, ulong, charp, bool, invbool;
perm 指定了在sysfs中相应文件的访问权限。访问权限与linux文件访问权限相同的方式管理,如0644,或使用stat.h中的宏如S_IRUGO表示。
0 表示完全关闭在sysfs中相对应的项。
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
#define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
#define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
#define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
这些宏不会声明变量,因此在使用宏之前,必须声明变量,典型地用法如下:
static unsigned int int_var = 0;
module_param(int_var, uint, S_IRUGO);
使用的时候只需要在insmod命令后面加上传入参数列表即可,参数之前以空格隔开:
insmod xxxx.ko int_var=x
2传递数组变量
传递多个参数可以通过宏 module_param_array(para , type , &n_para , perm) 实现。
其中,para既是外部模块的参数名又是程序内部的变量名,type是数据类型,perm是sysfs的访问权限。指针nump指向一个整数,其值表示有多少个参数存放在数组para中。
para:参数数组; 数组的大小才是决定能输入多少个参数的决定因素.
n_para:参数个数; 这个变量其实无决定性作用;只要para数组大小够大,在插入模块的时候,输入的参数个数会改变n_para的值,最终传递数组元素个数存在n_para中,每个数组元素之间使用“,”隔开。
典型地用法如下:
static int arr[32];
static int arr_len;
module_param_array(arr , int , &arr_len , S_IRUGO);
输入如下:
sudo insmod module_param.ko count=16 msg=“hello.” arr=6,7,8,9
[ 2133.457005] module_param init.
[ 2133.457010] count=16
[ 2133.457012] msg:hello.
[ 2133.457013] arr_len:4
[ 2133.457015] arr[0]=6
[ 2133.457016] arr[1]=7
[ 2133.457017] arr[2]=8
[ 2133.457019] arr[3]=9
添加了内核模块参数modinfo会看到相关的信息:
modinfo module_param.ko
filename: /home/gstar/drivers/modules/module_param/module_param.ko
license: GPL
version: V1.0
description: A simple module with parameters.
author: Rbin.Yao
srcversion: 92A1B21689E51DFF438ACAF
depends:
vermagic: 4.4.0-31-generic SMP mod_unload modversions
parm: count:int
parm: msg:charp
parm: arr:array of int
参考代码如下:
#include <linux/init.h>
#include <linux/module.h>
static int count=1000;
static char *msg="This is origin msg.\n";
module_param(count, int, S_IRUGO);
module_param(msg, charp, S_IRUGO);
static int arr[16] = {1,2,3,4,5,6};
static int arr_len = 6;
module_param_array(arr, int, &arr_len, S_IRUGO);
static int __init module_param_init(void)
{
int i;
printk("module_param init.\n");
printk("count=%d\n", count);
printk("msg:%s\n", msg);
printk("arr_len:%d\n", arr_len);
for (i=0; i<arr_len; i++) {
printk("arr[%d]=%d\n", i, arr[i]);
}
return 0;
}
static void __exit module_param_exit(void)
{
printk("module_param exit.\n");
}
module_init(module_param_init);
module_exit(module_param_exit);
MODULE_AUTHOR("Rbin.Yao");
MODULE_DESCRIPTION("A simple module with parameters.");
MODULE_VERSION("V1.0");
MODULE_LICENSE("GPL");
Makefile:
obj-m := module_param.o
PWD := $(shell pwd)
KDIR := /lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean