Linux驅動程式的模組引數

2021-06-21 20:04:26 字數 1889 閱讀 5368

模組引數

模組引數就是使用者在系統啟動或掛載模組時指定的引數值,相對於驅動程式它是全域性變數。

通過module_param()定義模組引數:

module_param(name, type, perm);

name – 即為引數名

type – 引數的型別,可以是byte(存放在char型變數中)、short、ushort、int、uint、long、ulong、charp(char型指標)、bool、invbool(使用者轉換來的bool型)

perm – 指定模組在sysfs下對應檔案的許可權,所有者、組內、其他人

static int km_param = 0;

module_param(km_param, bool, 0); // km_param是全域性變數

有時,模組外部引數名稱與模組內部變數名稱不同,這時需要使用巨集module_param_named():

module_param_ named (name, variable, type,perm);

variable – name是外部可見引數名,variable是內部全域性變數名。使用格式如下:

static int max _param = 0;

module_param_ named(max_km_param, max _param,int, 0);

有時,需要使用乙個charp型別定義乙個字串,核心將其copy到記憶體,charp就指向該字串:

static char *name;

module_param(name, charp, 0);

另一種可行方法是,讓核心直接copy字串到指定的字元陣列,使用巨集module_param_string():

module_param_string(name, string, len, perm);

name – 外部引數名

string – 對應模組內部引數名

len – 是string命名快取區的長度

使用格式如下:

static char param_str[len];

module_param_string(param_string, param_str,len, 0);

有時,需要接收逗號分隔的引數序列,這時使用巨集module_param_array()儲存在陣列中:

module_param_array(name, type, nump, perm);

nump – 為乙個整行指標,該整型存放陣列項的個數

使用格式如下:

static int param_array[max_para];

static int num_param;

module_param_array(param_array, int, & num_param,0444);

需要注意的是,引數name指定的陣列必須靜態分配,因為核心在編譯時需要確定陣列大小,避免造成溢位。

同樣,也可以使外部引數和模組內部引數不同,使用如下巨集:

module_param_array_named(name, array, type,nump, perm);

使用同module_param_ named。

最後,可以描述下使用者自己的引數:

static unsigned int cnt = 0;

module_param(cnt, uint, 0644);

module_parm_desc(cnt, 「the cnt counts theirq」);

linux 驅動程式 高階字元驅動程式

ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...