博客專欄

        EEPW首頁 > 博客 > Linux下編寫和加載 .ko 文件(驅動模塊文件)

        Linux下編寫和加載 .ko 文件(驅動模塊文件)

        發布人:電子禪石 時間:2020-08-10 來源:工程師 發布文章

        一、.ko 文件介紹

        .ko文件是kernel object文件(內核模塊),該文件的意義就是把內核的一些功能移動到內核外邊, 需要的時候插入內核,不需要時卸載。

        二、優點

        (1)這樣可以縮小內核體積;

        (2)使用方便。

        三、.ko文件一般的用處

        (1)作為一個功能模塊,需要使用時,直接插入運行就行。如在imx6上連接模擬攝像頭,先運行模擬攝像頭對應的驅動模塊 camera.ko文件,然后對應的工程執行文件運行就行。

        四、使用.ko 文件1、加載驅動模塊test.ko

        (1)方法一 
        進入test.ko驅動模塊文件所在的目錄,然后直接   insmod  test.ko 

        (2)方法二 
        將test.ko文件拷貝到/lib/module/#uname-r#/目錄下,這里,#uname -r#意思是,在終端中輸入 

        uname -r后顯示的內核版本及名稱,例如mini2440中#uname-r#就是2.6.32.2-FriendlyARM。

        然后 depmod(會在/lib/modules/#uname -r#/目錄下生成modules.dep和modules.dep.bb文件,表明模塊的依賴關系) 

        最后 modprobe test(注意這里無需輸入.ko后綴) 即可

        注:兩種方法的區別

        modprobe和insmod類似,都是用來動態加載驅動模塊的,區別在于modprobe可以解決load module時的依賴關系,它是通過/lib/modules/#uname -

        r/modules.dep(.bb)文件來查找依賴關系的;而insmod不能解決依賴問題。也就是說,如果你確定你要加載的驅動模塊不依賴其他驅動模塊的話,既可以

        insmod也可以modprobe,當然insmod可以在任何目錄下執行,更方便一些。而如果你要加載的驅動模塊還依賴其他ko驅動模塊的話,就只能將模塊拷貝到上

        述的特定目錄,depmod后再modprobe。

        2、查看已加載的驅動模塊列表

        在任何目錄下輸入命令

         

        3、卸載驅動模塊

        在任何目錄下, 輸入命令

        注:“module_name”是lsmod顯示的模塊名稱,而不是對應的ko文件名

        五、編寫生成.ko 文件

        Linux下hello.ko內核模塊制作的全過程

        1. linux系統用的是Redflag 6.0 SP1 下載地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-sp1.iso, 系統安裝很容易,安提示做就好。

        所用的內核源碼目錄樹下載地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-tool-sp1-src1.iso,將此iso文件掛載到/mnt下,安裝其中的內核rpm

        包。

        掛載方法:mount -t iso9660 redflag-6-tool-sp1-src1.iso /mnt/ -o loop

        內核目錄樹安裝方法:cd /mnt/RedFlag/SRMPS/

        1
        rpm -i kernel-2.6.23.1-4.src.rpm

        3. 編寫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. 編寫hello模塊的Makefile文件,Makefile內容如下:  

        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. 編譯模塊
        在命令行進入hello.c所在的文件夾下執行make命令即可完成hello模塊的編譯。用ls命令可以查看到hello.ko文件,此文件就是我們自定義的內核模塊。

         6. 安裝hello模塊

         命令行下執行命令

        1
        insmod hello.ko
        1
        cat /var/log/messages

        可以看到下面這樣的信息:“Aug  6 13:37:59 localhost kernel: Hello, world”,說明模塊加載成功了。  


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 驅動

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 庆安县| 桦南县| 遵义县| 葫芦岛市| 明溪县| 武威市| 兴海县| 莒南县| 肃北| 潍坊市| 达孜县| 紫云| 皮山县| 抚松县| 株洲市| 邹城市| 阳江市| 铜鼓县| 南靖县| 泰州市| 三都| 绥德县| 开封市| 无极县| 安仁县| 寻乌县| 甘肃省| 防城港市| 沭阳县| 平塘县| 睢宁县| 济南市| 道孚县| 栾城县| 青神县| 富宁县| 卢龙县| 汽车| 公安县| 资中县| 井陉县|