1. 程式人生 > >【迅為iTop4412學習筆記】16.模組傳參

【迅為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,列印單個引數,迴圈列印引數陣列。

與我們想的一致

收尾

本節比較簡單,只是模組傳參。