linux下的應用模組傳參及驅動模組傳參的區別
在使用者態下程式設計可以通過main(intargc,char*argv[])來傳遞命令列引數,而編寫一個核心模組則通過module_param ()來傳遞引數
一. 應用程式命令列傳參
執行結果如下:
二. 核心模組傳參
module_param(name, type, perm)是一個巨集,表示向當前模組傳入引數。引數用 module_param 巨集定義來宣告, 它定義在 moduleparam.h中。
這個巨集定義應當放在任何函式之外, 典型地是出現在原檔案的前面.定義如:
static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
module_param(name,type,perm)引數介紹:
功能:指定模組引數,用於在載入模組時或者模組載入以後傳遞引數給模組。
引數:
name:模組引數的名稱
type: 模組引數的資料型別
perm: 模組引數的訪問許可權
其中引數type可以取以下任意一種情況:
bool : 布林型,inbool : 布林反值,charp: 字元指標(相當於char *,不超過1024位元組的字串),short: 短整型,ushort : 無符號短整型,int : 整型,uint :
引數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);
核心模組陣列簡介
module_param_array( name, type, nump, perm);
引數:
name:模組引數的名稱
type: 模組引數的資料型別
nump:陣列元素個數指標
perm: 模組引數的訪問許可權
例如:
staticintfish[10];
static int nr_fish;
module_param_array( fish, int, &nr_fish, 0664);
nr_fish:儲存最終傳遞陣列元素個數,不能大於10個
perm引數的作用是什麼?
最後的 module_param 欄位是一個許可權值; 你應當使用 <linux/stat.h> 中定義的值. 這個值控制誰可以存取這些模組引數在 sysfs 中的表示.如果 perm 被設為 0, 就根本沒有 sysfs 項. 否則, 它出現在 /sys/module下面, 帶有給定的許可權. 使用 S_IRUGO 作為引數可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來改變引數. 注意, 如果一個引數被 sysfs 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.
測試示例內容如下:
對應該檔案的Makefile如下:
執行過程如下圖示:
因為列印資訊列印到了linux後臺,因此使用dmesg檢視列印資訊如下圖示:
執行結果,與程式碼相符!
以上就可以理解為一個最簡單的驅動測試示例程式。