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