Linux驅動程序中比較重要的宏

MODULE_DEVICE_TABLE (usb, skel_table);
         該宏生成一個名爲__mod_pci_device_table的局部變量,該變量指向第二個參數內核構建時,depmod程序會在所有模塊中搜索符號__mod_pci_device_table,把數據(設備列表)從模塊中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/modules.pcimap中,當depmod結束之後,所有的PCI設備連同他們的模塊名字都被該文件列出。當內核告知熱插拔系統一個新的PCI設備被發現時,熱插拔系統使用modules.pcimap文件來找尋恰當的驅動程序  

        MODULE_DEVICE_TABLE的第一個參數是設備的類型,如果是USB設備,那自然是usb(如果是PCI設備,那將是pci,這兩個子系統用同一個宏來註冊所支持的設備)。後面一個參數是設備表,這個設備表的最後一個元素是空的,用於標識結束。例:假如代碼定義了USB_SKEL_VENDOR_ID是 0xfff0,USB_SKEL_PRODUCT_ID是0xfff0,也就是說,當有一個設備接到集線器時,usb子系統就會檢查這個設備的 vendor ID和product ID,如果他們的值是0xfff0時,那麼子系統就會調用這個模塊作爲設備的驅動。

       

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

MODULE_AUTHOR(name) 

定義驅動的編程者,namestring

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章