資源描述:
《linux驅(qū)動程序編寫基礎(chǔ).ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Linux操作系統(tǒng)分析與實踐第七講:Linux驅(qū)動程序編寫基礎(chǔ)《Linux操作系統(tǒng)分析與實踐》課程建設(shè)小組北京大學二零零八年春季*致謝:感謝Intel對本課程項目的資助本講主要內(nèi)容Linux內(nèi)核模塊中斷和中斷處理下半部Linux內(nèi)核模塊Linux操作系統(tǒng)的內(nèi)核是單一體系結(jié)構(gòu)(monolithickernel)有了模塊機制后,提高Linux操作系統(tǒng)的可擴充性,內(nèi)核編程不再是一個惡夢什么是模塊呢?模塊的全稱是“動態(tài)可加載內(nèi)核模塊”(LoadableKernelModule,LKM)模塊在內(nèi)核空間運行模塊實際上是一種目標對
2、象文件沒有鏈接,不能獨立運行,但是其代碼可以在運行時鏈接到系統(tǒng)中作為內(nèi)核的一部分運行或從內(nèi)核中取下,從而可以動態(tài)擴充內(nèi)核的功能這種目標代碼通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成Linux內(nèi)核模塊的優(yōu)點與缺點優(yōu)點使得內(nèi)核更加緊湊和靈活修改內(nèi)核時,不必全部重新編譯整個內(nèi)核。系統(tǒng)如果需要使用新模塊,只要編譯相應(yīng)的模塊,然后使用insmod將模塊裝載即可模塊的目標代碼一旦被鏈接到內(nèi)核,它的作用域和靜態(tài)鏈接的內(nèi)核目標代碼完全等價缺點由于內(nèi)核所占用的內(nèi)存是不會被換出的,所以鏈接進內(nèi)核的模塊會給整個系統(tǒng)帶來一定的性能和內(nèi)存利用方面的損失;裝
3、入內(nèi)核的模塊就成為內(nèi)核的一部分,可以修改內(nèi)核中的其他部分,因此,模塊的使用不當會導致系統(tǒng)崩潰;為了讓內(nèi)核模塊能訪問所有內(nèi)核資源,內(nèi)核必須維護符號表,并在裝入和卸載模塊時修改符號表;模塊會要求利用其它模塊的功能,所以,內(nèi)核要維護模塊之間的依賴性.Linux內(nèi)核模塊與應(yīng)用程序的區(qū)別C語言程序Linux內(nèi)核模塊運行用戶空間內(nèi)核空間入口main()module_init()指定;出口無module_exit()指定;編譯gcc–cMakefile連接ldinsmod運行直接運行insmod調(diào)試gdbkdbug,kdb,kgd
4、b等模塊相關(guān)命令insmod[moduleparameters]Loadthemodule注意,只有超級用戶才能使用這個命令RmmodUnloadthemodulelsmodListallmodulesloadedintothekernel這個命令和cat/proc/modules等價modprobe[-r]–Loadthemodulespecifiedandmodulesitdepends模塊依賴一個模塊A引用另一個模塊B所導出的符號,我們就說模塊B被模塊A引用。如果要
5、裝載模塊A,必須先要裝載模塊B。否則,模塊B所導出的那些符號的引用就不可能被鏈接到模塊A中。這種模塊間的相互關(guān)系就叫做模塊依賴。最簡單的內(nèi)核模塊例子#include#include#includestaticint__inithello_init(void){printk(KERN_INFO"Helloworld");return0;}staticvoid__exithello_exit(void){printk(KERN
6、_INFO"Goodbyeworld");}module_init(hello_init);module_exit(hello_exit);staticint__inithello_init(void)staticvoid__exithello_exit(void)Static聲明,因為這種函數(shù)在特定文件之外沒有其它意義__init標記,該函數(shù)只在初始化期間使用。模塊裝載后,將該函數(shù)占用的內(nèi)存空間釋放__exit標記該代碼僅用于模塊卸載。Init/exit宏:module_init/module_exit聲明模塊
7、初始化及清除函數(shù)所在的位置裝載和卸載模塊時,內(nèi)核可以自動找到相應(yīng)的函數(shù)module_init(hello_init);module_exit(hello_exit);編譯內(nèi)核模塊Makefile文件obj-m:=hello.oall:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)modulesclean:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)cleanModuleincludesmorefi
8、lesobj-m:=hello.ohello-objs:=a.ob.o裝載和卸載模塊相關(guān)命令lsmodinsmodhello.kormmodhello.ko模塊參數(shù)傳遞有些模塊需要傳遞一些參數(shù)參數(shù)在模塊加載時傳遞#insmodhello.kotest=2參數(shù)需要使用module_param宏來聲明module_param的參數(shù):變量名稱,類型以