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