



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、linux 模塊編譯步驟(原)本文將直接了當(dāng)?shù)膸氵M(jìn)入 linux 的模塊編譯。當(dāng)然在介紹的過程當(dāng)中,我也會(huì)添加一些必要的注釋,以便初學(xué)者能夠看懂。之所以要寫這篇文章,主要是因?yàn)閺臅旧蠈W(xué)的話,可能要花更長(zhǎng)的時(shí)間才能學(xué)會(huì)整個(gè)過程,因?yàn)榭磿脑捠且粋€(gè)學(xué)習(xí)過程,而我這篇文章更像是一個(gè)培訓(xùn)。所以實(shí)踐性和總結(jié)性更強(qiáng)。通過本文你將會(huì)學(xué)到編譯一個(gè)模塊和模塊 makefile 的基本知識(shí)。以及加載(卸載)模塊,查看系統(tǒng)消息的一些知識(shí);聲明:本文為初學(xué)者所寫,如果你已經(jīng)是一個(gè) linux 模塊編譯高手,還請(qǐng)指正我文章中的錯(cuò)誤和不足,謝謝第一步:準(zhǔn)備源代碼首先我們還是要來編寫一個(gè)符合 linux 格式的模塊文件
2、,這樣我們才能開始我們的模塊編譯。假設(shè)我們有一個(gè)源文件 mymod.c。它的源碼如下:mymodules.c1. #include/*引入與模塊相關(guān)的宏*/2. #include/*引入 module_init()module_exit()函數(shù)*/3. #include/*弓 I 入 module_param()*/45. MODULE_AUTHOR(YuQiang);6. MODULE_LICENSE(GPL);7.8. staticintnbr=10;9. module_param(nbr,int,S_IRUGO);10.11. staticint_inityuer_init(void)1
3、2. 13.inti;14.for(i=0;inbr;i+)15.16.printk(KERN_ALERTHello,Howareyou.%dn,i);17.18.return0;19. 20.21. staticvoid_exityuer_exit(void)22. 23. printk(KERN_ALERTIcomefromyuersmodule,Ihavebeenunlad.n);24. 25.26. module_init(yuer_init);27. module_exit(yuer_exit);我們的源文件就準(zhǔn)備的差不多了,這就是一個(gè) linux 下的模塊的基本結(jié)構(gòu)。第 9 行是導(dǎo)
4、出我們的符號(hào)變量 nbr。這樣在你加載這個(gè)模塊的時(shí)候可以動(dòng)態(tài)修改這個(gè)變量的值。稍后將演示。yuer_init()函數(shù)將在模塊加載的時(shí)候運(yùn)行,通過輸出的結(jié)果可以看到我們的模塊是否加載成功。第二步:編寫 Makefile 文件首先還是來看看我們 Makefile 的源文件,然后我們?cè)賮斫忉專籑akefileobj-m:=modules.o#要生成的模塊名modules-objs:=mymod.o#生成這個(gè)模塊名所需要的目標(biāo)文件KDIR:=/lib/modules/uname-r/buildPWD:=$(shellpwd)default:make-C$(KDIR)M=$(PWD)modulescle
5、an:rm-rf*.o.*.cmd*.ko*.mod.c.tmp_versions現(xiàn)在我來說明一下這個(gè) Makefile。請(qǐng)記住是大寫的 Makefile 而不是小寫的 makefile;obj-m:這個(gè)變量是指定你要聲稱哪些模塊模塊的格式為 obj-m:=模塊名.omodules-objs:這個(gè)變量是說明聲稱模塊 modules 需要的目標(biāo)文件格式要求模塊名-objs:=目標(biāo)文件切記:模塊的名字不能取與目標(biāo)文件相同的名字。如在這里模塊名不能取成 mymod;KDIR:這是我們正在運(yùn)行的操作系統(tǒng)內(nèi)核編譯目錄。也就是編譯模塊需要的環(huán)境M=:指定我們?cè)次募奈恢肞WD:這是當(dāng)前工作路徑$(shel
6、l)是 make 的一個(gè)內(nèi)置函數(shù)。用來執(zhí)行 shell 命令。第三步:編譯模塊現(xiàn)在我們已經(jīng)準(zhǔn)備好了我們所需要的源文件和相應(yīng)的 Makefile。我們現(xiàn)在就可以編譯了。在終端進(jìn)入源文件目錄輸入 make運(yùn)行結(jié)果:make1:Enteringdirectory/usr/src/linux-headers-2.6.24-24-genericCCM/home/yuqiang/桌面/mymodule/mymodules.oLDM/home/yuqiang/桌面/mymodule/modules.oBuildingmodules,stage2.MODPOST1modulesCC/home/yuqiang/
7、桌面/mymodule/modules.mod.oLDM/home/yuqiang/桌面/mymodule/modules.komake1:Leavingdirectory/usr/src/linux-headers-2.6.24-24-generic第四步:加載/卸載我們的模塊從上面的編譯中我可以看到。已經(jīng)有一個(gè) modules.ko 生成了。這就是我們的模塊了?,F(xiàn)在我們就可以來加載了。首先在終端輸入:sudoinsmodmodules.ko現(xiàn)在我們來看看我們的模塊加載成功沒有呢?在終端車入:dmesg|tail-12 這是查看內(nèi)核輸出信息的意思。tail-12 顯示最后 12 條;顯示結(jié)果
8、如下:17945.024417sd9:0:0:0:Attachedscsigenericsg2type018046.790019usb5-8:USBdisconnect,address919934.224812Hello,Howareyou.019934.224817Hello,Howareyou.119934.224818Hello,Howareyou.219934.224820Hello,Howareyou.319934.224821Hello,Howareyou.419934.224822Hello,Howareyou.519934.224824Hello,Howareyou.61993
9、4.224825Hello,Howareyou.719934.224826Hello,Howareyou.819934.224828Hello,Howareyou.9看到了吧。我們的模塊的初始化函數(shù) yuer_init();已經(jīng)成功運(yùn)行了。說明我們的模塊已經(jīng)加載成功;現(xiàn)在我們?cè)賮硇遁d模塊試試看。在終端輸入:sudormmodmodules在終端車入:dmesg|tail-319934.224826Hello,Howareyou.819934.224828Hello,Howareyou.920412.046932Icomefromyuersmodule,Ihavebeenunlad.可以從打印的
10、信息中看到,我們的模塊的退出函數(shù)已經(jīng)被執(zhí)行了。說明我們的模塊已經(jīng)被成功的卸載了。到目前位置我們就已經(jīng)算是對(duì)模塊的編譯到編譯運(yùn)行算是有了一個(gè)整體上的認(rèn)識(shí)了。對(duì)于以后深入的學(xué)習(xí)還是應(yīng)該有點(diǎn)幫助的。下面我們將在看看于模塊相關(guān)的一些簡(jiǎn)單的操作。第五步:加載模塊時(shí)傳遞參數(shù)在終端輸入:sudoinsmodmodule_name.konbr=4在終端輸入:dmesg|tail-6顯示結(jié)果如下:20800.655694Hello,Howareyou.921318.675593Icomefromonefilemodule,Ihavebeenunlad.21334.425373Hello,Howareyou.02
11、1334.425378Hello,Howareyou.121334.425380Hello,Howareyou.221334.425381Hello,Howareyou.3這樣我們就可以看到在模塊加載的時(shí)候動(dòng)態(tài)設(shè)置了我們的一個(gè)變量。初始化函數(shù)中的循環(huán)只執(zhí)行了 4 次??赡苣銜?huì)問我怎么知道一個(gè)模塊可以設(shè)置那些變量呢。當(dāng)然,你可以先不設(shè)變量加載一次。然后可以在終端輸入ls/sys/module/parameters/來查看。在這里我們是這樣輸入的在終端輸入:ls/sys/moedle/modules/parameters/顯不結(jié)果:nbr如果我們的模塊加載成功了。最后我們還可以通過 modinfo
12、 來查看我們的模塊信息。如下在終端輸入:sudomodinfomodules.ko顯不結(jié)果:filename:modules.kolicense:GPLauthor:YuQiangsrcversion:20E9c3c4E02D130E6E92533depends:vermagic:2.6.24-24-genericSMPmod_unload586parm:nbr:int本文總結(jié):本文的相關(guān)知識(shí)都好像有一點(diǎn)淺嘗轍止的感覺。因?yàn)楸酒恼轮饕峭ㄟ^一條線式方式來講解了模塊編寫的相關(guān)過程,其實(shí)在這個(gè)過程中還有很多可以發(fā)散的地方。例如:在寫到 MODULE_AUTHOR(YuQiang)的時(shí)候,你應(yīng)該想到還有MODULE_DESCRIPTION(模塊用途的簡(jiǎn)單描述);MODULE_VERSION(模塊的版本字符串);MODULE_ALIAS(模
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 解除土建合同協(xié)議書
- 高危工作安全協(xié)議書
- 超市利潤(rùn)分紅協(xié)議書
- 道路遷墳火化協(xié)議書
- 金供應(yīng)商合同協(xié)議書
- 銷售生產(chǎn)訂單協(xié)議書
- 餐飲供應(yīng)合同協(xié)議書
- 農(nóng)村自流地?fù)Q地協(xié)議書
- 餐具承包合同協(xié)議書
- 買車位只有認(rèn)購協(xié)議書
- 黃泉下的美術(shù):宏觀中國(guó)古代墓葬
- 無違法犯罪記錄證明申請(qǐng)表(個(gè)人)
- 內(nèi)部調(diào)撥單表格
- 2023年07月浙江建設(shè)技師學(xué)院200人筆試歷年常考點(diǎn)試卷附帶答案詳解
- 中國(guó)真正丹道理法及工程次第闡真
- 2022年四川省成都市中考英語試卷及答案
- 新年春節(jié)廉潔過年過廉潔年端午節(jié)清廉文化中秋節(jié)廉潔過節(jié)優(yōu)秀課件兩篇
- GB/T 10920-2008螺紋量規(guī)和光滑極限量規(guī)型式與尺寸
- 認(rèn)知宇宙飛船之星際探索
- 皮膚病理知識(shí)學(xué)習(xí)整理課件整理
- 人工智能課件213產(chǎn)生式表示法
評(píng)論
0/150
提交評(píng)論