zoukankan      html  css  js  c++  java
  • Linux下编写和加载 .ko 文件(驱动模块文件)

    一、.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/

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

    3. 编写hello模块代码,源码如下:  

    hello.c

    #include <linux/init.h>  
    #include <linux/module.h>  
      
    MODULE_LICENSE("GPL");  
    static int hello_init(void)  
    {  
      printk(KERN_ALERT "Hello, world
    ");  
      return 0;  
    }  
    static void hello_exit(void)  
    {  
      printk(KERN_ALERT "Goodbye, cruel world
    ");  
    }  
      
    module_init(hello_init);  
    module_exit(hello_exit);  
    

    4. 编写hello模块的Makefile文件,Makefile内容如下:  

    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模块

     命令行下执行命令

    insmod hello.ko
    cat /var/log/messages 
    

    可以看到下面这样的信息:“Aug  6 13:37:59 localhost kernel: Hello, world”,说明模块加载成功了。  

     

  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/10225115.html
Copyright © 2011-2022 走看看