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”,说明模块加载成功了。  

     

  • 相关阅读:
    【eclipse】Server Tomcat v9.0 Server at localhost failed to start.
    【eclipse】运行maven项目clean tomcat7:run报错
    window下安装redis报错: creating server tcp listening socket 127.0.0.1:6379: bind No error
    【eclipse】svn在线安装
    【eclipse】点Clean后没反应
    谷歌浏览器&360浏览器安装——有道云笔记插件
    阿里云企业邮箱设置
    PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
    最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构
    精选Pycharm里6大神器插件
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/10225115.html
Copyright © 2011-2022 走看看