linux驅動開發第二帖 模組引數

2021-05-28 04:53:34 字數 2342 閱讀 1635

linux驅動開發之模組引數

1.module_param

在使用者態下程式設計可以通過main()的來傳遞命令列引數,而編寫乙個核心模組則通過module_param()。

引數用 module_param 巨集定義來宣告, 它定義在 moduleparam.h

module_param(name,type,perm);

module_param 使用了 3 個引數: 變數名, 它的型別, 以及乙個許可權掩碼用來做乙個輔助的 sysfs 入口(啥意思). 這個巨集定義應當放在任何函式之外, 典型地是出現在原始檔的前面.定義如下:

static char *whom = "world";

static int howmany = 1;

module_param(howmany, int, s_irugo);

module_param(whom, charp, s_irugo);

模組引數支援許多態別: 

bool 

invbool 

乙個布林型( true 或者 false)值(相關的變數應當是 int 型別). invbool 型別顛倒了值, 所以真值變成 false, 反之亦然. 

charp

乙個字元指標值. 記憶體為使用者提供的字串分配, 指標因此設定. 

int 

long 

short 

uint 

ulong 

ushort

基本的變長整型值. 以 u 開頭的是無符號值.

陣列引數, 用逗號間隔的列表提供的值, 模組載入者也支援. 宣告乙個陣列引數, 使用: 

module_param_array(name,type,num,perm); 

這裡 name 是你的陣列的名子(也是引數名), 

type 是陣列元素的型別, 

num 是乙個整型變數, 

perm 是通常的許可權值. 

如果陣列引數在載入時設定, num 被設定成提供的數的個數. 模組載入者拒絕比陣列能放下的多的值. 

perm引數的作用是什麼?

最後的 module_param 欄位是乙個許可權值; 你應當使用 中定義的值. 這個值控制誰可以訪問這些模組引數在 sysfs 中的表示.如果 perm 被設為 0, 就根本沒有 sysfs 項. 否則, 它出現在 /sys/module下面, 帶有給定的許可權. 使用 s_irugo 作為引數可以被所有人讀取, 但是不能改變; s_irugo|s_iwusr 允許 root 來改變引數. 注意, 如果乙個引數被 sysfs 修改, 你的模組看到的引數值也改變了, 但是你的模組沒有任何其他的通知. 你應當不要使模組引數可寫, 除非你準備好檢測這個改變並且因而作出反應.

**示例:

#include

#include

#include

static int howmany = 1;

static char *whom = "gemini";

static int array[8] = ;

module_param(howmany, int, s_irugo);

module_param(whom, charp, s_irugo);

module_param_array(array, int, &howmany, s_irugo);

static int __init char_dev_init(void)

return 0;

}static void __exit char_dev_exit(void)

module_init(char_dev_init);

module_exit(char_dev_exit);

module_license("dual bsd/gpl");

測試如下:

insmod hello.ko howmany=8 whom="hello"

列印結果如下:

[44692.594200] (1):hello

[44692.594202] (2):hello

[44692.594203] (3):hello

[44692.594203] (4):hello

[44692.594204] (5):hello

[44692.594204] (6):hello

[44692.594205] (7):hello

[44692.594206] (8):hello

linux驅動開發 模組引數

在我們使用模組的時候需要在裝載時傳遞引數給模組,linux 支援在裝載模組的同時傳入引數 比如 num 和who就是傳入模組的引數 insmod hello.ko num 10 who jack 模組引數必須用module parm巨集宣告,這個巨集定義在,剛才連個引數在模組中的定義如下 stati...

linux下的應用模組傳參及驅動模組傳參的區別

在使用者態下程式設計可以通過main intargc,char argv 來傳遞命令列引數,而編寫乙個核心模組則通過module param 來傳遞引數 一.應用程式命令列傳參 執行結果如下 二.核心模組傳參 module param name,type,perm 是乙個巨集,表示向當前模組傳入引數...

Linux 驅動 第二章 構造和執行模組

設定測試系統開發環境及hello world入門模組在前面博文中已經講到,請參考 一,核心模組與應用程式的對比 應用程式 小規模及中規模程式,從頭到尾執行單個任務。核心模組 預先註冊自己,以便服務於將來的某個請求。然後他的初始化函式就立即結束。退出時候,應用程式可以不釋放自己申請的資源,而模組在退出...