在裝載核心模組時,使用者可以向模組傳遞引數,形式為:
insmod/modprobe 模組名 引數名 = 引數值。
如果不傳遞,引數將使用模組內定義的預設值。
我們可以使用以下方法為模組定義乙個引數:
module_param(引數名,引數型別,引數讀/寫許可權);
如下**定義了乙個整型引數:
static int num = 4000 ;
module_param(num, int , s_irugo);
引數可以是以下型別:
byte
short
ushort
intuint
long
ulong
char(字元指標)
bool
invbool(布林的反,invbool
型別顛倒了值, 所以真值變成 false,)
在模組被編譯時會將module_param中宣告的型別與變數定義的型別進行比較,判斷是否一致。
模組被載入後,在/sys/module/目錄下將出現以此模組命名的目錄。
當「引數讀/寫許可權」為0時,表示此引數不存在sysfs檔案系統下對應的檔案節點。
當「引數讀/寫許可權」不為0時,在此模組的目錄下還將出現parameters目錄,包含一系列以引數名命名的檔案節點,這些檔案的許可權值就是傳入module_param( )的「引數讀寫許可權」,而這些檔案的內容為引數的值。
除此之外,模組也可以擁有引數陣列,形式為「module_param_array(陣列名,陣列型別,陣列長,引數讀/寫許可權)」。
從2.6.0~2.6.10版本,需要將陣列長變數名賦給「陣列長」。從2.6.10版本開始,需將陣列長變數的指標賦給「陣列長」,當不需要儲存實際輸入的陣列元素個數時,可以設定「陣列長」為null。
執行insmod或modprobe命令時,使用逗號分割輸入的陣列元素。
一下是實驗例子:
[cpp]view plain
copy
#include
#include
#include
///module_license("dual bsd/gpl"
);
char
*msg_buf =
"hello world!"
; int
n_arr = ;
intn = 7;
//module_param(n, int, s_irusr);
module_param_array(n_arr, int
, &n, s_irusr);
module_param(msg_buf, charp, s_irusr);
///static
__init
inthello_init(
void
)
return
0;
} ///
static
__exit
void
hello_exit(
void
)
module_init(hello_init);
module_exit(hello_exit);
makefile檔案:
[xhtml]view plain
copy
### makefile
obj-m :
= hello
.o
kernel_dir :
= /lib/modules/$(shell uname -r)/build
pwd :
= $(shell pwd)
default:
$(make) -c $(kernel_dir) m
=$(pwd) modules
clean:
$(make) -c $(kernel_dir) m
=$(pwd) clean
執行命令:
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才會成功。
Linux核心開發 核心模組引數
目錄 使用引數載入模組 module param巨集 讀取和更改引數值 驗證引數值 宣告模組引數陣列 有關模組引數的一些說明 在本文中,我們將向模組新增引數。使用引數,您可以在載入模組時訪問模組全域性變數,並在執行時已載入模組時訪問模組全域性變數。使用insmod命令載入模組時,可以提供引數作為ke...
Linux核心模組傳遞引數
如果需要向核心模組中傳遞引數,可以使用函式 module param 引數名,引數型別,讀寫許可權 1 引數名稱 不必解釋 2 引數型別 byte,short,short,int,uint,long,ulong,charp,bool,invbool 3 讀寫許可權 一般為s irugo 例子 傳遞乙...
核心模組引數
在 中,可以這樣寫 static int cfg value 3 module param cfg value,int,0764 然後,載入核心的時候,可以添上制定的引數值 不加的話,就是 的數值 insmod module name cfg value 100核心模組加進來之後,可以在 sys m...