歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux設備驅動之Hello World帶參數版本!

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

日期:2017/3/1 10:27:25   编辑:Linux編程

上一節中我們我們寫了一個簡單的驅動程序(見 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. static char *hello = "hello world!";
  4. static char *bye = "goodbye!";
  5. static int hello_init(void)
  6. {
  7. printk(KERN_INFO "param vlaue:%s\n", hello);
  8. return 0;
  9. }
  10. static void hello_exit(void)
  11. {
  12. printk(KERN_INFO "param value:%s\n", bye);
  13. }
  14. module_init(hello_init);
  15. module_exit(hello_exit);
  16. module_param(hello, charp, S_IRUGO);
  17. module_param(bye, charp, S_IRUGO);
  18. MODULE_LICENSE("Dual BSD/GPL");
Copyright © Linux教程網 All Rights Reserved