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