1. 程式人生 > >linux下的應用模組傳參及驅動模組傳參的區別

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

在使用者態下程式設計可以通過main(intargc,char*argv[])來傳遞命令列引數,而編寫一個核心模組則通過module_param ()來傳遞引數

一. 應用程式命令列傳參

執行結果如下:

二. 核心模組傳參

module_param(name, type, perm)是一個巨集,表示向當前模組傳入引數。引數用 module_param 巨集定義來宣告, 它定義在 moduleparam.h中。

這個巨集定義應當放在任何函式之外, 典型地是出現在原檔案的前面.定義如:

static char *whom = "world";

static int howmany = 1;

module_param(howmany, int, S_IRUGO);

module_param(whom, charp, S_IRUGO);

module_param(name,type,perm)引數介紹:

功能:指定模組引數,用於在載入模組時或者模組載入以後傳遞引數給模組。

引數:

name:模組引數的名稱

type: 模組引數的資料型別

perm: 模組引數的訪問許可權

其中引數type可以取以下任意一種情況:

bool : 布林型,inbool : 布林反值,charp: 字元指標(相當於char *,不超過1024位元組的字串),short: 短整型,ushort : 無符號短整型,int : 整型,uint : 

無符號整型,long : 長整型,ulong: 無符號長整型。

引數perm表示此引數在sysfs檔案系統中所對應的檔案節點的屬性,其許可權在include/linux/stat.h中有定義。它的取值可以用巨集定義,也可以有數字法表示。

巨集定義有:

#defineS_IRUSR 00400檔案所有者可讀

#defineS_IWUSR00200檔案所有者可寫

#defineS_IXUSR 00100檔案所有者可執行

#defineS_IRGRP00040與檔案所有者同組的使用者可讀

#defineS_IWGRP00020

#defineS_IXGRP 00010

#defineS_IROTH 00004與檔案所有者不同組的使用者可讀

#defineS_IWOTH00002

#defineS_IXOTH 00001

將數字最後三位轉化為二進位制:xxx xxx xxx,高位往低位依次看,第一位為1表示檔案所有者可讀,第二位為1表示檔案所有者可寫,第三位為1表示檔案所有者可執行;接下來三位表示檔案所有者同組成員的許可權;再下來三位為不同組使用者許可權.

00400 ==> 400 ==> 100 000 000

數字法:1表示執行許可權,2表示寫入許可權,4表示讀取許可權。

一般用8進製表示即可,如0664。從左向右看,第一位的0表示八進位制的意思,第二位的6表示檔案所有者的許可權為可讀可寫,第三位的6表示檔案同組使用者的許可權為可讀可寫,第四位的4表示檔案其他使用者的許可權為只讀。

例如:

intirq;

char*pstr;

module_param(irq,int,0664);

module_param(pstr,charp,0000);

核心模組陣列簡介

module_param_array( name, type, nump, perm);

引數:

name:模組引數的名稱

type: 模組引數的資料型別

nump:陣列元素個數指標

perm: 模組引數的訪問許可權

例如:

staticintfish[10];

static int nr_fish;

module_param_array( fish, int, &nr_fish, 0664);

nr_fish:儲存最終傳遞陣列元素個數,不能大於10個

perm引數的作用是什麼?

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

測試示例內容如下:

對應該檔案的Makefile如下:

執行過程如下圖示:

因為列印資訊列印到了linux後臺,因此使用dmesg檢視列印資訊如下圖示:

 執行結果,與程式碼相符!

以上就可以理解為一個最簡單的驅動測試示例程式。