1. 程式人生 > >Linux核心學習-核心模組引數module_param

Linux核心學習-核心模組引數module_param

Linux2.6允許使用者insmod的時候往核心模組裡面傳遞引數,它主要使用module_param巨集定義來實現這一功能。

module_param的定義可以在include/linux/moduleparam.h檔案裡面檢視到,它的原型為:

module_param(name, type, perm);

module_param_array(name, type, nump, perm);

其中module_param是用來傳遞變數引數的,module_param_array是用來傳遞陣列引數的。

name是在模組中定義的變數名稱,type是變數的型別,perm是許可權掩碼,用來做一個輔助的sysfs入口。

nump是傳入陣列的數目,是一個int指標。

module_param支援傳遞的引數型別有:

bool:布林型
invbool:一個布林型( true 或者 false)值(相關的變數應當是 int 型別). invbool 型別顛倒了值, 所以真值變成 false, 反之亦然.
charp :一個字元指標值. 記憶體為使用者提供的字串分配, 指標因此設定.
int:整形
long:長整形
short:短整形
uint:無符號整形
ulong:無符號長整形
ushort:無符號短整形
基本的變長整型值. 以 u 開頭的是無符號值. 

perm 欄位是一個許可權值,表示此引數在sysfs檔案系統中所對應的檔案節點的屬性。你應當使用 <linux/stat.h> 中定義的值. 這個值控制誰可以存取這些模組引數在 sysfs 中的表示.當perm為0時,表示此引數不存在 sysfs檔案系統下對應的檔案節點。 否則, 模組被載入後,在/sys/module/ 目錄下將出現以此模組名命名的目錄, 帶有給定的許可權.。

許可權在include/linux/stat.h中有定義
比如:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
使用 S_IRUGO 引數可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來改變引數. 注意, 如果一個引數被 sysfs 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.

下面看一下實驗的例子:

 

Makefile檔案:

 

執行命令:

sudo insmod hello.ko msg_buf=veryCD

然後使用dmesg可以檢視到printk的輸出: [35983.685059] veryCD [35983.685067] n_arr[0]=1 [35983.685072] n_arr[1]=2 [35983.685075] n_arr[2]=3 [35983.685079] n_arr[3]=4 [35983.685083] n_arr[4]=5 [35983.685087] n_arr[5]=7 [35983.685091] n_arr[6]=1 可以看出,實現n_arr的長度應該為5,而n為7,驅動裡面並沒有檢測出,n_arr[5],n_arr[6]已經越界了,,, 但是insmod的時候卻是會檢測n_arr的長度的,, 輸入命令: sudo insmod hello.ko msg_buf=veryCD n_arr=1,2,3,4,5,6 但是提示出錯了,: insmod: error inserting 'hello.ko': -1 Invalid parameters 因為n_arr的陣列長度為5,當輸入的陣列長度小於等於5的時候,insmod可以載入模組成功, sudo insmod hello.ko msg_buf=veryCD n_arr=1,2,3 [36315.732903] veryCD [36315.732908] n_arr[0]=1 [36315.732909] n_arr[1]=2 [36315.732911] n_arr[2]=3 可以看出,module_param_array中的nump的值為實際的輸入陣列引數長度。 然後當使用insmod載入核心模組,並傳遞資料引數的時候,系統會自動檢測陣列的長度,當輸入的陣列長度小於模組的陣列長度是,insmod才會成功。