目錄
一、環(huán)境配置
?1、開(kāi)發(fā)板環(huán)境
2、uboot環(huán)境
①設(shè)置bootargs
②設(shè)置bootcmd
二、加載驅(qū)動(dòng)與卸載驅(qū)動(dòng)
?1、加載命令選擇
2、創(chuàng)建目錄環(huán)境以及驅(qū)動(dòng)文件復(fù)制
3、加載驅(qū)動(dòng)?
提示①“modprobe: can't open 'modules.dep': No such file or directory”
?提示②module license 'unspecified'
4、卸載驅(qū)動(dòng)
提示②module license 'unspecified'的解決
三、測(cè)試驅(qū)動(dòng)入口函數(shù)和出口函數(shù)
1、printk?
2、測(cè)試?
一、環(huán)境配置
?1、開(kāi)發(fā)板環(huán)境
開(kāi)發(fā)板通過(guò)從SD卡啟動(dòng),SD卡里面燒寫(xiě)了uboot,開(kāi)發(fā)板能ping通ubantu
uboot通過(guò)tftp從ubuntu里面獲取zimage和dtb,rootfs也是通過(guò)nfs掛載
2、uboot環(huán)境
①設(shè)置bootargs
setenv?bootargs='console=ttymxc0,115200 rw root=/dev/nfs nfsroot=192.168.1.222:/home/ubantu22/nfs/rootfs ip=192.168.1.221:192.168.1.222:192.168.1.1:255.255.255.0::eth0:off'
“console”為設(shè)置串口和波特率,“rw”是可讀可寫(xiě)權(quán)限,"root"告訴內(nèi)核要通過(guò)網(wǎng)絡(luò)取得根文件系統(tǒng)
“nfsroot”后面ip為uabntu的ip,路徑為根文件系統(tǒng)路徑
“ip”第一個(gè)是開(kāi)發(fā)板ip,第二個(gè)是ubantu的ip第三個(gè)是網(wǎng)關(guān),第四個(gè)是子網(wǎng)掩碼
“eth0”設(shè)置使用的網(wǎng)口
記得使用saveenv命令進(jìn)行保存
②設(shè)置bootcmd
setenv bootcmd='tftp 80800000 zImage;tftp 83000000 imx6ull-my-emmc.dtb;bootz 80800000 - 83000000;'
通過(guò)tftp下載zImage到80800000和.dtb設(shè)備樹(shù)下載到83000000
用bootz啟動(dòng)
記得使用saveenv命令進(jìn)行保存
二、加載驅(qū)動(dòng)與卸載驅(qū)動(dòng)
?1、加載命令選擇
驅(qū)動(dòng)編譯完成以后擴(kuò)展名為.ko,有兩種命令可以加載驅(qū)動(dòng)模塊: insmod和 modprobe
?insmod是最簡(jiǎn)單的模塊加載命令,此命令用于加載指定的.ko 模塊,但是insmod 命令不能解決模塊的依賴關(guān)系,比如 drv.ko 依賴 first.ko 這個(gè)模塊,就必須先使用insmod 命令加載 first.ko 這個(gè)模塊,然后再加載 drv.ko 這個(gè)模塊,所以不建議使用這個(gè)
modprobe 會(huì)分析模塊的依賴關(guān)系,然后會(huì)將所有的依賴模塊都加載到內(nèi)核中,因此modprobe 命令相比 insmod 要智能一些。 modprobe 命令主要智能在提供了模塊的依賴性分析、錯(cuò)誤檢查、錯(cuò)誤報(bào)告等功能,推薦使用 modprobe 命令來(lái)加載驅(qū)動(dòng)
要注意的是,modprobe 命令默認(rèn)會(huì)去/lib/modules/<kernel-version>目錄中查找模塊,比如這里使用的 Linux kernel 的版本號(hào)為 4.1.15,因此 modprobe 命令默認(rèn)會(huì)到/lib/modules/4.1.15 這個(gè)目錄中查找相應(yīng)的驅(qū)動(dòng)模塊,一般自己制作的根文件系統(tǒng)中是不會(huì)有這個(gè)目錄,所以需要自己手動(dòng)創(chuàng)建
2、創(chuàng)建目錄環(huán)境以及驅(qū)動(dòng)文件復(fù)制
cd lib
mkdir modules
cd modules
mkdir 4.1.15
cd 4.1.15
?這就進(jìn)入到/lib/modules/4.1.15的目錄下了,在ubantu里面把驅(qū)動(dòng)放到這個(gè)目錄下,如下圖
?在開(kāi)發(fā)板上面查看一下.ko文件,如下圖
3、加載驅(qū)動(dòng)?
利用modprobr加載驅(qū)動(dòng),如下圖
?
?這里錯(cuò)誤提示“modprobe: can't open 'modules.dep': No such file or directory”
提示①“modprobe: can't open 'modules.dep': No such file or directory”
modprobe 提示無(wú)法打開(kāi)“modules.dep”這個(gè)文件,因此驅(qū)動(dòng)掛載失敗了。對(duì)于一個(gè)新的模塊使用modprobe加載的時(shí)候需要先調(diào)用一下depmod命令,直接輸入 depmod 命令即可自動(dòng)生成modules.dep,不用手動(dòng)創(chuàng)建。有些根文件系統(tǒng)可能沒(méi)有 depmod 這個(gè)命令,如果沒(méi)有這個(gè)命令就只能重新配置busybox,使能此命令,然后重新編譯 busybox。輸入“depmod”命令以后會(huì)自動(dòng)生成 modules.alias、modules.symbols 和 modules.dep 這三個(gè)文件,如下圖
?下面重新加載驅(qū)動(dòng),使用modprobe如下圖
?提示②module license 'unspecified'
這里有提示“chrdevbase: module license 'unspecified' taints kernel.Disabling lock debugging due to kernel taint”,意為未指定許可證,這里暫時(shí)不管,學(xué)完卸載驅(qū)動(dòng)后進(jìn)行解決
下面用“l(fā)smod”查看一下當(dāng)前的驅(qū)動(dòng)模塊都有那些,如下圖
可以看到已經(jīng)有chrdevbase的驅(qū)動(dòng)了
4、卸載驅(qū)動(dòng)
利用“remod”卸載驅(qū)動(dòng),如下圖
chrdevbase?驅(qū)動(dòng)已經(jīng)被卸載了
下面先解決剛剛加載驅(qū)動(dòng)后出現(xiàn)的提示
提示②module license 'unspecified'的解決
重新加載驅(qū)動(dòng),如下圖
這次重新加載就沒(méi)有錯(cuò)誤提示了,而且也成功加載,可能是只提示一次,但還是要解決
出現(xiàn)提示“chrdevbase: module license 'unspecified' taints kernel主要是因?yàn)轵?qū)動(dòng)沒(méi)有 license信息
下面在編譯驅(qū)動(dòng)的c文件里面添加 license信息和作者信息(可不加),代碼如下
MODULE_LICENSE("GPL");????????????????????????/* license許可信息,采用 GPL 協(xié)議*/
MODULE_AUTHOR("ba che kai qi lai");????????/*作者*/
?重新編譯,再拷貝到開(kāi)發(fā)板根文件系統(tǒng)的/lib/modules/4.1.15的目錄下
?先把已經(jīng)加載的chrdevbase驅(qū)動(dòng)卸載
?重啟開(kāi)發(fā)板來(lái)測(cè)試是否還會(huì)有提示,重新加載驅(qū)動(dòng)
可以看到不再出現(xiàn)“module license 'unspecified' ”的提示了
三、測(cè)試驅(qū)動(dòng)入口函數(shù)和出口函數(shù)
1、printk?
先了解一下關(guān)于printf和printk,在內(nèi)核里面沒(méi)有printf這個(gè)函數(shù)的
printf運(yùn)行在用戶態(tài),而printk運(yùn)行在內(nèi)核態(tài),printk使用有等級(jí)之分,具體可以自行了解
想要在內(nèi)核里面向控制臺(tái)輸出或顯示一些內(nèi)容就需要用printk這個(gè)函數(shù)
在驅(qū)動(dòng)入口函數(shù)里面輸入下面代碼
#include<linux/kernel.h>
#include<linux/init.h>printk("chrdevbase_init\r\n");
printk("chrdevbase_exit\r\n");
?添加完成重新編譯和復(fù)制到開(kāi)發(fā)板根文件系統(tǒng)的/lib/modules/4.1.15的目錄下
2、測(cè)試?
?再來(lái)測(cè)試加載驅(qū)動(dòng)和卸載驅(qū)動(dòng)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-449001.html
這里都已經(jīng)打印提示信息,說(shuō)明驅(qū)動(dòng)出口和入口函數(shù)都已經(jīng)執(zhí)行了?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-449001.html
到了這里,關(guān)于Linux驅(qū)動(dòng)3:驅(qū)動(dòng)模塊加載與卸載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!