Linux内核模块参数

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
	
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章