您好,登錄后才能下訂單哦!
1:驅動開發的準備工作
(1)正常運行linux系統的開發板。要求開發板中的linux的zImage必須是自己編譯的,不能是別人編譯的。
(2)內核源碼樹,其實就是一個經過了配置編譯之后的內核源碼。這里使用的是九鼎官方提供的kener,因為這個內核已經是移植好的,所以只需要直接編譯即可。首先make distclean進行清理,然后make x210ii_qt_defconfig進行配置,最后make 編譯得到Zp_w_picpath(在/arch/arm/boot)目錄下。
(3)nfs掛載的rootfs,主機ubuntu中必須搭建一個nfs服務器。
2:常用的模塊操作命令
(1)lsmod(list module 將模塊列表顯示):功能是打印出當前內核中已經安裝的模塊列表
(2)insmod(install module 安裝模塊):功能是向當前內核中去安裝一個模塊,用法是insmod xxx.ko
(3)modinfo(module information 模塊信息):功能是打印出一個內核模塊的自帶信息。用法是modinfo xxx.ko
(4)rmmod(remove module 刪除模塊):功能是從當前內核中卸載一個已經安裝了的模塊,用法是rmmod xxx(注意卸載模塊時只需要輸入模塊名即可,有些低版本的內核中如果加了后綴.ko會報錯)
3:模塊的安裝(模塊的卸載類似 module _exit與rmmod對應)
(1)先lsmod再insmod看安裝前后系統內模塊記錄。實踐測試標明內核會將最新安裝的模塊放在lsmod顯示的最前面。
(2)insmod與module_init宏。模塊源代碼中用module_init宏聲明了一個函數(在我們這個例子里是chrdev_init函數),作用就是指定chrdev_init這個函數和insmod命令綁定起來,也就是說當我們insmod module_test.ko時,insmod命令內部實際執行的操作就是幫我們調用執行chrdev_init函數。因為我們當前的驅動是安裝在ubuntu中的,由于ubuntu攔截了我們安裝時的打印信息,所以我們不能直接看到chrdev_init函數中的printk打印的信息,需要使用dmesg命令來查看。
(3)模塊安裝時insmod內部除了幫我們調用module_init宏所聲明的函數外,實際還做了一些別的事
4:模塊的版本信息
(1)使用modinfo查看模塊的版本信息
(2)內核zImage中也有一個確定的版本信息
(3)insmod時模塊的vermagic必須和內核的相同,否則不能安裝,報錯信息為:insmod: ERROR: could not insert module module_test.ko: Invalid module format
(4)模塊的版本信息是為了保證模塊和內核的兼容性,是一種安全措施
(5)如何保證模塊的vermagic和內核的vermagic一致?編譯模塊的內核源碼樹就是我們編譯正在運行的這個內核的那個內核源碼樹即可。說白了就是模塊和內核要同出一門。
5:模塊中常用的宏
(1)MODULE_LICENSE,模塊的許可證。一般聲明為GPL許可證,而且最好不要少,否則可能會出現莫名其妙的錯誤(譬如一些明顯存在的函數提升找不到)。
(2)MODULE_AUTHOR:描述模塊的作者
(3)MODULE_DESCRIPTION:描述模塊的介紹信息
(4)MODULE_ALIAS:描述模塊的別名
這些來自于內核驅動部分的代碼,其余的也可以在內核驅動部分去尋找
6:函數修飾符
(1)__init:本質上是個宏定義,在內核源代碼中就有#define __init xxxx。這個__init的作用就是將被他修飾的函數放入.init.text段中去(本來默認情況下函數是被放入.text段中)。整個內核中的所有的這類函數都會被鏈接器鏈接放入.init.text段中,所以所有的內核模塊的__init修飾的函數其實是被統一放在一起的。內核啟動時統一會加載.init.text段中的這些模塊安裝函數,加載完后就會把這個段給釋放掉以節省內存。
(2)__exit:和__init類似
注:前面加一個_表示這是給內核使用的,加兩個__表示是給內核內部使用的,加三個_表示很靠近內核的核心,基本不用自己去修改的
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。