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