資源描述:
《linux內(nèi)核模塊設(shè)計(jì)課件》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、Linux2.6內(nèi)核模塊設(shè)計(jì)www.gec-edu.org內(nèi)核模塊概述Linux內(nèi)核是整體式結(jié)構(gòu),各個(gè)子系統(tǒng)聯(lián)系緊密,作為一個(gè)大程序在內(nèi)核空間運(yùn)行。內(nèi)核模塊概述太多的設(shè)備驅(qū)動(dòng)和內(nèi)核功能集成在內(nèi)核中,內(nèi)核過(guò)于龐大。如何解決?Linux內(nèi)核引入內(nèi)核模塊機(jī)制。通過(guò)動(dòng)態(tài)加載內(nèi)核模塊,使得在運(yùn)行過(guò)程中擴(kuò)展內(nèi)核的功能。不需要的時(shí)候,卸載該內(nèi)核模塊。內(nèi)核模塊概述什么是內(nèi)核模塊??jī)?nèi)核模塊是一種沒(méi)有經(jīng)過(guò)鏈接,不能獨(dú)立運(yùn)行的目標(biāo)文件,是在內(nèi)核空間中運(yùn)行的程序。經(jīng)過(guò)鏈接裝載到內(nèi)核里面成為內(nèi)核的一部分,可以訪問(wèn)內(nèi)核的公用符號(hào)(函數(shù)和變量)。內(nèi)核模塊可以讓操作系統(tǒng)內(nèi)核在需要時(shí)載入和執(zhí)行,在不需要時(shí)由操
2、作系統(tǒng)卸載。它們擴(kuò)展了操作系統(tǒng)內(nèi)核的功能卻不需要重新啟動(dòng)系統(tǒng)。如果沒(méi)有內(nèi)核模塊,我們不得不一次又一次重新編譯生成單內(nèi)核操作系統(tǒng)的內(nèi)核鏡像來(lái)加入新的功能。這還意味著一個(gè)臃腫的內(nèi)核。內(nèi)核模塊概述模塊機(jī)制的優(yōu)點(diǎn):減小內(nèi)核映像尺寸,增加系統(tǒng)靈活性;節(jié)省開(kāi)發(fā)時(shí)間;修改內(nèi)核,不必重新編譯整個(gè)內(nèi)核。模塊的目標(biāo)代碼一旦被鏈入內(nèi)核,作用和靜態(tài)鏈接的內(nèi)核目標(biāo)代碼完全等價(jià)。模塊機(jī)制的缺點(diǎn):對(duì)系統(tǒng)性能有一定損失;使用不當(dāng)時(shí)會(huì)導(dǎo)致系統(tǒng)崩潰;內(nèi)核模塊概述內(nèi)核模塊是如何被調(diào)入內(nèi)核工作的?當(dāng)操作系統(tǒng)內(nèi)核需要的擴(kuò)展功能不存在時(shí),內(nèi)核模塊管理守護(hù)進(jìn)程kmod執(zhí)行modprobe去加載內(nèi)核模塊。modprobe遍
3、歷文件/lib/modules/$(version)/modules.dep來(lái)判斷是否有其它內(nèi)核模塊需要在該模塊加載前被加載。最后modprobe調(diào)用insmod先加載被依賴的模塊,然后加載該被內(nèi)核要求的模塊。內(nèi)核模塊概述內(nèi)核模塊的卸載當(dāng)我們不需要內(nèi)核模塊了,為了減少系統(tǒng)資源的開(kāi)銷(xiāo),需要卸載時(shí)使用命令#rmmodmodule_name或者#modprobe–rmodule_name查看系統(tǒng)已經(jīng)加載的模塊,使用命令#lsmod實(shí)驗(yàn):HelloWorld模塊步驟:新建模塊目錄用編輯器(vi)編輯源文件用編輯器編輯Makefile在內(nèi)核源碼樹(shù)外編譯把模塊加到內(nèi)核源碼樹(shù)并把配置信息同
4、時(shí)加入實(shí)驗(yàn):HelloWorld模塊#include//formodule_init()#include//mustbeinclude#include//forprintk()staticint__inithello_init(void){printk(“Helloworld”);return0;}staticvoid__exithello_exit(void){printk(“Hellomoduleexit”);}module_init(hello_init);module_
5、exit(hello_exit);MODULE_LICENSE(“GPL”);MODULE_AUTHOR(“hsq”);實(shí)驗(yàn):HelloWorld模塊說(shuō)明:1)模塊入口函數(shù)為hello_init(),由module_init()宏指定,在模塊被加載的時(shí)候被調(diào)用向系統(tǒng)注冊(cè),就象應(yīng)用程序的main()一樣,主要來(lái)完成模塊的初始化工作2)入口函數(shù)的返回值為0表示成功,非0表示失敗3)模塊的退出函數(shù)為hello_exit(),由module_exit()宏指定,在模塊被卸載是被調(diào)用向系統(tǒng)注銷(xiāo),主要來(lái)完成資源的清理工作,它被調(diào)用完畢后,就模塊就被內(nèi)核清除了4)一個(gè)模塊最少需要有入口和退
6、出函數(shù)實(shí)驗(yàn):HelloWorld模塊說(shuō)明:關(guān)于__init和__exit宏如果該模塊被編譯進(jìn)內(nèi)核,而不是動(dòng)態(tài)加載,則宏__init的使用會(huì)在初始化完成后丟棄該函數(shù)并收回所占內(nèi)存。如果該模塊被編譯進(jìn)內(nèi)核,宏__exit將忽略“清理收尾”的函數(shù)。這些宏在頭文件linux/init.h定義,用來(lái)釋放內(nèi)核占用的內(nèi)存。例如啟動(dòng)時(shí)看到的信息“Freeingunusedkernelmemory:236kfreed”,正是內(nèi)核釋放這些函數(shù)所占用空間時(shí)的打印信息。實(shí)驗(yàn):HelloWorld模塊printk()函數(shù)printk函數(shù)在Linux內(nèi)核中定義并且對(duì)模塊可用,為內(nèi)核提供日志功能,記錄內(nèi)核
7、信息或用來(lái)給出警告。與標(biāo)準(zhǔn)C庫(kù)函數(shù)printf的行為相似。每個(gè)printk()聲明都會(huì)帶一個(gè)優(yōu)先級(jí)。內(nèi)核總共定義了八個(gè)優(yōu)先級(jí)的宏,在linux/kernel.h中定義。若你不指明優(yōu)先級(jí),DEFAULT_MESSAGE_LOGLEVEL這個(gè)默認(rèn)優(yōu)先級(jí)將被采用。信息添加到文件/var/log/messages,可直接查看,或者用命令dmesg查看。在X-windows下的終端insmod一個(gè)模塊,日志信息只會(huì)記錄在日志文件中,而不在終端打印。實(shí)驗(yàn):HelloWorld模塊寫(xiě)內(nèi)核程序需要注意:實(shí)驗(yàn):Hello