Linux操作系統(tǒng)的模塊全面詳解
Linux操作系統(tǒng)的模塊全面詳解
Linux操作系統(tǒng)中模塊的概念想必很多人都不太了解。下面由學習啦小編為大家整理了Linux操作系統(tǒng)的模塊全面詳解,希望對大家有幫助!
Linux操作系統(tǒng)的模塊全面詳解一、模塊簡介
Windows NT是一種微內(nèi)核的結構,其內(nèi)核的功能塊被劃分成獨立的模塊,在這些功能塊之間有嚴格的通信機制;而Linux則不同,它是一種monolithic(單一大塊)結構,也就是說,整個內(nèi)核是一個單獨的、非常大的程序。在這種結構中,部件的添加和刪除都相當麻煩,需要重新編譯內(nèi)核。為了解決這個問題,不知道從哪個版本的內(nèi)核開始,Linux引入了一種稱為module(模塊)的技術,可以把某些功能代碼作為模塊動態(tài)裝載到內(nèi)核中使用。
模塊是一種目標對象文件,需要在內(nèi)核空間執(zhí)行,可以把它看作是一組已經(jīng)編譯好而且已經(jīng)鏈接成可執(zhí)行文件的程序。在需要的時候,內(nèi)核就會實用某種方法調(diào)用這些程序來執(zhí)行特定的操作,實現(xiàn)特定的功能。內(nèi)核在內(nèi)核符號表中維護了一個模塊的鏈表,每個符號表對應一個模塊,在把模塊加載進內(nèi)核時正確地對其進行解釋,并將模塊作為內(nèi)核的一部分來執(zhí)行;加載進內(nèi)核中的模塊具有所有的內(nèi)核權限。模塊可以在系統(tǒng)啟動時加載到系統(tǒng)中,也可以在系統(tǒng)運行的任何時刻加載;在不需要時,可以將模塊動態(tài)卸載。這樣就不用每次修改系統(tǒng)的配置時都要重新編譯內(nèi)核了。
Linux操作系統(tǒng)的模塊全面詳解二、模塊的優(yōu)缺點
內(nèi)核模塊的這種動態(tài)裝載特性具有以下的優(yōu)點:
1、可以把內(nèi)核映像文件保持在最小。在編譯內(nèi)核時可以選擇把一部分內(nèi)容當成模塊進行編譯,這樣在最終生成的內(nèi)核映像文件中就可以不包含這部分內(nèi)容,從而生成最小的內(nèi)核映像文件。
2、靈活性好。如果需要實用新的模塊,不必重新編譯內(nèi)核,只要把新的模塊編譯后裝載進系統(tǒng)中就可以了。如果對內(nèi)核源程序進行了修改,也不需要重新編譯整個內(nèi)核,只需要修改對應的部分就可以了。
但是,內(nèi)核模塊的引入也帶來了一些問題:
1、這種動態(tài)加載的特性不利于系統(tǒng)的性能和內(nèi)存的利用,會帶來負面的影響。
2、裝入內(nèi)核的模塊和其他內(nèi)核部分一樣具有最高的權限,使用不當就可能引起系統(tǒng)的崩潰。
3、內(nèi)核版本和模塊版本的不兼容也會導致系統(tǒng)的崩潰,因此必須進行嚴格的版本檢查,這樣就使模塊的編寫變得更加復雜了。
4、有些模塊要使用其他模塊(例如VFAT就要使用FAT)的內(nèi)容,模塊之間存在一定的依賴關系,這樣模塊的實用就復雜化了。
由于模塊的這種動態(tài)裝載/卸載的特性,在Linux中大部分設備驅(qū)動程序都是使用模塊來編寫的,例如文件系統(tǒng)(minix、msdos、isofs、smbms、nfs、proc等等)、SCSI設備驅(qū)動程序、以太網(wǎng)驅(qū)動程序、CD-ROM驅(qū)動程序等等。下面讓我們介紹一下模塊的使用方法。
Linux操作系統(tǒng)的模塊全面詳解三、模塊的使用
1、模塊的查詢
我們可以使用lsmod命令來了解系統(tǒng)中現(xiàn)在裝載進來了哪些模塊。例如,在筆者機器上執(zhí)行的結果為(注意,以下介紹的這些命令(包括lsmod)只有超級用戶才可以執(zhí)行):
Module Size Used by
lockd 30344 1 (autoclean)
sunrpc 52132 1 (autoclean) [lockd]
rtl8139 11748 1 (autoclean)
其中Module列是模塊的名字,Size是顯示的模塊的大小,Used by列表示引用次數(shù),圓括號中的autoclean表示該模塊可以在空閑時自動卸載,中括號中的[lockd]表示模塊lockd會引用sunrpc模塊的內(nèi)容。
2、模塊的裝載
模塊的裝載有兩種方法:一種是實用insmod命令手工加載模塊,第二種方法是使用內(nèi)核守護進程kerneld在需要的時候動態(tài)裝載。insmod命令的格式為:
insmod //modulename.o
值得注意的是,insmod命令需要知道模塊存放的位置,這樣才能在內(nèi)核符號表中進行解析。模塊可以位于當前路徑中,也可以在insmod命令中指明絕對路徑,另外還有幾個相關的配置文件可以說明模塊的位置(見后文中的介紹)。
kerneld是一個標準的守護進程,具有超級用戶的權限,其主要功能是加載和卸載核心模塊, 但是它還可以執(zhí)行其他任務, 如通過串行線路建立PPP連接并在適當時候關閉它。kerneld自身并不執(zhí)行這些任務,它通過某些程序如insmod來做此工作。它只是內(nèi)核的代理,為內(nèi)核進行調(diào)度。這個守護進程僅僅是一個帶有超級用戶權限的普通用戶進程。當系統(tǒng)啟動時它也被啟動并為內(nèi)核打開了一個進程間通訊(IPC)通道,內(nèi)核需要執(zhí)行各種任務時就實用這個IPC來向kerneld發(fā)送消息。例如,如果內(nèi)核請求現(xiàn)在還沒有裝載到系統(tǒng)中的文件系統(tǒng),那么就通知kerneld裝載這個文件系統(tǒng),然后內(nèi)核就可以使用這個文件系統(tǒng)了。在模塊空閑時(即沒有其他進程使用這個模塊時),kerneld還可以動態(tài)卸載這個模塊。
需要注意的是,如果模塊之間有某種引用關系,那么裝載模塊時必須遵循一定的次序。例如,上面lsmod顯示的結果中l(wèi)ockd模塊要引用sunrpc的內(nèi)容,那么必須首先裝載sunrpc之后才能裝載lockd,否則就會出錯。
3、模塊的卸載
我們可以使用rmmod命令把模塊從系統(tǒng)中卸載出去,該命令的格式為:
rmmod modulename