linux核心模組引數

2021-06-23 00:11:39 字數 3019 閱讀 6128

在裝載核心模組時,使用者可以向模組傳遞引數,形式為:

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...