新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux可加載內(nèi)核模塊機(jī)制的研究與應(yīng)用

Linux可加載內(nèi)核模塊機(jī)制的研究與應(yīng)用

作者: 時(shí)間:2012-03-31 來源:網(wǎng)絡(luò) 收藏

1. 引言

系統(tǒng)開放源代碼、系統(tǒng)漏洞少,在面對(duì)病毒和黑客入侵時(shí)能提供更好的安全性和穩(wěn)定性,基于以上這些優(yōu)點(diǎn),近年來對(duì)操作系統(tǒng)及其相關(guān)技術(shù)的應(yīng)用和研究越來越多。對(duì)操作系統(tǒng)擴(kuò)充或裁剪功能需要在重新編譯內(nèi)核上花費(fèi)大量的時(shí)間。機(jī)制由于大大縮短了開發(fā)和測(cè)試的時(shí)間,在 Linux開發(fā)、研究的過程中起到了舉足輕重的作用。

主要包括內(nèi)核模塊在操作系統(tǒng)中的加載和卸載兩部分功能,內(nèi)核模塊是一些在啟動(dòng)的操作系統(tǒng)內(nèi)核需要時(shí)可以載入內(nèi)核執(zhí)行的代碼塊,不需要時(shí)由操作系統(tǒng)卸載。它們擴(kuò)展了操作系統(tǒng)內(nèi)核功能卻不需要重新編譯內(nèi)核、啟動(dòng)系統(tǒng)[1]。如果沒有內(nèi)核模塊,就不得不反復(fù)編譯生成操作系統(tǒng)的內(nèi)核鏡像來加入新功能,當(dāng)附加的功能很多時(shí),還會(huì)使內(nèi)核變得臃腫。

2. 的編寫和編譯

2.1 內(nèi)核模塊的基本結(jié)構(gòu)

一個(gè)內(nèi)核模塊至少包含兩個(gè)函數(shù),模塊被加載時(shí)執(zhí)行的初始化函數(shù)init_module()和模塊

被卸載時(shí)執(zhí)行的結(jié)束函數(shù)cleanup_module()。在最新內(nèi)核穩(wěn)定版本2.6中,兩個(gè)函數(shù)可以起

任意的名字,通過宏module_init()和module_exit()實(shí)現(xiàn)[2]。唯一需要注意的地方是函數(shù)必須在宏的使用前定義。例如:

static int __init hello_init(void){}

static void __exit hello_exit(void ){}

module_init(hello_init);

module_exit(hello_exit);

這里聲明函數(shù)為static的目的是使函數(shù)在文件以外不可見,__init的作用是在完成初始化后收回該函數(shù)占用的內(nèi)存,宏__exit用于模塊被編譯進(jìn)內(nèi)核時(shí)忽略結(jié)束函數(shù)。這兩個(gè)宏只針對(duì)模塊被編譯進(jìn)內(nèi)核的情況,而對(duì)動(dòng)態(tài)加載模塊是無效的。這是因?yàn)榫幾g進(jìn)內(nèi)核的模塊是沒有清理收尾工作的,而動(dòng)態(tài)加載模塊卻需要自己完成這些工作。

2.2 內(nèi)核模塊的編譯

編譯時(shí)需要提供一個(gè)makefile來隱藏底層大量的復(fù)雜操作,使用戶通過make命令就可以完成編譯的任務(wù)。下面就是一個(gè)簡單的編譯hello.c的makefile文件:

obj-m += hello.ko

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

編譯后獲得可加載的模塊文件hello.ko。

內(nèi)核版本2.6中使用.ko文件后綴代替了.o,這是為了與普通可執(zhí)行文件相區(qū)別。[3]

3. LKM的主要功能

3.1 模塊的加載

模塊的加載有兩種方法,第一種是使用insmod命令加載,另一種是當(dāng)內(nèi)核發(fā)現(xiàn)需要加載某個(gè)模塊時(shí),請(qǐng)求內(nèi)核后臺(tái)進(jìn)程kmod加載適當(dāng)?shù)哪K。當(dāng)內(nèi)核需要加載模塊時(shí),kmod被喚醒并執(zhí)行modprobe,同時(shí)傳遞需加載模塊的名字作為參數(shù)。modprobe像insmod一樣將模塊加載進(jìn)內(nèi)核,不同的是在模塊被加載時(shí)查看它是否涉及到當(dāng)前沒有定義在內(nèi)核中的任何符號(hào)。如果有,在當(dāng)前模塊路徑的其他模塊中查找。如果找到,它們也會(huì)被加載到內(nèi)核中。但在這種情況下使用insmod,會(huì)以“未解析符號(hào)”信息結(jié)束[4]。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 3 下一頁

關(guān)鍵詞: LKM Linux 零拷貝

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉