1:驅(qū)動開發(fā)的準備工作
創(chuàng)新互聯(lián)公司是一家專業(yè)提供黃埔企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都網(wǎng)站制作、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為黃埔眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。(1)正常運行l(wèi)inux系統(tǒng)的開發(fā)板。要求開發(fā)板中的linux的zImage必須是自己編譯的,不能是別人編譯的。
(2)內(nèi)核源碼樹,其實就是一個經(jīng)過了配置編譯之后的內(nèi)核源碼。這里使用的是九鼎官方提供的kener,因為這個內(nèi)核已經(jīng)是移植好的,所以只需要直接編譯即可。首先make distclean進行清理,然后make x210ii_qt_defconfig進行配置,最后make 編譯得到Zp_w_picpath(在/arch/arm/boot)目錄下。
(3)nfs掛載的rootfs,主機ubuntu中必須搭建一個nfs服務(wù)器。
2:常用的模塊操作命令
(1)lsmod(list module 將模塊列表顯示):功能是打印出當(dāng)前內(nèi)核中已經(jīng)安裝的模塊列表
(2)insmod(install module 安裝模塊):功能是向當(dāng)前內(nèi)核中去安裝一個模塊,用法是insmod xxx.ko
(3)modinfo(module information 模塊信息):功能是打印出一個內(nèi)核模塊的自帶信息。用法是modinfo xxx.ko
(4)rmmod(remove module 刪除模塊):功能是從當(dāng)前內(nèi)核中卸載一個已經(jīng)安裝了的模塊,用法是rmmod xxx(注意卸載模塊時只需要輸入模塊名即可,有些低版本的內(nèi)核中如果加了后綴.ko會報錯)
3:模塊的安裝(模塊的卸載類似 module _exit與rmmod對應(yīng))
(1)先lsmod再insmod看安裝前后系統(tǒng)內(nèi)模塊記錄。實踐測試標明內(nèi)核會將最新安裝的模塊放在lsmod顯示的最前面。
(2)insmod與module_init宏。模塊源代碼中用module_init宏聲明了一個函數(shù)(在我們這個例子里是chrdev_init函數(shù)),作用就是指定chrdev_init這個函數(shù)和insmod命令綁定起來,也就是說當(dāng)我們insmod module_test.ko時,insmod命令內(nèi)部實際執(zhí)行的操作就是幫我們調(diào)用執(zhí)行chrdev_init函數(shù)。因為我們當(dāng)前的驅(qū)動是安裝在ubuntu中的,由于ubuntu攔截了我們安裝時的打印信息,所以我們不能直接看到chrdev_init函數(shù)中的printk打印的信息,需要使用dmesg命令來查看。
(3)模塊安裝時insmod內(nèi)部除了幫我們調(diào)用module_init宏所聲明的函數(shù)外,實際還做了一些別的事
4:模塊的版本信息
(1)使用modinfo查看模塊的版本信息
(2)內(nèi)核zImage中也有一個確定的版本信息
(3)insmod時模塊的vermagic必須和內(nèi)核的相同,否則不能安裝,報錯信息為:insmod: ERROR: could not insert module module_test.ko: Invalid module format
(4)模塊的版本信息是為了保證模塊和內(nèi)核的兼容性,是一種安全措施
(5)如何保證模塊的vermagic和內(nèi)核的vermagic一致?編譯模塊的內(nèi)核源碼樹就是我們編譯正在運行的這個內(nèi)核的那個內(nèi)核源碼樹即可。說白了就是模塊和內(nèi)核要同出一門。
5:模塊中常用的宏
(1)MODULE_LICENSE,模塊的許可證。一般聲明為GPL許可證,而且最好不要少,否則可能會出現(xiàn)莫名其妙的錯誤(譬如一些明顯存在的函數(shù)提升找不到)。
(2)MODULE_AUTHOR:描述模塊的作者
(3)MODULE_DESCRIPTION:描述模塊的介紹信息
(4)MODULE_ALIAS:描述模塊的別名
這些來自于內(nèi)核驅(qū)動部分的代碼,其余的也可以在內(nèi)核驅(qū)動部分去尋找
6:函數(shù)修飾符
(1)__init:本質(zhì)上是個宏定義,在內(nèi)核源代碼中就有#define __init xxxx。這個__init的作用就是將被他修飾的函數(shù)放入.init.text段中去(本來默認情況下函數(shù)是被放入.text段中)。整個內(nèi)核中的所有的這類函數(shù)都會被鏈接器鏈接放入.init.text段中,所以所有的內(nèi)核模塊的__init修飾的函數(shù)其實是被統(tǒng)一放在一起的。內(nèi)核啟動時統(tǒng)一會加載.init.text段中的這些模塊安裝函數(shù),加載完后就會把這個段給釋放掉以節(jié)省內(nèi)存。
(2)__exit:和__init類似
注:前面加一個_表示這是給內(nèi)核使用的,加兩個__表示是給內(nèi)核內(nèi)部使用的,加三個_表示很靠近內(nèi)核的核心,基本不用自己去修改的
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。