【迅為iTop4412學習筆記】16.模組傳參
宣告
以下都是我剛開始看驅動視訊的個人強行解讀,如果有誤請指出,共同進步。
本節目標
模組傳參
在編寫LED的時候我們有做過一個操作,就是
./app 1
這個操作其實很常見,啟動我們寫的程式的時候,後面跟著引數,main()的引數argc和argv就會把他們傳進來,這是最基本的C語言知識。
對於模組而言,也是類似的情況。
如果我們的模組想要傳引數,首先要包含一個頭檔案
// 標頭檔案路徑:include/linux/moduleparam.h
#include <linux/moduleparam.h>
開啟之後我們可以看見巨集定義(傳入單個引數,傳入引數陣列)
// 引數
#define module_param(name, type, perm) \
module_param_named(name, name, type, perm)
// 引數陣列
#define module_param_array(name, type, nump, perm) \
module_param_array_named(name, name, type, nump, perm)
學習階段,我們暫時只要知道怎麼去呼叫就行了,其他的等我入門了再說吧…
其實名字已經比較清楚了,不過我們還是要介紹一下
module_param(name, type, perm) – name:模組引數的名稱 – type:模組引數的資料型別(支援int long short uint ulong ushort型別) – perm:模組引數的訪問許可權(S_IRUSR引數表示所有檔案所有者可讀) module_param_array(name, type, nump, perm) – name:模組引數的名稱 – type:模組引數的資料型別(支援int long short uint ulong ushort型別) - nump:儲存引數個數的地址 – perm:模組引數的訪問許可權(S_IRUSR引數表示所有檔案所有者可讀)
舉個例子:
// 先宣告
int mryang_arg; // 引數
int mryang_array[10]; // 引數陣列
int mryang_array_num; // 實際傳入引數陣列的引數個數
// 檔案所有者只讀許可權
module_param(mryang_arg, int, S_IRUSR);
module_param_array(mryang_array, int, &mryang_array_num, S_IRUSR);
當然,也有其他許可權,例如:
S_IRUSR:使用者讀許可權
S_IWUSR:使用者寫許可權
S_IRGRP:使用者組讀許可權
S_IWGRP:使用者組寫許可權
S_IROTH:其他組都許可權
S_IWOTH:其他組寫許可權
其實規律都是S_i開頭,R是Read,W是Write。USR是使用者,GRP是使用者組,OTH是other。名字就已經很清楚了。
完整的程式就是:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("MrYang");
// 先宣告
int mryang_arg; // 引數
int mryang_array[10]; // 引數陣列
int mryang_array_num; // 實際傳入引數陣列的引數個數
// 檔案所有者只讀許可權
module_param(mryang_arg, int, S_IRUSR);
module_param_array(mryang_array, int, &mryang_array_num, S_IRUSR);
static int mryang_init(void)
{
int i;
printk(KERN_EMERG "HELLO MrYang\n");
// 單個引數
printk(KERN_EMERG "arg: %d\n", mryang_arg);
// 引數陣列
for(i=0;i<mryang_array_num;i++)
{
printk(KERN_EMERG "arr: %d", mryang_array[i]);
}
printk(KERN_EMERG "\n");
return 0;
}
static void mryang_exit(void)
{
printk(KERN_EMERG "Bye MrYang\n");
}
module_init(mryang_init);
module_exit(mryang_exit);
編譯之後開始糾結了,應用裡 ./app 1 2就可以傳入兩個引數,模組怎麼傳?
對於單個引數,我們要 insmod module.ko 引數1=值
對於引數陣列,我們要 insmod module.ko 引數陣列=值1,值2,值3
舉例,我們編譯之後放在板子上執行:
insmod probe_linux_module.ko mryang_arg=123 mryang_array=1,2,3,4,5
此處 insmod *.ko是插入模組,後面引數=123,引數陣列為1,2,3,4,5
檢視shell輸出:
[ 95.685414] HELLO MrYang
[ 95.686500] arg: 123
[ 95.688666] arr: 1
[ 95.690650] arr: 2
[ 95.692660] arr: 3
[ 95.694742] arr: 4
[ 95.704841] arr: 5
列印Hello,列印單個引數,迴圈列印引數陣列。
與我們想的一致
收尾
本節比較簡單,只是模組傳參。