Linux下編寫(xiě)和加載 .ko 文件(驅(qū)動(dòng)模塊文件)
一、.ko 文件介紹
.ko文件是kernel object文件(內(nèi)核模塊),該文件的意義就是把內(nèi)核的一些功能移動(dòng)到內(nèi)核外邊, 需要的時(shí)候插入內(nèi)核,不需要時(shí)卸載。
二、優(yōu)點(diǎn)
(1)這樣可以縮小內(nèi)核體積;
(2)使用方便。
三、.ko文件一般的用處
(1)作為一個(gè)功能模塊,需要使用時(shí),直接插入運(yùn)行就行。如在imx6上連接模擬攝像頭,先運(yùn)行模擬攝像頭對(duì)應(yīng)的驅(qū)動(dòng)模塊 camera.ko文件,然后對(duì)應(yīng)的工程執(zhí)行文件運(yùn)行就行。
四、使用.ko 文件1、加載驅(qū)動(dòng)模塊test.ko
(1)方法一
進(jìn)入test.ko驅(qū)動(dòng)模塊文件所在的目錄,然后直接 insmod test.ko
(2)方法二
將test.ko文件拷貝到/lib/module/#uname-r#/目錄下,這里,#uname -r#意思是,在終端中輸入
uname -r后顯示的內(nèi)核版本及名稱,例如mini2440中#uname-r#就是2.6.32.2-FriendlyARM。
然后 depmod(會(huì)在/lib/modules/#uname -r#/目錄下生成modules.dep和modules.dep.bb文件,表明模塊的依賴關(guān)系)
最后 modprobe test(注意這里無(wú)需輸入.ko后綴) 即可
注:兩種方法的區(qū)別
modprobe和insmod類似,都是用來(lái)動(dòng)態(tài)加載驅(qū)動(dòng)模塊的,區(qū)別在于modprobe可以解決load module時(shí)的依賴關(guān)系,它是通過(guò)/lib/modules/#uname -
r/modules.dep(.bb)文件來(lái)查找依賴關(guān)系的;而insmod不能解決依賴問(wèn)題。也就是說(shuō),如果你確定你要加載的驅(qū)動(dòng)模塊不依賴其他驅(qū)動(dòng)模塊的話,既可以
insmod也可以modprobe,當(dāng)然insmod可以在任何目錄下執(zhí)行,更方便一些。而如果你要加載的驅(qū)動(dòng)模塊還依賴其他ko驅(qū)動(dòng)模塊的話,就只能將模塊拷貝到上
述的特定目錄,depmod后再modprobe。
2、查看已加載的驅(qū)動(dòng)模塊列表
在任何目錄下輸入命令
3、卸載驅(qū)動(dòng)模塊
在任何目錄下, 輸入命令
注:“module_name”是lsmod顯示的模塊名稱,而不是對(duì)應(yīng)的ko文件名
五、編寫(xiě)生成.ko 文件
Linux下hello.ko內(nèi)核模塊制作的全過(guò)程
1. linux系統(tǒng)用的是Redflag 6.0 SP1 下載地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-sp1.iso, 系統(tǒng)安裝很容易,安提示做就好。
所用的內(nèi)核源碼目錄樹(shù)下載地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-tool-sp1-src1.iso,將此iso文件掛載到/mnt下,安裝其中的內(nèi)核rpm
包。
掛載方法:mount -t iso9660 redflag-6-tool-sp1-src1.iso /mnt/ -o loop
內(nèi)核目錄樹(shù)安裝方法:cd /mnt/RedFlag/SRMPS/
1 | rpm -i kernel-2.6.23.1-4.src.rpm |
3. 編寫(xiě)hello模塊代碼,源碼如下:
hello.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world\n"); } module_init(hello_init); module_exit(hello_exit); |
4. 編寫(xiě)hello模塊的Makefile文件,Makefile內(nèi)容如下:
1 2 3 4 5 6 7 8 | obj-m :=hello.o KERNEL :=/usr/src/kernels/$(uname -r)/ PWD :=$(shell pwd) modules : $(MAKE) -C $(KERNEL) M=$(PWD) modules .PHONEY:clean clean : rm -f *.o *.ko |
5. 編譯模塊
在命令行進(jìn)入hello.c所在的文件夾下執(zhí)行make命令即可完成hello模塊的編譯。用ls命令可以查看到hello.ko文件,此文件就是我們自定義的內(nèi)核模塊。
6. 安裝hello模塊
命令行下執(zhí)行命令
1 | insmod hello.ko |
1 | cat /var/log/messages |
可以看到下面這樣的信息:“Aug 6 13:37:59 localhost kernel: Hello, world”,說(shuō)明模塊加載成功了。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。