Linux操作系統(tǒng)自如的裝卸內(nèi)核模塊 |
發(fā)布時(shí)間: 2012/8/26 18:30:15 |
Linux是單內(nèi)核結(jié)構(gòu),也就是說, 它是一個(gè)大程序,其中任一函數(shù)都可以訪問公共數(shù)據(jù)結(jié)構(gòu)和其它函數(shù)調(diào)用。 (作為操作系統(tǒng))另外一種可能的結(jié)構(gòu)是多核式的, 各功能塊自成一體, 相互之間由嚴(yán)格的通信機(jī)制相連。單核結(jié)構(gòu)在添加新模塊時(shí),一種方法是重新調(diào)整設(shè)置,所以非常費(fèi)時(shí)。 比如,你想在內(nèi)核中加一個(gè)NCR 810 SCSI的驅(qū)動(dòng)程序, 你必須重新設(shè)置, 重建內(nèi)核。這也有另外一個(gè)辦法,Linux 允許動(dòng)態(tài)裝載和卸掉模塊. Linux 模塊是一段可以在機(jī)器起動(dòng)后任意時(shí)間被動(dòng)態(tài)連接的代碼. 在不需要時(shí), 它們可以被從內(nèi)核中卸掉. 大多數(shù)Linux 模塊是設(shè)備驅(qū)動(dòng)程序或偽設(shè)備驅(qū)動(dòng)程序, 如網(wǎng)絡(luò)驅(qū)動(dòng)程序, 文件系統(tǒng)等。
按需動(dòng)態(tài)裝載模塊可以使內(nèi)核保持最小, 并更具靈活性. 我現(xiàn)在的 Intel 內(nèi)核由于大量使用動(dòng)態(tài)裝載模塊, 只有 406 K 字節(jié). 例如, 我很少用到 VFAT 文件系統(tǒng), 所以我讓 Linux 內(nèi)核只在我裝載 VFAT 分區(qū)時(shí), 才自動(dòng)上載 VFAT 文件系統(tǒng). 當(dāng)我卸掉 VFAT 分區(qū)時(shí), 內(nèi)核會(huì)檢測(cè)到, 并自動(dòng)卸掉 VFAT 文件系統(tǒng). 當(dāng)測(cè)試新程序時(shí), 你如果不想每次都重建內(nèi)核, 動(dòng)態(tài)裝載模塊是非常有用的. 但是, 運(yùn)用模塊會(huì)多消耗一些內(nèi)存, 并對(duì)速度有一定影響. 并且模塊裝載程序是一段代碼, 它的數(shù)據(jù)將占用一部份內(nèi)存. 這樣還會(huì)造成不能直接訪問內(nèi)核資源, 效率不高的問題. 一旦 Linux 模塊被裝載后, 它就和一般內(nèi)核代碼一樣, 對(duì)其它內(nèi)核代碼, 享受同樣的訪問權(quán)限。換句話說, Linux 內(nèi)核模塊可以像其它內(nèi)核代碼, 或驅(qū)動(dòng)程序一樣使系統(tǒng)崩潰。模塊可以使用內(nèi)核資源,但首先它需知道怎樣調(diào)用. 例如, 一個(gè)模塊要調(diào)用 Kmalloc() (內(nèi)核內(nèi)存分配程序). 但在模塊建立時(shí), 它并不知道到哪兒去找 Kmalloc(), 所以在它被裝載時(shí), 內(nèi)核必須先設(shè)定模塊中所有 Kmalloc() 調(diào)用的函數(shù)指針. 內(nèi)核有一張所有資源調(diào)用的列表, 在模塊被裝載時(shí), 內(nèi)核重設(shè)所有資源調(diào)用的函數(shù)指針. Linux 允許棧式模塊, 即一個(gè)模塊調(diào)用另一個(gè)模塊的函數(shù). 例如, 由于 VFAT 文件系統(tǒng)可以看成是 FAT 文件系統(tǒng)的超集, 所以 VFAT 文件系統(tǒng)模塊需要調(diào)用 FAT 文件系統(tǒng)提供的服務(wù)。一個(gè)模塊調(diào)用另一模塊的資源與調(diào)用內(nèi)核資源很相似。唯一的不同是被調(diào)用的模塊需被先載入。一個(gè)模塊被載入后,內(nèi)核將修改它的內(nèi)核符號(hào)表(KERAEL SYMOBOL TABLE),加入新載入模塊提 供的所有資源和符號(hào)。所以另一個(gè)模塊被載入時(shí), 它就可以調(diào)用所有已載入模塊提供的服務(wù)。 當(dāng)卸掉一模塊時(shí),內(nèi)核先確定該模塊不會(huì)再被調(diào)用,然后通過某種方式通知它。在該模塊被內(nèi)核卸掉以前,該模塊須釋放所有占用的系統(tǒng)資源。例如,內(nèi)存或中斷,當(dāng)模塊被卸掉后,內(nèi)核從內(nèi)核符號(hào)表中刪除所有該模塊提供的資源。 如果模塊代碼不嚴(yán)謹(jǐn),它將使整個(gè)操作系統(tǒng)崩潰。另一個(gè)問題,如果你載入的是為其它版本服務(wù)的模塊,那怎么辦?例如,一個(gè)模塊凋用一個(gè)內(nèi)函數(shù),但提供了錯(cuò)誤的輸入?yún)?shù),這將導(dǎo)致運(yùn)行錯(cuò)誤。但內(nèi)核可以在模塊被載入時(shí)選擇性地通過嚴(yán)格版本檢查來杜絕這種現(xiàn)象。 載入模塊有兩種方法。第一種是通過INSTALL 命令來載入;另一種更聰明的方法是在模塊被調(diào)用時(shí)自動(dòng)載入,這叫所需載入(DEMAND LOADING)。例如,當(dāng)用戶在裝一個(gè)不在內(nèi)核中的文件系統(tǒng),內(nèi)核會(huì)自動(dòng)調(diào)用內(nèi)核駐 留程序(KERNELD)來載入對(duì)應(yīng)的處理模塊。 內(nèi)核駐留程序是一個(gè)具有超級(jí)用戶極限的普通用戶程序。當(dāng)它被啟動(dòng)時(shí)(通常在系統(tǒng)啟動(dòng)時(shí)),它將打開一個(gè)和內(nèi)核之間的進(jìn)程間通信管道(IPC CHANNEL)。 內(nèi)核將利用這條管道來通知進(jìn)程駐留程序去完成各種任務(wù)。內(nèi)核駐留程序的主要任務(wù)是載入和卸掉模塊,它也能完成其她一些任務(wù)。如按需打開和關(guān)掉一條通過串口的 DDD LINK。KERNELD 自己并不完成這些任務(wù)。它將調(diào)用如INSMOD 這樣的命令來完成,KERNELD 只是一個(gè)內(nèi)核的代理,協(xié)調(diào)完成各項(xiàng)任務(wù)。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |