对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。
使用下面的宏时需要包含头文件<linux/moduleparam.h>。
module_param() 和 module_param_array() 的作用就是让那些全局变量对 insmod 可见,使模块装载时可重新赋值。
module_param_array() 宏的第三个参数用来记录用户 insmod 时提供的给这个数组的元素个数,NULL 表示不关心用户提供的个数
module_param() 和 module_param_array() 最后一个参数权限值不能包含让普通用户也有写权限,否则编译报错。这点可参考 linux/moduleparam.h 中 __module_param_call() 宏的定义。
字符串数组中的字符串似乎不能包含逗号,否则一个字符串会被解析成两个
一个测试用例:parm_hello.c
#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h> #define MAX_ARRAY 6 static int int_var = 0; static const char *str_var = "default"; static int int_array[6]; int narr; module_param(int_var, int, 0644); MODULE_PARM_DESC(int_var, "A integer variable"); module_param(str_var, charp, 0644); MODULE_PARM_DESC(str_var, "A string variable"); module_param_array(int_array, int, &narr, 0644); MODULE_PARM_DESC(int_array, "A integer array"); static int __init hello_init(void) { int i; printk(KERN_ALERT "Hello, my LKM.\n"); printk(KERN_ALERT "int_var %d.\n", int_var); printk(KERN_ALERT "str_var %s.\n", str_var); for(i = 0; i < narr; i ++){ printk("int_array[%d] = %d\n", i, int_array[i]); } return 0; } static void __exit hello_exit(void) { printk(KERN_ALERT "Bye, my LKM.\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("ydzhang"); MODULE_DEION("This module is a example."); |
测试:insmod parm_hello.ko int_var=100 str_var=hello int_array=100,200