學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > 操作系統(tǒng)基礎(chǔ)知識(shí) > Linux操作系統(tǒng)的模塊全面詳解

Linux操作系統(tǒng)的模塊全面詳解

時(shí)間: 佳洲1085 分享

Linux操作系統(tǒng)的模塊全面詳解

  Linux操作系統(tǒng)中模塊的概念想必很多人都不太了解。下面由學(xué)習(xí)啦小編為大家整理了Linux操作系統(tǒng)的模塊全面詳解,希望對(duì)大家有幫助!

  Linux操作系統(tǒng)的模塊全面詳解一、模塊簡(jiǎn)介

  Windows NT是一種微內(nèi)核的結(jié)構(gòu),其內(nèi)核的功能塊被劃分成獨(dú)立的模塊,在這些功能塊之間有嚴(yán)格的通信機(jī)制;而Linux則不同,它是一種monolithic(單一大塊)結(jié)構(gòu),也就是說(shuō),整個(gè)內(nèi)核是一個(gè)單獨(dú)的、非常大的程序。在這種結(jié)構(gòu)中,部件的添加和刪除都相當(dāng)麻煩,需要重新編譯內(nèi)核。為了解決這個(gè)問(wèn)題,不知道從哪個(gè)版本的內(nèi)核開(kāi)始,Linux引入了一種稱(chēng)為module(模塊)的技術(shù),可以把某些功能代碼作為模塊動(dòng)態(tài)裝載到內(nèi)核中使用。

  模塊是一種目標(biāo)對(duì)象文件,需要在內(nèi)核空間執(zhí)行,可以把它看作是一組已經(jīng)編譯好而且已經(jīng)鏈接成可執(zhí)行文件的程序。在需要的時(shí)候,內(nèi)核就會(huì)實(shí)用某種方法調(diào)用這些程序來(lái)執(zhí)行特定的操作,實(shí)現(xiàn)特定的功能。內(nèi)核在內(nèi)核符號(hào)表中維護(hù)了一個(gè)模塊的鏈表,每個(gè)符號(hào)表對(duì)應(yīng)一個(gè)模塊,在把模塊加載進(jìn)內(nèi)核時(shí)正確地對(duì)其進(jìn)行解釋?zhuān)⒛K作為內(nèi)核的一部分來(lái)執(zhí)行;加載進(jìn)內(nèi)核中的模塊具有所有的內(nèi)核權(quán)限。模塊可以在系統(tǒng)啟動(dòng)時(shí)加載到系統(tǒng)中,也可以在系統(tǒng)運(yùn)行的任何時(shí)刻加載;在不需要時(shí),可以將模塊動(dòng)態(tài)卸載。這樣就不用每次修改系統(tǒng)的配置時(shí)都要重新編譯內(nèi)核了。

  Linux操作系統(tǒng)的模塊全面詳解二、模塊的優(yōu)缺點(diǎn)

  內(nèi)核模塊的這種動(dòng)態(tài)裝載特性具有以下的優(yōu)點(diǎn):

  1、可以把內(nèi)核映像文件保持在最小。在編譯內(nèi)核時(shí)可以選擇把一部分內(nèi)容當(dāng)成模塊進(jìn)行編譯,這樣在最終生成的內(nèi)核映像文件中就可以不包含這部分內(nèi)容,從而生成最小的內(nèi)核映像文件。

  2、靈活性好。如果需要實(shí)用新的模塊,不必重新編譯內(nèi)核,只要把新的模塊編譯后裝載進(jìn)系統(tǒng)中就可以了。如果對(duì)內(nèi)核源程序進(jìn)行了修改,也不需要重新編譯整個(gè)內(nèi)核,只需要修改對(duì)應(yīng)的部分就可以了。

  但是,內(nèi)核模塊的引入也帶來(lái)了一些問(wèn)題:

  1、這種動(dòng)態(tài)加載的特性不利于系統(tǒng)的性能和內(nèi)存的利用,會(huì)帶來(lái)負(fù)面的影響。

  2、裝入內(nèi)核的模塊和其他內(nèi)核部分一樣具有最高的權(quán)限,使用不當(dāng)就可能引起系統(tǒng)的崩潰。

  3、內(nèi)核版本和模塊版本的不兼容也會(huì)導(dǎo)致系統(tǒng)的崩潰,因此必須進(jìn)行嚴(yán)格的版本檢查,這樣就使模塊的編寫(xiě)變得更加復(fù)雜了。

  4、有些模塊要使用其他模塊(例如VFAT就要使用FAT)的內(nèi)容,模塊之間存在一定的依賴關(guān)系,這樣模塊的實(shí)用就復(fù)雜化了。

  由于模塊的這種動(dòng)態(tài)裝載/卸載的特性,在Linux中大部分設(shè)備驅(qū)動(dòng)程序都是使用模塊來(lái)編寫(xiě)的,例如文件系統(tǒng)(minix、msdos、isofs、smbms、nfs、proc等等)、SCSI設(shè)備驅(qū)動(dòng)程序、以太網(wǎng)驅(qū)動(dòng)程序、CD-ROM驅(qū)動(dòng)程序等等。下面讓我們介紹一下模塊的使用方法。

  Linux操作系統(tǒng)的模塊全面詳解三、模塊的使用

  1、模塊的查詢

  我們可以使用lsmod命令來(lái)了解系統(tǒng)中現(xiàn)在裝載進(jìn)來(lái)了哪些模塊。例如,在筆者機(jī)器上執(zhí)行的結(jié)果為(注意,以下介紹的這些命令(包括lsmod)只有超級(jí)用戶才可以執(zhí)行):

  Module Size Used by

  lockd 30344 1 (autoclean)

  sunrpc 52132 1 (autoclean) [lockd]

  rtl8139 11748 1 (autoclean)

  其中Module列是模塊的名字,Size是顯示的模塊的大小,Used by列表示引用次數(shù),圓括號(hào)中的autoclean表示該模塊可以在空閑時(shí)自動(dòng)卸載,中括號(hào)中的[lockd]表示模塊lockd會(huì)引用sunrpc模塊的內(nèi)容。

  2、模塊的裝載

  模塊的裝載有兩種方法:一種是實(shí)用insmod命令手工加載模塊,第二種方法是使用內(nèi)核守護(hù)進(jìn)程kerneld在需要的時(shí)候動(dòng)態(tài)裝載。insmod命令的格式為:

  insmod //modulename.o

  值得注意的是,insmod命令需要知道模塊存放的位置,這樣才能在內(nèi)核符號(hào)表中進(jìn)行解析。模塊可以位于當(dāng)前路徑中,也可以在insmod命令中指明絕對(duì)路徑,另外還有幾個(gè)相關(guān)的配置文件可以說(shuō)明模塊的位置(見(jiàn)后文中的介紹)。

  kerneld是一個(gè)標(biāo)準(zhǔn)的守護(hù)進(jìn)程,具有超級(jí)用戶的權(quán)限,其主要功能是加載和卸載核心模塊, 但是它還可以執(zhí)行其他任務(wù), 如通過(guò)串行線路建立PPP連接并在適當(dāng)時(shí)候關(guān)閉它。kerneld自身并不執(zhí)行這些任務(wù),它通過(guò)某些程序如insmod來(lái)做此工作。它只是內(nèi)核的代理,為內(nèi)核進(jìn)行調(diào)度。這個(gè)守護(hù)進(jìn)程僅僅是一個(gè)帶有超級(jí)用戶權(quán)限的普通用戶進(jìn)程。當(dāng)系統(tǒng)啟動(dòng)時(shí)它也被啟動(dòng)并為內(nèi)核打開(kāi)了一個(gè)進(jìn)程間通訊(IPC)通道,內(nèi)核需要執(zhí)行各種任務(wù)時(shí)就實(shí)用這個(gè)IPC來(lái)向kerneld發(fā)送消息。例如,如果內(nèi)核請(qǐng)求現(xiàn)在還沒(méi)有裝載到系統(tǒng)中的文件系統(tǒng),那么就通知kerneld裝載這個(gè)文件系統(tǒng),然后內(nèi)核就可以使用這個(gè)文件系統(tǒng)了。在模塊空閑時(shí)(即沒(méi)有其他進(jìn)程使用這個(gè)模塊時(shí)),kerneld還可以動(dòng)態(tài)卸載這個(gè)模塊。

  需要注意的是,如果模塊之間有某種引用關(guān)系,那么裝載模塊時(shí)必須遵循一定的次序。例如,上面lsmod顯示的結(jié)果中l(wèi)ockd模塊要引用sunrpc的內(nèi)容,那么必須首先裝載sunrpc之后才能裝載lockd,否則就會(huì)出錯(cuò)。

  3、模塊的卸載

  我們可以使用rmmod命令把模塊從系統(tǒng)中卸載出去,該命令的格式為:

  rmmod modulename

3637332