<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux可加載內核模塊機制的研究與應用

Linux可加載內核模塊機制的研究與應用

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

1. 引言

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

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

2. 的編寫(xiě)和編譯

2.1 內核模塊的基本結構

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

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

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

static int __init hello_init(void){}

static void __exit hello_exit(void ){}

module_init(hello_init);

module_exit(hello_exit);

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

2.2 內核模塊的編譯

編譯時(shí)需要提供一個(gè)makefile來(lái)隱藏底層大量的復雜操作,使用戶(hù)通過(guò)make命令就可以完成編譯的任務(wù)。下面就是一個(gè)簡(jiǎn)單的編譯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。

內核版本2.6中使用.ko文件后綴代替了.o,這是為了與普通可執行文件相區別。[3]

3. LKM的主要功能

3.1 模塊的加載

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>