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