一,內核模塊的概念
經常在內核驅動代碼看到類似fs_init()等驅動初始化函數,那么這個和module_init()函數的差別在哪里,宏定義__define_initcall(level,fn)對于內核的初始化很重要,他指示編譯器在編譯的時候,將一系列初始化函數的起始地址值按照一定的順序放在一個section中。在內核初始化段,do_initcalls() 將按順序從該section中以函數指針的形式取出這些函數的起始地址,來依次完成相應的初始化。于內核某些部分的初始化需要依賴于其他某些部分的初始化的完成,因此這個順序排列常常很重要
點擊打開鏈接
其中module_init()對應的是如下的device_initcall(fn)
- 189?#define?core_initcall(fn)???????????????__define_initcall("1",fn,1)??
- 190?#define?core_initcall_sync(fn)??????????__define_initcall("1s",fn,1s)??
- 191?#define?postcore_initcall(fn)???????????__define_initcall("2",fn,2)??
- 192?#define?postcore_initcall_sync(fn)??????__define_initcall("2s",fn,2s)??
- 193?#define?arch_initcall(fn)???????????????__define_initcall("3",fn,3)??
- 194?#define?arch_initcall_sync(fn)??????????__define_initcall("3s",fn,3s)??
- 195?#define?subsys_initcall(fn)?????????????__define_initcall("4",fn,4)??
- 196?#define?subsys_initcall_sync(fn)????????__define_initcall("4s",fn,4s)??
- 197?#define?fs_initcall(fn)?????????????????__define_initcall("5",fn,5)??
- 198?#define?fs_initcall_sync(fn)????????????__define_initcall("5s",fn,5s)??
- 199?#define?rootfs_initcall(fn)?????????????__define_initcall("rootfs",fn,rootfs)??
- 200?#define?device_initcall(fn)?????????????__define_initcall("6",fn,6)??
- 201?#define?device_initcall_sync(fn)????????__define_initcall("6s",fn,6s)??
- 202?#define?late_initcall(fn)???????????????__define_initcall("7",fn,7)??
- 203?#define?late_initcall_sync(fn)??????????__define_initcall("7s",fn,7s)??
- ??
- 170?#define?__define_initcall(level,fn,id)?\??
- 171?????????static?initcall_t?__initcall_##fn##id?__used?\??
- 172?????????__attribute__((__section__(".initcall"?level?".init")))?=?fn??
?二,內核模塊和應用程序之間的差別
1,應用程序可以使用一些庫函數,而內核模塊只能使用內核其它模塊導出的一些函數
2,處理錯誤的方式不一樣。
3,應用程序是從頭到尾執行單個任務,而模塊是預先注冊自己以便服務于將來某個請求。
三,構建內核模塊
構建hello.ko模塊 obj-m := hello.o
構建module.ko模塊,并由兩個源文件生成(file1.c和file2.c)
- obj-m?:=?module.o??
- module-objs?:=?file1.o?file2.o??
?
四,模塊操作相關的命令
insmod:裝載一個模塊
modprobe:裝載一個模塊,同時檢查模塊是否引用了一些當前內核不存在的符合,如果有,modprobe會在當前模塊搜索路徑中查找定義了這些符合的其它模塊并加載
rmmod,卸載一個模塊。
五,模塊之間的引用
將一個模塊的函數或者變量導出讓其它模塊可以使用
- EXPORT_SYMBOL(name);??
- EXPORT_SYMBOL_GPL(name);??//導出的模塊只能被GPL許可證下的模塊使用??
六,模塊參數
insmod hello howmany=10 whom="Mom"
在hello.c的驅動程序中
?
?
- static?char*whom="world"??
- static?int?howmany=1;??
- module_param(howmany,int,S_IRUGO);??
- module_param(whom,charp,S_IRUGO)