2.8. 模塊參數(shù)

2018-02-24 15:49 更新

2.8.?模塊參數(shù)

驅(qū)動(dòng)需要知道的幾個(gè)參數(shù)因不同的系統(tǒng)而不同. 從使用的設(shè)備號(hào)( 如我們?cè)谙乱徽乱姷降?)到驅(qū)動(dòng)應(yīng)當(dāng)任何操作的幾個(gè)方面. 例如, SCSI 適配器的驅(qū)動(dòng)常常有選項(xiàng)控制標(biāo)記命令隊(duì)列的使用, IDE 驅(qū)動(dòng)允許用戶控制 DMA 操作. 如果你的驅(qū)動(dòng)控制老的硬件, 還需要被明確告知哪里去找硬件的 I/O 端口或者 I/O 內(nèi)存地址. 內(nèi)核通過在加載驅(qū)動(dòng)的模塊時(shí)指定可變參數(shù)的值, 支持這些要求.

這些參數(shù)的值可由 insmod 或者 modprobe 在加載時(shí)指定; 后者也可以從它的配置文件(/etc/modprobe.conf)讀取參數(shù)的值. 這些命令在命令行里接受幾類規(guī)格的值. 作為演示這種能力的一種方法, 想象一個(gè)特別需要的對(duì)本章開始的"hello world"模塊(稱為 hellop)的改進(jìn). 我們?cè)黾?2 個(gè)參數(shù): 一個(gè)整型值, 稱為 howmany, 一個(gè)字符串稱為 whom. 我們的特別多功能的模塊就在加載時(shí), 歡迎 whom 不止一次, 而是 howmany 次. 這樣一個(gè)模塊可以用這樣的命令行加載:


insmod hellop howmany=10 whom="Mom" 

一旦以那樣的方式加載, hellop 會(huì)說 "hello, Mom" 10 次.

但是, 在 insmod 可以修改模塊參數(shù)前, 模塊必須使它們可用. 參數(shù)用 moudle_param 宏定義來聲明, 它定義在 moduleparam.h. module_param 使用了 3 個(gè)參數(shù): 變量名, 它的類型, 以及一個(gè)權(quán)限掩碼用來做一個(gè)輔助的 sysfs 入口. 這個(gè)宏定義應(yīng)當(dāng)放在任何函數(shù)之外, 典型地是出現(xiàn)在源文件的前面. 因此 hellop 將聲明它的參數(shù), 并如下使得對(duì) insmod 可用:


static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

模塊參數(shù)支持許多類型:

bool invbool
一個(gè)布爾型( true 或者 false)值(相關(guān)的變量應(yīng)當(dāng)是 int 類型). invbool 類型顛倒了值, 所以真值變成 false, 反之亦然.

charp
一個(gè)字符指針值. 內(nèi)存為用戶提供的字串分配, 指針因此設(shè)置.

intlongshortuintulongushort
基本的變長(zhǎng)整型值. 以 u 開頭的是無(wú)符號(hào)值.

數(shù)組參數(shù), 用逗號(hào)間隔的列表提供的值, 模塊加載者也支持. 聲明一個(gè)數(shù)組參數(shù), 使用:


module_param_array(name,type,num,perm);

這里 name 是你的數(shù)組的名子(也是參數(shù)名), type 是數(shù)組元素的類型, num 是一個(gè)整型變量, perm 是通常的權(quán)限值. 如果數(shù)組參數(shù)在加載時(shí)設(shè)置, num 被設(shè)置成提供的數(shù)的個(gè)數(shù). 模塊加載者拒絕比數(shù)組能放下的多的值.

如果你確實(shí)需要一個(gè)沒有出現(xiàn)在上面列表中的類型, 在模塊代碼里有鉤子會(huì)允許你來定義它們; 任何使用它們的細(xì)節(jié)見 moduleparam.h. 所有的模塊參數(shù)應(yīng)當(dāng)給定一個(gè)缺省值; insmod 只在用戶明確告知它的時(shí)候才改變這些值. 模塊可檢查明顯的參數(shù), 通過對(duì)應(yīng)它們的缺省值檢查這些參數(shù).

最后的 module_param 字段是一個(gè)權(quán)限值; 你應(yīng)當(dāng)使用 <linux/stat.h> 中定義的值. 這個(gè)值控制誰(shuí)可以存取這些模塊參數(shù)在 sysfs 中的表示. 如果 perm 被設(shè)為 0, 就根本沒有 sysfs 項(xiàng). 否則, 它出現(xiàn)在 /sys/module[5] 下面, 帶有給定的權(quán)限. 使用 S_IRUGO 作為參數(shù)可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來改變參數(shù). 注意, 如果一個(gè)參數(shù)被 sysfs 修改, 你的模塊看到的參數(shù)值也改變了, 但是你的模塊沒有任何其他的通知. 你應(yīng)當(dāng)不要使模塊參數(shù)可寫, 除非你準(zhǔn)備好檢測(cè)這個(gè)改變并且因而作出反應(yīng).

[5] 然而, 在本書寫作時(shí), 有討論將參數(shù)移出 sysfs.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)