模块也可以从命令行获取参数。但不是通过以前你习惯的argc/argv。
要传递参数给模块,首先将获取参数值的变量声明为全局变量。然后使用宏 MODULE_PARM() macro, (在头文件linux/module.h)。运行时,insmod将给变量赋予命令行的参数。为使代码清晰, 变量的声明和宏都应该放在模块代码的开始部分。以下的代码范例也许将比我公认差劲的解说更好。
宏 MODULE_PARM() 需要两个参数,变量的名字和其类型。支持的类型有"b": 比特型, "h": 短整型, "i": 整数型,"l": 长整型和 "s": 字符串型。 字符串类型应该声明为 "char *" 这样insmod就可以为它们分配内存空间。你应该总是为你的变量赋初值。这是内核编程,代码要编写的十分谨慎。举个例子:
int myint = 3; char *mystr; MODULE_PARM (myint, "i"); MODULE_PARM (mystr, "s"); |
数组同样被支持。在宏MODULE_PARM中在类型符号前面的整型值意味着一个指定了最大长度的数组。 用'-'隔开的两个数字则分别意味着最小和最大长度。下面的例子中,就声明了一个最小长度为2,最大长度为4的整形数组。
int myshortArray[4]; MODULE_PARM (myintArray, "2-4i"); |
将初始值设为缺省使用的IO端口或IO内存是一个不错的作法。如果这些变量有缺省值,则可以进行自动设备检测, 否则保持当前设置的值。我们将在后续章节解释清楚相关内容。在这里我只是演示如何向一个模块传递参数。
Example 2-7. hello-5.c
/* hello-5.c - Demonstrates command line argument passing to a module. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Peiter Jay Salzman"); static short int myshort = 1; static int myint = 420; static long int mylong = 9999; static char *mystring = "blah"; MODULE_PARM (myshort, "h"); MODULE_PARM (myint, "i"); MODULE_PARM (mylong, "l"); MODULE_PARM (mystring, "s"); static int __init hello_5_init(void) { printk(KERN_ALERT "Hello, world 5\n=============\n"); printk(KERN_ALERT "myshort is a short integer: %hd\n", myshort); printk(KERN_ALERT "myint is an integer: %d\n", myint); printk(KERN_ALERT "mylong is a long integer: %ld\n", mylong); printk(KERN_ALERT "mystring is a string: %s\n", mystring); return 0; } static void __exit hello_5_exit(void) { printk(KERN_ALERT "Goodbye, world 5\n"); } module_init(hello_5_init); module_exit(hello_5_exit); |