歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux設備驅動之Hello World帶參數版本!

上一節中我們我們寫了一個簡單的驅動程序(見 http://www.linuxidc.com/Linux/2012-03/55913.htm ),基本就是編程中的hello world!但是整個打印出來的內容都是編譯的時候確定好的,不能根據輸入的參數動態改變。所以,這裡我們實現hello world!帶參數的版本,主要實現的效果就是裝載模塊的時候給出打印參數,模塊能夠打印出這個參數!

參數的來源主要有兩個:一是使用insmod ./XX.ko 時候在命令行後直接給出參數;二是使用modprobe命令裝載模塊時可以從它的配置文件文件中讀取參數值!當不通過這兩個方式提供參數值時,參數會使用我們在模塊中提供的默認值。所有的參數必須使用module_param這個宏來定義:

  1. /** 
  2.  * module_param - typesafe helper for a module/cmdline parameter 
  3.  * @value: the variable to alter, and exposed parameter name. 
  4.  * @type: the type of the parameter 
  5.  * @perm: visibility in sysfs. 
  6.  **/  
  7.  #define module_param(name, type, perm)             \   
  8.     module_param_named(name, name, type, perm)

由上面的定義可以看出,定義一個參數需要三分部分:參數的名稱、參數的類型和參數在sysfs文件系統入口可見性的掩碼。

模塊裝載器也支持數組參數,定義如下:

  1. /** 
  2.  * module_param_array - a parameter which is an array of some type 
  3.  * @name: the name of the array variable 
  4.  * @type: the type, as per module_param() 
  5.  * @nump: optional pointer filled in with the number written 
  6.  * @perm: visibility in sysfs 
  7.  **/  
  8. #define module_param_array(name, type, nump, perm)      \   
  9.     module_param_array_named(name, name, type, nump, perm)

定義一個參數數組需要四個部分:數組的名稱、數組元素的類型、數組的大小以及數組參數在sysfs文件系統可見性的掩碼!

這裡我們使用模塊參數,如下修改上一篇《Linux設備驅動之Hello World! 》中的程序:

  1. #include <linux/init.h>   
  2. #include <linux/module.h>   
  3.   
  4. static char *hello = "hello world!";  
  5. static char *bye = "goodbye!";  
  6.   
  7. static int hello_init(void)   
  8. {  
  9.     printk(KERN_INFO "param vlaue:%s\n", hello);  
  10.     return 0;  
  11. }  
  12.   
  13. static void hello_exit(void)   
  14. {  
  15.     printk(KERN_INFO "param value:%s\n", bye);  
  16. }  
  17.   
  18. module_init(hello_init);  
  19. module_exit(hello_exit);  
  20. module_param(hello, charp, S_IRUGO);  
  21. module_param(bye, charp, S_IRUGO);  
  22.   
  23. MODULE_LICENSE("Dual BSD/GPL");  
Copyright © Linux教程網 All Rights Reserved