溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

驅(qū)動(dòng)學(xué)學(xué)之驅(qū)動(dòng)學(xué)習(xí)的準(zhǔn)備工作

發(fā)布時(shí)間:2020-08-05 08:19:41 來(lái)源:網(wǎng)絡(luò) 閱讀:411 作者:菜鳥(niǎo)養(yǎng)成記 欄目:開(kāi)發(fā)技術(shù)

1:驅(qū)動(dòng)開(kāi)發(fā)的準(zhǔn)備工作

(1)正常運(yùn)行l(wèi)inux系統(tǒng)的開(kāi)發(fā)板。要求開(kāi)發(fā)板中的linux的zImage必須是自己編譯的,不能是別人編譯的。

(2)內(nèi)核源碼樹(shù),其實(shí)就是一個(gè)經(jīng)過(guò)了配置編譯之后的內(nèi)核源碼。這里使用的是九鼎官方提供的kener,因?yàn)檫@個(gè)內(nèi)核已經(jīng)是移植好的,所以只需要直接編譯即可。首先make distclean進(jìn)行清理,然后make x210ii_qt_defconfig進(jìn)行配置,最后make 編譯得到Zp_w_picpath(在/arch/arm/boot)目錄下。

(3)nfs掛載的rootfs,主機(jī)ubuntu中必須搭建一個(gè)nfs服務(wù)器。

2:常用的模塊操作命令

(1)lsmod(list module 將模塊列表顯示):功能是打印出當(dāng)前內(nèi)核中已經(jīng)安裝的模塊列表

(2)insmod(install module 安裝模塊):功能是向當(dāng)前內(nèi)核中去安裝一個(gè)模塊,用法是insmod xxx.ko

(3)modinfo(module information 模塊信息):功能是打印出一個(gè)內(nèi)核模塊的自帶信息。用法是modinfo xxx.ko

(4)rmmod(remove module 刪除模塊):功能是從當(dāng)前內(nèi)核中卸載一個(gè)已經(jīng)安裝了的模塊,用法是rmmod xxx(注意卸載模塊時(shí)只需要輸入模塊名即可,有些低版本的內(nèi)核中如果加了后綴.ko會(huì)報(bào)錯(cuò))

3:模塊的安裝(模塊的卸載類似 module _exit與rmmod對(duì)應(yīng))

(1)先lsmod再insmod看安裝前后系統(tǒng)內(nèi)模塊記錄。實(shí)踐測(cè)試標(biāo)明內(nèi)核會(huì)將最新安裝的模塊放在lsmod顯示的最前面。

(2)insmod與module_init宏。模塊源代碼中用module_init宏聲明了一個(gè)函數(shù)(在我們這個(gè)例子里是chrdev_init函數(shù)),作用就是指定chrdev_init這個(gè)函數(shù)和insmod命令綁定起來(lái),也就是說(shuō)當(dāng)我們insmod module_test.ko時(shí),insmod命令內(nèi)部實(shí)際執(zhí)行的操作就是幫我們調(diào)用執(zhí)行chrdev_init函數(shù)。因?yàn)槲覀儺?dāng)前的驅(qū)動(dòng)是安裝在ubuntu中的,由于ubuntu攔截了我們安裝時(shí)的打印信息,所以我們不能直接看到chrdev_init函數(shù)中的printk打印的信息,需要使用dmesg命令來(lái)查看。

(3)模塊安裝時(shí)insmod內(nèi)部除了幫我們調(diào)用module_init宏所聲明的函數(shù)外,實(shí)際還做了一些別的事

4:模塊的版本信息

(1)使用modinfo查看模塊的版本信息

(2)內(nèi)核zImage中也有一個(gè)確定的版本信息

(3)insmod時(shí)模塊的vermagic必須和內(nèi)核的相同,否則不能安裝,報(bào)錯(cuò)信息為:insmod: ERROR: could not insert module module_test.ko: Invalid module format

(4)模塊的版本信息是為了保證模塊和內(nèi)核的兼容性,是一種安全措施

(5)如何保證模塊的vermagic和內(nèi)核的vermagic一致?編譯模塊的內(nèi)核源碼樹(shù)就是我們編譯正在運(yùn)行的這個(gè)內(nèi)核的那個(gè)內(nèi)核源碼樹(shù)即可。說(shuō)白了就是模塊和內(nèi)核要同出一門(mén)。


5:模塊中常用的宏

(1)MODULE_LICENSE,模塊的許可證。一般聲明為GPL許可證,而且最好不要少,否則可能會(huì)出現(xiàn)莫名其妙的錯(cuò)誤(譬如一些明顯存在的函數(shù)提升找不到)。

(2)MODULE_AUTHOR:描述模塊的作者

(3)MODULE_DESCRIPTION:描述模塊的介紹信息

(4)MODULE_ALIAS:描述模塊的別名

這些來(lái)自于內(nèi)核驅(qū)動(dòng)部分的代碼,其余的也可以在內(nèi)核驅(qū)動(dòng)部分去尋找


6:函數(shù)修飾符

(1)__init:本質(zhì)上是個(gè)宏定義,在內(nèi)核源代碼中就有#define __init xxxx。這個(gè)__init的作用就是將被他修飾的函數(shù)放入.init.text段中去(本來(lái)默認(rèn)情況下函數(shù)是被放入.text段中)。整個(gè)內(nèi)核中的所有的這類函數(shù)都會(huì)被鏈接器鏈接放入.init.text段中,所以所有的內(nèi)核模塊的__init修飾的函數(shù)其實(shí)是被統(tǒng)一放在一起的。內(nèi)核啟動(dòng)時(shí)統(tǒng)一會(huì)加載.init.text段中的這些模塊安裝函數(shù),加載完后就會(huì)把這個(gè)段給釋放掉以節(jié)省內(nèi)存。

(2)__exit:和__init類似


注:前面加一個(gè)_表示這是給內(nèi)核使用的,加兩個(gè)__表示是給內(nèi)核內(nèi)部使用的,加三個(gè)_表示很靠近內(nèi)核的核心,基本不用自己去修改的



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI