內核狀態下參數傳遞-module_param

1.簡介

在用戶態下編程可以通過main()的參數來傳遞命令行參數,而編寫一個內核模塊則通過module_param()來傳遞參數。

在用戶態下編程可以通過main(intargc,char*argv[])的參數來傳遞命令行參數,而編寫一個內核模塊則通過module_param()來傳遞參數。
例如,應用程序命令行傳參:
int main(intargc,char*argv[])/*argc:命令行參數個數,argv:命令行參數信息*/
{
/* 函數體 */
     return0;
}
運行:./a.out100200
其中:argc=3
argv[0]=“./a.out”
argv[1]=“100”
argv[2]=“200”

module_param(name, type, perm)是一個宏,表示向當前模塊傳入參數。參數用 module_param 宏定義來聲明, 它定義在 moduleparam.h中。
這個宏定義應當放在任何函數之外, 典型地是出現在源文件的前面.定義如:
MODULE_LICENSE("Dual BSD/GPL");

static char *whom = "world";
static int howmany = 1;

module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);
2.內核參數

module_param(name,type,perm);
功能:指定模塊參數,用於在加載模塊時或者模塊加載以後傳遞參數給模塊。
參數:
name:模塊參數的名稱
type: 模塊參數的數據類型
perm: 模塊參數的訪問權限
其中參數type可以取以下任意一種情況:
bool : 布爾型
inbool : 布爾反值
charp: 字符指針(相當於char *,不超過1024字節的字符串)
short: 短整型
ushort : 無符號短整型
int : 整型
uint : 無符號整型
long : 長整型
ulong: 無符號長整型
參數perm表示此參數在sysfs文件系統中所對應的文件節點的屬性,其權限在include/linux/stat.h中有定義。它的取值可以用宏定義,也可以有數字法表示。
宏定義有:
#defineS_IRUSR 00400文件所有者可讀
#defineS_IWUSR00200文件所有者可寫
#defineS_IXUSR 00100文件所有者可執行
#defineS_IRGRP00040與文件所有者同組的用戶可讀
#defineS_IWGRP00020
#defineS_IXGRP 00010
#defineS_IROTH 00004與文件所有者不同組的用戶可讀
#defineS_IWOTH00002
#defineS_IXOTH 00001
將數字最後三位轉化爲二進制:xxx xxx xxx,高位往低位依次看,第一位爲1表示文件所有者可讀,第二位爲1表示文件所有者可寫,第三位爲1表示文件所有者可執行;接下來三位表示文件所有者同組成員的權限;再下來三位爲不同組用戶權限.
00400 ==> 400 ==> 100 000 000
數字法:1表示執行權限,2表示寫入權限,4表示讀取權限。
一般用8進製表示即可,如0664。從左向右看,第一位的0表示八進制的意思,第二位的6表示文件所有者的權限爲可讀可寫,第三位的6表示文件同組用戶的權限爲可讀可寫,第四位的4表示文件其他用戶的權限爲只讀。
例如:
intirq;
char*pstr;
module_param(irq,int,0664);
module_param(pstr,charp,0000);
3.測試代碼

/*************************************************************************
	> File Name: hello.c
	> Author:  
	> Mail: 
	> Created Time: 2015年03月05日 星期四 22時17分43秒
 ************************************************************************/

#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>


MODULE_LICENSE("Dual BSD/GPL");

static char *whom = "world";
static int howmany = 1;

module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);

static int hello_init(void)
{
    int i;
    for(i = 0; i < howmany;++i)
        printk(KERN_ALERT"Hello,%s\n",whom);
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT"Goodbye,cruel %s\n",whom);
}

module_init(hello_init);
module_exit(hello_exit);
測試結果:

sudo insmod hellop.ko howmany=10 whom="Mom"
dmesg
---------------------------------------------------------------------
[ 3844.046504] Hello,Mom
[ 3844.046513] Hello,Mom
[ 3844.046516] Hello,Mom
[ 3844.046518] Hello,Mom
[ 3844.046520] Hello,Mom
[ 3844.046522] Hello,Mom
[ 3844.046524] Hello,Mom
[ 3844.046526] Hello,Mom
[ 3844.046528] Hello,Mom
[ 3844.046530] Hello,Mom
----------------------------------------------------------------------
sudo rmmod hellop
demsg
----------------------------------------------------------------------
[ 3886.029760] Goodbye,cruel Mom
----------------------------------------------------------------------

代碼下載:

http://git.oschina.net/OpenWrt-X/ldd3/tree/master/driver/2.hellop

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章