這些巨集定義在下
module_author(name)
定義驅動的程式設計者,name為string
module_license(license)
定義驅動的license,一般為gpl,或相關公司的license
module_description(desc)
對驅動程式的描述,string
module_supported_device(name)
驅動程式所支援的裝置,string
module_parm(var,type)
提供在執行時通過控制台將引數傳遞給模組(在
in**od時)
如果我們想用這個巨集來傳遞命令列引數
,那麼在我們的模組中定義乙個全域性變數.在
in**od
模組時,
便可以用引數的形式
,將具體的實參傳遞給模組中的那個全域性變數
.module_parm(name,type)
有兩個引數
,乙個是這個全域性變數的名稱
,另乙個是這個全域性變數的型別
.而他的型別有一下幾種:b:
位元型h:
短整型i:
整型l:
長整型s:
字串型
在傳遞字串型的引數時
,這個全域性變數需要在模組中用
char *
來宣告!in**od
會自動為其分配記憶體空間.例如
:int a = 3;
char *st;
module_parm(a,」i」);
module_parm(st,」s」);
在in**od
是我們加這樣的引數
:in**ode a.o 「a = 3″, 「st = hello world」
這裡最重要的是
,module_parm()
也支援我們最常用的陣列型別
.用**
』-'把兩個數字分開
,分別表示陣列引數中的最小位數和最大位數.例如
:int array[8];
module_parm(array,」1-8i」);
在命令列我們使用加這樣的引數
:in**od a.o 「array = 38745,123,4000″
在那和模組程式設計時,我們往往給這些全域性變數以預設值,如果我們才in**od時沒有傳入引數時,模組會使用這些預設值,而如果我們傳入引數時,這些預設值便被覆蓋掉.
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
核心模組程式設計入門之二
模組程式設計屬於核心程式設計,因此,除了對核心相關知識有所了解外,還需要了解與模組相關的知識。1 應用程式與核心模組的比較 為了加深對核心模組的了解,表一給出應用程式與核心模組程式的比較。表一 應用程式與核心模組程式的比較 c語言應用程式 核心模組程式 使用函式 libc庫 核心函式 執行空間 使用...
給Linux新手 系列之二
ok,你的第乙個問題是 什麼是linux,它和unix有什麼區別?問這個問題的原因呢,多半是你還在大一的時候一次去實驗室,看到高年紀學生在乙個特大螢幕的機器上作題,你羨慕的看著他,問 這是什麼計算機啊,這麼高階?而他不無驕傲的說,這是unix 後來 多了,知道那是sun工作站,上面執行著solari...
hibernate系列之二
首先先介紹一下持久化 持久化 將程式資料在持久狀態和瞬時狀態間轉換的機制 即將記憶體的資料永久存在關係型資料庫中 持久化類的編寫規則 持久化類需要提供無參構造方法 持久化類的屬性需要私有,對私有的屬性提供get set方法 持久化類的屬性盡量使用包裝類的型別 持久化類要有乙個唯一標識oid與表的主鍵...