module_param()的學習

來源:互聯網
上載者:User

(1)引入原因

       在使用者態下編程可以通過main()來傳遞命令列參數(具體可見C語言進階中的一篇文章),而編寫一個核心模組則可通過module_param()來傳遞命令列參數。
(2)實現

        module_param宏是Linux 2.6核心中新增的,該宏被定義在include/linux/moduleparam.h檔案中,具體定義如下:

/* Helper functions: type is byte, short, ushort, int, uint, long,  ulong, charp, bool or invbool, or XXX if you define param_get_XXX,param_set_XXX and param_check_XXX. */
   #define module_param_named(name, value, type, perm)              
    param_check_##type(name, &(value));                  
    module_param_call(name, param_set_##type, param_get_##type, &value, perm);
    __MODULE_PARM_TYPE(name, #type)

    #define module_param(name, type, perm)              module_param_named(name, name, type, perm)

(3)module_param使用了3個參數:變數名,它的類型,以及一個許可權掩碼用來做一個輔助的sysfs入口。這個宏定義應當放在函數之外,典型的是出現在源檔案的前面。
eg: static char *whom="world"
       static int    tige=1;
       module_param(tiger,int,S_IRUGO);
       module_param(whom,charp,S_IRUGO);
(4)數組參數

       用逗號間隔的列表提供值,模組載入也支援。聲明一個數組參數,使用:module_param_array(name,type,num,perm);這裡 name 是你的數組的名子(也是參數名),
type 是數組元素的類型,num 是一個整型變數,perm 是通常的許可權值。模組載入者拒絕比數組能放下的多的值。

(5)執行個體

1,編寫一個moduleparam.c,如下:

#include <linux/init.h>#include <linux/module.h>#include <linux/moduleparam.h>MODULE_LICENSE("Dual BSD/GPL");static char *who = "world";static int times = 1;module_param(times,int,S_IRUSR);module_param(who,charp,S_IRUSR);static int hello_init(){        int i;        for(i = 0;i < times;i++)                printk(KERN_ALERT"(%d)hello,%s! /n",i,who);        return 0;}static void hello_exit(){        printk(KERN_ALERT"Goodbye ,%s! /n",who);}module_init(hello_init);module_exit(hello_exit);

2,編寫一個makefile檔案,如下:

obj-m:=moduleparam.oCURRENT_PATH:=$(shell pwd)VERSION_NUM:=$(shell uname -r)LINUX_PATH:=/usr/src/linux-headers-$(VERSION_NUM)all:        make -C $(LINUX_PATH) M=$(CURRENT_PATH) modulesclean:        make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean

        執行make後編譯產生moduleparam.ko。然後終端執行:sudo insmod moduleparam.ko who=pig times=4,再用dmesg就可以看到核心訊息末尾有:

[ 1637.910012] (0)hello,pig! /n
[ 1637.910039] (1)hello,pig! /n
[ 1637.910044] (2)hello,pig! /n
[ 1637.910047] (3)hello,pig! /n

        可見模組在載入時調用了其後的模組參數。

 

參考原文:http://www.phpfans.net/article/htmls/201011/MzIxNzY3.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.