<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ò ) 收藏

關(guān)于模塊加載,可以用圖3.1來(lái)簡(jiǎn)要描述:

圖3.1 模塊的裝入

insmod程序必須找到要求加載的內核模塊,這些內核模塊是已鏈接的目標文件,與其他文件不同的是,它們被鏈接成可重定位映象即映象沒(méi)有被鏈接到特定地址上。insmod將執行一個(gè)特權級系統調用來(lái)查找內核的輸出符號,這些符號都以符號名和數值形式如地址值成對保存。內核輸出符號表被保存在內核維護的模塊鏈表的第一個(gè)module結構中。只有特殊符號才被添加,它們在內核編譯與鏈接時(shí)確定。insmod將模塊讀入虛擬內存并通過(guò)使用內核輸出符號來(lái)修改其未解析的內核函數和資源的引用地址。這些工作采取由insmod程序直接將符號的地址寫(xiě)入模塊中相應地址來(lái)進(jìn)行。

當insmod修改完模塊對內核輸出符號的引用后,它將再次使用特權級系統調用申請足夠的空間容納新模塊。內核將為其分配一個(gè)新的module結構以及足夠的內核內存來(lái)保存新模塊,并將其插入到內核模塊鏈表的尾部,最后將新模塊標志為UNINITIALIZED。insmod將模塊拷貝到已分配空間中,如果為它分配的內核內存已用完,將再次申請,但模塊被多次加載必然處于不同的地址。另外此重定位工作包括使用適當地址來(lái)修改模塊映象[5]。如果新模塊也希望將其符號輸出到系統中,insmod將為其構造輸出符號映象表。每個(gè)內核模塊必須包含模塊初始化和結束函數,所以為了避免沖突它們的符號被設計成不輸出,但是insmod必須知道這些地址,這樣可以將它們傳遞給內核。在所有這些工作完成以后,insmod將調用初始化代碼并執行一個(gè)特權級系統調用將模塊的初始化和結束函數地址傳遞給內核。當將一個(gè)新模塊加載到內核中時(shí),內核必須更新其符號表并修改那些被新模塊使用的老模塊[6]。那些依賴(lài)于其他模塊的模塊必須在其符號表尾部維護一個(gè)引用鏈表并在其module數據結構中指向它。內核調用模塊的初始化函數,如果成功將安裝此模塊。模塊的結束函數地址被存儲在其module結構中,將在模塊卸載時(shí)由內核調用,模塊的狀態(tài)最后被設置成RUNNING。

3.2 模塊的卸載

模塊可以使用rmmod命令刪除,但是請求加載模塊在其使用計數為0時(shí),自動(dòng)被系統刪除。kmod在其每次idle定時(shí)器到期時(shí)都執行一個(gè)系統調用,將系統中所有不再使用的請求加載模塊刪除。

關(guān)于模塊卸載,可以用圖3.2來(lái)描述:

內核中其他部分還在使用的模塊不能被卸載。例如系統中安裝了多個(gè)VFAT文件系統則不能卸載VFAT模塊。執行lsmod將看到每個(gè)模塊的引用計數。模塊的引用計數被保存在其映象的第一個(gè)常字中,這個(gè)字還包含autoclean和visited標志。如果模塊被標記成autoclean,則內核知道此模塊可以自動(dòng)卸載。visited標志表示此模塊正被一個(gè)或多個(gè)文件系統部分使用,只要有其他部分使用此模塊則這個(gè)標志被置位。每次系統要將沒(méi)有被使用的請求加載模塊刪除時(shí),內核將在所有模塊中掃描,但是一般只查看那些被標志為autoclean并處于running狀態(tài)的模塊。如果某模塊的 visited標記被清除則它將被刪除。其他依賴(lài)于它的模塊將修改各自的引用域,表示它們間的依賴(lài)關(guān)系不復存在。此模塊占有的內核內存將被回收。

4. 的應用

基本思想是:數據分組從網(wǎng)絡(luò )設備到用戶(hù)程序空間傳遞的過(guò)程中,減少數據拷貝次數,減少系統調用,實(shí)現CPU的零參與,徹底消除CPU在這方面的負載。的實(shí)現分為實(shí)現DMA數據傳輸和地址映射兩個(gè)部分。其中DMA數據傳輸與本文關(guān)系不大,就不詳細敘述了,這里主要介紹應用機制實(shí)現的地址映射。

地址映射的基本原理是在內核空間申請內存,通過(guò)proc文件系統和mmap函數將其映射到用戶(hù)空間來(lái)允許應用程序訪(fǎng)問(wèn),這樣就消除了內核空間到應用程序空間的數據拷貝。地址映射部分的實(shí)現主要分為以下三步:

第一,建立LKM的基本結構,包括編寫(xiě)初始化和結束函數等。

第二,聲明完成映射功能所需要的函數,主要有分配和初始化內核內存函數init_mem(),釋放內核內存函數del_mem(),向內核內存輸入內容的函數put_mem()等。

第三,在初始化函數中應用第二步建立的函數分配一塊內存空間、輸入內容、建立proc文件系統入口。在結束函數中釋放已分配的內核內存,刪除proc文件系統入口。

編寫(xiě)應用程序測試該LKM,發(fā)現已經(jīng)達到了映射內核內存到應用程序空間的目的。在實(shí)現的過(guò)程中采用LKM機制不但便于調試而且大大減少了開(kāi)發(fā)時(shí)間。

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


關(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>