下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux內(nèi)核模塊HelloWorld一、確定任務(wù)了解內(nèi)核模塊的概念。掌握基本的驅(qū)動(dòng)程序設(shè)計(jì)。二、 學(xué)習(xí)內(nèi)容 1、 內(nèi)核模塊概述Linux內(nèi)核是整體式結(jié)構(gòu),各個(gè)子系統(tǒng)聯(lián)系緊密,作為一個(gè)大程序在內(nèi)核空間運(yùn)行。太多的設(shè)備驅(qū)動(dòng)程序和內(nèi)核功能集成在內(nèi)核中,內(nèi)核過(guò)于龐大。如何解決?Linux內(nèi)核引入內(nèi)核模塊制。通過(guò)動(dòng)態(tài)加載內(nèi)核模塊,使得在運(yùn)行過(guò)程中擴(kuò)展內(nèi)核的功能。不需要的時(shí)候。卸載該內(nèi)核模塊。什么是內(nèi)核模塊??jī)?nèi)核模塊式一種沒(méi)有經(jīng)過(guò)鏈接,不能獨(dú)立運(yùn)行的目標(biāo)文件,是在內(nèi)核空間中運(yùn)行的程序。經(jīng)過(guò)鏈接裝載到內(nèi)核里面成為內(nèi)核的一部分,可以訪問(wèn)內(nèi)核的公用符號(hào)(函數(shù)和變量)內(nèi)核模塊可以讓操作系統(tǒng)內(nèi)核在需要是載入和執(zhí)行
2、,在不需要時(shí)由操作系統(tǒng)卸載。它們擴(kuò)展了操作系統(tǒng)訥河的功能卻不需要重新啟動(dòng)系統(tǒng)。如果內(nèi)有內(nèi)核模塊,我們不得不一次又一次重新編譯生成單內(nèi)核操作系統(tǒng)的內(nèi)核鏡像來(lái)加入新的功能。還意味著一個(gè)臃腫的內(nèi)核。內(nèi)核模塊是如何被調(diào)入內(nèi)核工作的? 當(dāng)操作系統(tǒng)內(nèi)核需要的擴(kuò)展功能不存在時(shí),內(nèi)核模塊管理守護(hù)進(jìn)程 kmod 執(zhí)行 modprobe 去加載內(nèi)核模塊。modprobe 遍歷文件/lib/modules/version/modules.dep來(lái)判斷是否有其它內(nèi)核模塊需要在該模塊加載前被加載。最后 modprobe 調(diào)用 insmod 先加載被依賴的模塊,然后加載該被內(nèi)核要求的模塊。2、模塊機(jī)制的優(yōu)缺點(diǎn)模塊機(jī)制的優(yōu)
3、點(diǎn):減小內(nèi)核映像尺寸,增加系統(tǒng)靈活性;節(jié)省開發(fā)時(shí)間;修改內(nèi)核,不必重新編譯整個(gè)內(nèi)核。 模塊的目標(biāo)代碼一旦被鏈入內(nèi)核,作用和靜態(tài)鏈接的內(nèi)核目標(biāo)代碼完全等價(jià)。模塊機(jī)制的缺點(diǎn):對(duì)系統(tǒng)性能有一定損失; 使用不當(dāng)時(shí)會(huì)導(dǎo)致系統(tǒng)崩潰。3、內(nèi)核模塊函數(shù)入口與出口函數(shù):初始化函數(shù) module_init(),在模塊加載到內(nèi)核時(shí)被調(diào)用。module_init()要么向內(nèi)核注冊(cè) 它可以處理的事物,要么用自己的代碼替代某個(gè)內(nèi)核函數(shù)。卸載函數(shù) module_exit()或者cleanup_module(),在內(nèi)核模塊被卸載時(shí)被調(diào)用,干一些收尾清理的工作, 撤消任何初始化函數(shù)module_init()做的事,保證內(nèi)核模塊
4、可以被安全的卸載。(注意:任一個(gè)內(nèi)核模塊需要包含 linux/module.h)(1)printk( )函數(shù):printk 函數(shù)在 Linux 內(nèi)核中定義并且對(duì)模塊可用,為內(nèi)核提供日志功能, 記錄內(nèi)核信息或用來(lái)給出警告。與標(biāo)準(zhǔn) C 庫(kù)函數(shù) printf 的行為相似。每個(gè) printk()聲明都會(huì)帶一個(gè)優(yōu)先級(jí)。內(nèi)核總共定義了八個(gè)優(yōu)先級(jí)的宏, 在 linux/kernel.h 中定義。若你不指明優(yōu)先級(jí),DEFAULT_MESSAGE_LOGLEVEL 這個(gè)默認(rèn) 優(yōu)先級(jí)將被采用。信息添加到文件 /var/log/messages,可直接查看,或者用命令 dmesg 查看。在 Xwindows 下的終
5、端 insmod 一個(gè)模塊,日志信息只會(huì)記錄在日志文件中,而不在終端打印。(2)內(nèi)核模塊編譯順利編譯并且加載第一個(gè)“hello world”模塊有時(shí)就會(huì)比較困難。強(qiáng)烈建議使用標(biāo)準(zhǔn)內(nèi)核源代碼包,編譯新內(nèi)核并用新內(nèi)核啟動(dòng)系統(tǒng)。Linux 的發(fā)行版本經(jīng)常給內(nèi)核打一些非標(biāo)準(zhǔn)的補(bǔ)丁,這種情況會(huì)導(dǎo)致一些問(wèn)題的發(fā)生。保 證 系 統(tǒng) 具 備 正 確 的 編 譯 器 、 模 塊 工 具 、 以 及 其 他 必 要 工 具 。 內(nèi) 核 目 錄Documentation/Changes 列出了需要的工具版本。用錯(cuò)誤的工具版本建立一個(gè)內(nèi)核(包括模塊),可能導(dǎo)致一些奇怪復(fù)雜的問(wèn)題。內(nèi)核模塊編譯:為 2.6 版本內(nèi)核構(gòu)造
6、模塊,首先需要有配置并構(gòu)建好的 2.6 內(nèi)核源代碼樹。而且最好運(yùn)行和模塊對(duì)應(yīng)的內(nèi)核。 2.6內(nèi)核的模塊要和內(nèi)核源代碼樹中的目標(biāo)文件連接。2.6 內(nèi)核的構(gòu)建系統(tǒng) kbuild,使得內(nèi)核源碼外的內(nèi)核模塊編譯跟內(nèi)核編譯統(tǒng)一起來(lái),無(wú)須手動(dòng)給定這些參數(shù)。Hello-1.c 的 Makefile 文件:obj-m += hello-1.o表明有一個(gè)模塊要從目標(biāo)文件 hello-1.o 建立,kbuild 從該目標(biāo)文件建立內(nèi)核模塊hello-1.ko。執(zhí)行以下命令編譯模塊:make -C /usr/src/linux-uname -r M=$PWD modules改變目錄到用 -C 選項(xiàng)提供的內(nèi)核源碼目錄,
7、在那里找到內(nèi)核的頂層 makefile。M= 選 項(xiàng)使 makefile 在試圖建立模塊目標(biāo)前, 回到模塊源碼目錄。2.6 內(nèi)核引入新的內(nèi)核模塊命名規(guī)范:內(nèi)核模塊使用.ko 的文件后綴(代替 以往的.o 后綴),從而內(nèi)核模塊區(qū)別于普通的目標(biāo)文件。多個(gè)文件構(gòu)成的內(nèi)核模塊:*Makefile 會(huì)幫我們完成編譯和連接的工作。例如 內(nèi)核模塊分兩個(gè)文件 start.c stop.c,則 ;Makefile 這樣寫:obj-m += startstop.ostartstop-objs := start.o stop.o跟單個(gè)文件模塊的編譯方式一樣,內(nèi)核編譯系統(tǒng)會(huì)將所有的目標(biāo)文件連接為一個(gè)文件。 內(nèi)核模塊和
8、用戶程序的比較內(nèi)核模塊是如何開始和結(jié)束的:*用戶程序通常從函數(shù) main()開始,執(zhí)行一系列的指令并且 當(dāng)指令執(zhí)行完成后結(jié)束程 序。從頭到尾執(zhí)行任務(wù)。*內(nèi)核模塊從函數(shù) module_init() 指定的函數(shù)調(diào)用開始。這就是內(nèi)核模 塊的入口函數(shù)。初始化函數(shù)的任務(wù)注冊(cè)自己,為以后內(nèi)核調(diào)用模塊函數(shù)做準(zhǔn)備。*模塊的退出函數(shù)則在模塊別卸載之前調(diào)用,撤銷“初始化函數(shù)”注冊(cè)的擴(kuò)展功能。 *模塊可調(diào)用的函數(shù)*應(yīng)用程序可以調(diào)用它沒(méi)有定義的函數(shù)(函數(shù)庫(kù)中的函數(shù))。因?yàn)樵谶B接階段與合適的函 數(shù)庫(kù)連接,解決外部引用。*內(nèi)核模塊是連接到內(nèi)核, 它能夠調(diào)用的函數(shù)和變量是內(nèi)核公開的函數(shù)和變量,沒(méi)有庫(kù)來(lái)連接??梢栽趦?nèi)核模塊中
9、使用的函數(shù)只能來(lái)自內(nèi)核本身。(3)管理內(nèi)核模塊的命令lsmod 列出已經(jīng)掛載的內(nèi)核模塊*lsmod 是列出目前系統(tǒng)中已加載的模塊的名稱及大小等*效果跟通過(guò) less /proc/modules 查看模塊一樣。*modinfo 查看模塊信息* modinfo 可以查看模塊的信息,通過(guò)查看模塊信息來(lái)判定這個(gè)模塊的用途。* modinfo 模塊名 管理內(nèi)核模塊的命令*modprobe 掛載新模塊以及新模塊相依賴的模塊*modprobe 模塊名,在掛載該內(nèi)核模塊的同時(shí),這個(gè)模塊所依賴的模塊也被同時(shí)掛載。*modprobe 還有其他用法,具體用法查看man modprobe 。例如:modprobe -
10、l 是列出內(nèi)核中所有的模 塊,包括已掛載和未掛載的,讀取的模塊列表就位于 /lib/modules/uname -r 目錄中。*rmmod 移除已掛載模塊*用法:rmmod 模塊名(不帶后綴)*等同于:modprobe -r 模塊名*insmod 掛載模塊*insmod 需要給出模塊所在目錄的絕對(duì)路徑,以及要帶有模塊文件名后綴(.o 或.ko)*insmod *.ko*功能上沒(méi)有 modprobe 強(qiáng)。 *depmod 創(chuàng)建模塊依賴關(guān)系的列表*目前的的 Linux 發(fā)行版所用的內(nèi)核是 2.6x 版本,是自動(dòng)解決依賴關(guān)系。*depmod -a 為所有列在/etc/modprobe.conf 或/
11、etc/modules.conf 中的所有模塊創(chuàng)建依賴 關(guān)系,并且寫入到 modules.dep 文件*depmod e 列出已掛載但不可用的模塊。(4)注意事項(xiàng)*使用 insmod ./hello-1.ko 命令加載該模塊。*/proc/modules 記錄被加載的內(nèi)核模塊。*使用命令 rmmod hello-1 卸載模塊*改變 module_init()返回值非零,重新編譯再加載,觀察結(jié)果發(fā)生了什么變化?*非 0 返回值表示初始化內(nèi)核模塊失敗,模塊不能加載。*從內(nèi)核 Linux 2.4 之后,可以為模塊的“初始化”和“卸載”函數(shù)起任意的名字。不再必須 使用 init_module()和 c
12、leanup_module()的名字。*通過(guò)宏 module_init()和 module_exit()實(shí)現(xiàn)。這些宏在 linux/init.h 中定義。module_init(hello_2_init); module_exit(hello_2_exit);*函數(shù)必須在宏的使用前定義,否則編譯會(huì)報(bào)錯(cuò)。(5)關(guān)于 init 和exit 宏*如果該模塊被編譯進(jìn)內(nèi)核,而不是動(dòng)態(tài)加載,則宏 init 的使用會(huì)在初始化完成后丟 棄該函數(shù)并收回所占內(nèi)存。*如果該模塊被編譯進(jìn)內(nèi)核,宏 exit 將忽略“清理收尾”的函數(shù)。*這些宏在頭文件 linux/init.h 定義,用來(lái)釋放內(nèi)核占用的內(nèi)存。例如啟動(dòng)時(shí)看
13、到的信息“Freeingunusedkernelmemory:236kfreed”,正是內(nèi)核釋放這些函數(shù)所占用空間時(shí)的打印信息。三、代碼設(shè)計(jì) 一、 編寫源程序代碼#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>static int _init hello_init(void) printk("module initn"); printk("Hello worldn"); return 0;static void _exit
14、 hello_exit(void) printk("module exitn");module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");二、 編寫makefile文件ifneq ($(KERNELRELEASE),) obj-m :=hello.oelsemodule-objs :=hello.oKERNELDIR ?= /home/gec/linux_kernel#若僅編譯宿主機(jī)的驅(qū)動(dòng)模塊則將KERNELDIR 替換成以下語(yǔ)句#KERNELDIR ?=/lib/modules/$(shell uname r)/build/PWD := $(shell pwd)modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesendifclean: $(RM) *.ko *.mod.c *.mod.o *.o *.order *.symvers *.cmd四、編譯代碼和運(yùn)行在Ubuntu下建立目錄/home/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年的商鋪?zhàn)赓U合同:商業(yè)布局新動(dòng)向
- 上海住宅租賃合同轉(zhuǎn)讓合同范本
- 不具備產(chǎn)權(quán)證明房產(chǎn)買賣合同
- 個(gè)人房屋租賃續(xù)約合同模板
- 個(gè)人貸款代理合同版
- 酒店投資合作協(xié)議合同
- 教師實(shí)習(xí)協(xié)議書模板
- 人力資源外包合作框架協(xié)議
- 實(shí)木家具開裂售后的購(gòu)銷合同
- 大廈租賃合同范本
- 2025至2030年中國(guó)減肥肽數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024內(nèi)蒙古公務(wù)員省直行測(cè)、行政執(zhí)法、省考行測(cè)考試真題(5套)
- 2025年安徽馬鞍山市兩山綠色生態(tài)環(huán)境建設(shè)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 山東省濱州市濱城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末考試化學(xué)試題
- 期末試卷:安徽省宣城市2021-2022學(xué)年七年級(jí)上學(xué)期期末歷史試題(解析版)
- 幼兒教師新年規(guī)劃
- 2024年湖南省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 2024新版(北京版)三年級(jí)英語(yǔ)上冊(cè)單詞帶音標(biāo)
- T∕CMATB 9002-2021 兒童肉類制品通用要求
- 畢業(yè)論文-基于51單片機(jī)的智能LED照明燈的設(shè)計(jì)
- 酒廠食品召回制度
評(píng)論
0/150
提交評(píng)論