天天看點

Linux子產品程式設計系列之二 熟悉特定的宏

這些宏定義在<linux/module.h>下

MODULE_AUTHOR(name)

定義驅動的程式設計者,name為string

MODULE_LICENSE(license)

定義驅動的license,一般為GPL,或相關公司的license

MODULE_DESCRIPTION(desc)

對驅動程式的描述,string

MODULE_SUPPORTED_DEVICE(name)

驅動程式所支援的裝置,string

MODULE_PARM(var,type)

提供在運作時通過控制台将參數傳遞給子產品 (在insmod時)

如果我們想用這個宏來傳遞指令行參數,那麼在我們的子產品中定義一個全局變量.在insmod子產品時,便可以用參數的形式,将具體的實參傳遞給子產品中的那個全局變量.

MODULE_PARM(name,type)有兩個參數,一個是這個全局變量的名稱,另一個是這個全局變量的類型.

而他的類型有一下幾種:

b:比特型

h:短整型

i:整型

l:長整型

s:字元串型

在傳遞字元串型的參數時,這個全局變量需要在子產品中用Char *來聲明!insmod會自動為其配置設定記憶體空間.

例如:

int a = 3;

char *st;

MODULE_PARM(a,”i”);

MODULE_PARM(st,”s”);

在insmod是我們加這樣的參數:

insmode a.o “a = 3″, “st = hello world”

這裡最重要的是,MODULE_PARM()也支援我們最常用的數組類型.用短線’-'把兩個數字分開,分别表示數組參數中的最小位數和最大位數.例如:

int array[8];

MODULE_PARM(array,”1-8i”);

在指令行我們使用加這樣的參數:

insmod a.o “array = 38745,123,4000″

在那和子產品程式設計時,我們往往給這些全局變量以預設值,如果我們才insmod時沒有傳入參數時,子產品會使用這些預設值,而如果我們傳入參數時,這些預設值便被覆寫掉.

MODULE_PARM_DESC(var,desc)

對變量的描述

GPL_HEADER()

THIS_MODULE

指向全局變量 __this_module (struct module)的指針

系統對每個子產品維護一個usage counter,以便決定何時可以安全的解除安裝子產品

下面的宏用來對該usage counter操作,usage counter可以通過/proc/modules

檔案檢視

MOD_INC_USE_COUNT 

MOD_DEC_USE_COUNT

MOD_IN_USE

MODULE_DEVICE_TABLE

EXPORT_SYMTAB

預處理宏,當在程式中用EXPORT_SYMBOL等宏時需要定義該宏。例如,可以在Makefile中定義:-DEXPORT_SYMTAB

__EXPORT_SYMBOL(sym,str)

EXPORT_SYMBOL(var)

EXPORT_SYMBOL_NOVERS(var)

導出一個符合到核心符号表,導出後,該符合可以供其他子產品使用。這個宏有助于編寫驅動程式時清楚的劃分出層次。可以通過/proc/ksyms檔案或ksyms指令檢視核心符号表。EXPORT_SYMBOL_NOVERS(var),導出是不帶版本資訊。在使用該宏時,需定義

EXPORT_SYMBOL_GPL(var)

EXPORT_NO_SYMBOLS

顯示指出,該子產品不向核心符合表導出符号

SET_MODULE_OWNER 

繼續閱讀