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