資源描述:
《Linux可加載內核模塊剖析》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、Linux可加載內核模塊剖析2.6內核透視圖簡介:Linux?可加載內核模塊(從內核的1.2版木開始引入)是Linux內核的最重要創(chuàng)新Z-o它們提供了可伸縮的、動態(tài)的內核。探索隱藏在可加載模塊后面的原理,并學習這些獨立的對象如何動態(tài)地轉換成Linux內核的一部分。Linux就是通常所說的單內核(monolithickernel),即操作系統(tǒng)的人部分功能都被稱為內孩;并在特權模式下運行。它與微型內核不同,后者只把基木的功能(進程間通信[IPC]、調度、基木的輸入/輸出[I/O]和內存管理)當作內核運行,而把其他功能(驅動程序、網絡堆棧和文件系統(tǒng))排除在特權空間
2、之外。因此,您可能認為Linux是一個完全靜態(tài)的內核,但事實恰恰相反。通過Linux內核模塊(LKM)可以在運行時動態(tài)地更改LinuxodeveloperWorksTim所著的其他剖析系列文章?Linuxflash文件系統(tǒng)咅lj析?Security-EnhancedLinux(SELinux)剖析?實時Linux架構剖析?LinuxSCSI子系統(tǒng)咅lj析?Linux文件系統(tǒng)剖析?Linux網絡棧剖析?Linux內核剖析?Linuxslab分配器剖析?Linux同步方法剖析?Tim所著的所有畀瞞……系列文章/T動,杏更攻是指可以將新的功能加載到內核、從內核去除
3、某個功能,甚至添加使用其他LKM的新LKMoLKM的優(yōu)點是可以最小化內核的內存占用,只加載需要的元素(這是嵌入式系統(tǒng)的重要特性)。Linux不是可以進行動態(tài)更改的惟一(也不是第一個)單內核。BerkeleySoftwareDistribution(BSD)的變體、SunSolaris>更老的內核(比如OpenVMS),以及其他流行的操作系統(tǒng)(比如Microsoft?Windows?和AppleMacOSX)都支持可加載模塊。剖析內核模塊LKM與直接編譯到內核或典型程序的元素有根本區(qū)別。典型的程序有一個main函數(shù),其中LKM包含entry和exit函數(shù)(在2
4、.6版本,您可以任意命名這些函數(shù))。當向內核插入模塊時,調用entry函數(shù),從內核刪除模塊時則調用exit函數(shù)。因為entry和exit函數(shù)是用戶定義的,所以存在module_init和module_exit宏,用于定義這些函數(shù)屬于哪種函數(shù)。LKM還包含一-組必姿的宏和一組可拡的宏,用于定義模塊的許可證、模塊的作者、模塊的描述等等。圖1提供了一個非常簡單的LKM的視圖。圖1.簡單LKM的源代碼視圖frincl^deUniili-cletinitMODULE_LICENSEInG?I.,r1;ModuleMODULE_AUTH
5、OR:''ModuleAuthor^);macrosMODULE_DESCRIPTIONI:;Stetict__initmod_?ntry_func:mid)j1returnD;JModulecontractor/hvoid?xit.mod^exit_func!void)idestructor1x?tuxtiJmodule^init(OKxi_en):Entry/exitmoduleexit(B?od_exlt_func);macros2.6版本的Linux內核提供了一個新的更簡單的方法,用于構建LKM。糙LKM時,可以使用典型的用戶工具管理模塊(盡管內部
6、己經改變):標準insmod(安裝LKM),rmmod(刪除LKM),modprobc(insmod和rmmod的包裝器),depmod(用于創(chuàng)建模塊依賴項),以及modinfo(用于為模塊宏查找值)。更多關于為2.6版本內核構建LKM的信息,請查看參考資料。回頁首剖析內核模塊對象LKM只不過是一個特殊的可執(zhí)行可鏈接格式(ExecutableandLinkableFormat,ELF)對象文件。通常,必須鏈接對象文件才能在可執(zhí)行文件屮解析它們的符號和結果。由于必須將LKM加載到內核后LKM才能解析符號,所以LKM仍然是一個ELF對象。您可以在LKM上使用標準
7、對象工具(在2.6版木屮,內核對象帶有后綴?ko,)。例如,如果在LKM上使用objdump實用工具,您將發(fā)現(xiàn)一些熟悉的區(qū)段(section),也口.方ext(說明)、?data。己初始化數(shù)據(jù))和?方ss(塊開始符號或未初始化數(shù)據(jù))。您還可以在模塊屮找到其他支持動態(tài)特性的區(qū)段。.init.text區(qū)段包含modulc_init代碼,?exit,text區(qū)段包含module_exit代碼(參見圖2)o.modinfo區(qū)段包含各種表示模塊許可證、作聶和描述等的宏文本。了解LKM的基礎知識之后,現(xiàn)在我們進一步探索模塊是如何進入內核的,以及在內核內部是如何管理模塊的
8、。回頁首LKM的生命周期在用戶空間屮,insmod(