上一節中我們我們寫了一個簡單的驅動程序(見 http://www.linuxidc.com/Linux/2012-03/55913.htm ),基本就是編程中的hello world!但是整個打印出來的內容都是編譯的時候確定好的,不能根據輸入的參數動態改變。所以,這裡我們實現hello world!帶參數的版本,主要實現的效果就是裝載模塊的時候給出打印參數,模塊能夠打印出這個參數!
參數的來源主要有兩個:一是使用insmod ./XX.ko 時候在命令行後直接給出參數;二是使用modprobe命令裝載模塊時可以從它的配置文件文件中讀取參數值!當不通過這兩個方式提供參數值時,參數會使用我們在模塊中提供的默認值。所有的參數必須使用module_param這個宏來定義:
- /**
- * module_param - typesafe helper for a module/cmdline parameter
- * @value: the variable to alter, and exposed parameter name.
- * @type: the type of the parameter
- * @perm: visibility in sysfs.
- **/
- #define module_param(name, type, perm) \
- module_param_named(name, name, type, perm)
由上面的定義可以看出,定義一個參數需要三分部分:參數的名稱、參數的類型和參數在sysfs文件系統入口可見性的掩碼。
模塊裝載器也支持數組參數,定義如下:
- /**
- * module_param_array - a parameter which is an array of some type
- * @name: the name of the array variable
- * @type: the type, as per module_param()
- * @nump: optional pointer filled in with the number written
- * @perm: visibility in sysfs
- **/
- #define module_param_array(name, type, nump, perm) \
- module_param_array_named(name, name, type, nump, perm)
定義一個參數數組需要四個部分:數組的名稱、數組元素的類型、數組的大小以及數組參數在sysfs文件系統可見性的掩碼!
這裡我們使用模塊參數,如下修改上一篇《Linux設備驅動之Hello World! 》中的程序:
- #include <linux/init.h>
- #include <linux/module.h>
-
- static char *hello = "hello world!";
- static char *bye = "goodbye!";
-
- static int hello_init(void)
- {
- printk(KERN_INFO "param vlaue:%s\n", hello);
- return 0;
- }
-
- static void hello_exit(void)
- {
- printk(KERN_INFO "param value:%s\n", bye);
- }
-
- module_init(hello_init);
- module_exit(hello_exit);
- module_param(hello, charp, S_IRUGO);
- module_param(bye, charp, S_IRUGO);
-
- MODULE_LICENSE("Dual BSD/GPL");