生活随笔
收集整理的這篇文章主要介紹了
[linux驱动]linux驱动模块
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一,內(nèi)核模塊的概念
經(jīng)常在內(nèi)核驅(qū)動代碼看到類似fs_init()等驅(qū)動初始化函數(shù),那么這個和module_init()函數(shù)的差別在哪里,宏定義__define_initcall(level,fn)對于內(nèi)核的初始化很重要,他指示編譯器在編譯的時候,將一系列初始化函數(shù)的起始地址值按照一定的順序放在一個section中。在內(nèi)核初始化段,do_initcalls() 將按順序從該section中以函數(shù)指針的形式取出這些函數(shù)的起始地址,來依次完成相應(yīng)的初始化。于內(nèi)核某些部分的初始化需要依賴于其他某些部分的初始化的完成,因此這個順序排列常常很重要
點擊打開鏈接
其中module_init()對應(yīng)的是如下的device_initcall(fn)
[cpp]?view plaincopy
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??
?二,內(nèi)核模塊和應(yīng)用程序之間的差別
1,應(yīng)用程序可以使用一些庫函數(shù),而內(nèi)核模塊只能使用內(nèi)核其它模塊導(dǎo)出的一些函數(shù)
2,處理錯誤的方式不一樣。
3,應(yīng)用程序是從頭到尾執(zhí)行單個任務(wù),而模塊是預(yù)先注冊自己以便服務(wù)于將來某個請求。
三,構(gòu)建內(nèi)核模塊
構(gòu)建hello.ko模塊 obj-m := hello.o
構(gòu)建module.ko模塊,并由兩個源文件生成(file1.c和file2.c)
[cpp]?view plaincopy
obj-m?:=?module.o??module-objs?:=?file1.o?file2.o?? ?
四,模塊操作相關(guān)的命令
insmod:裝載一個模塊
modprobe:裝載一個模塊,同時檢查模塊是否引用了一些當前內(nèi)核不存在的符合,如果有,modprobe會在當前模塊搜索路徑中查找定義了這些符合的其它模塊并加載
rmmod,卸載一個模塊。
五,模塊之間的引用
將一個模塊的函數(shù)或者變量導(dǎo)出讓其它模塊可以使用
[cpp]?view plaincopy
EXPORT_SYMBOL(name);??EXPORT_SYMBOL_GPL(name);??
六,模塊參數(shù)
insmod hello howmany=10 whom="Mom"
在hello.c的驅(qū)動程序中
?
?
[cpp]?view plaincopy
static?char*whom="world"??static?int?howmany=1;??module_param(howmany,int,S_IRUGO);??module_param(whom,charp,S_IRUGO)
轉(zhuǎn)載于:https://www.cnblogs.com/zhiliao112/p/4237209.html
總結(jié)
以上是生活随笔為你收集整理的[linux驱动]linux驱动模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。