美文网首页
Linux内核驱动模块动态加载

Linux内核驱动模块动态加载

作者: 代码DJ | 来源:发表于2017-11-13 18:34 被阅读0次

    在命令行中运行,创建驱动源码
    echo '' > HelloWorld.c
    创建编译规则文件
    echo 'obj-m := HelloWorld.o' > Makefile
    上面的 obj-m 意思是将驱动作为模块(.ko 文件)编译,还有一种选项是obj-y这个的作用是将驱动编译进内核。
    .ko文件可以被动态的加载进内核,也可以从内核中移除。

    驱动中如果有依赖其他程序,在Makefile文件中添加 模块名称-y := 库名.o 库名1.o

    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/fs.h>
    
    static int hello_world_init(void){
    printk("hello world init seccess");
    return 0;
    }
    
    static void hello_world_exit(void){
    printk("hello world init exit success");
    }
    
    module_init(hello_world_init);
    module_exit(hello_world_exit);
    
    

    上面的printk跟printf是一样的,但是两个函数所运行的内存空间是不一样的,也就是内核空间用不了printf函数。

    接着将HelloWorld.c驱动源码进行编译

    make -C /usr/src/linux-headers-版本号-generic M=HelloWorld.c的路径
    

    这里需要注意,这里的版本号必须要跟宿主系统上的使用的内核版本一致。否则编译不能通过。

    在完成编译之后,需要将驱动进行安装
    insmod HelloWorld.ko
    查看是否安装成功:
    lsmod | grep HelloWorld
    卸载驱动
    rmmod HelloWorld
    查看驱动输出的日志
    dmesg | grep HelloWorld | tail -n 2

    在编写驱动程序的时候,需要注意的一点是,老版本的内核驱动编译可以允许不写入modinfo数据。高版本内核是需要进行填写的,如果不写,那么将会编译不能通过。

    MODULE_AUTHOR(""); 模块作者
    MODULE_DESCRIPTION(""); 模块描述
    MODULE_ALIAS(""); 模块别名
    MODULE_LICENSE(""); 开源协议

    后面再详细的理解一下开源协议。

    相关文章

      网友评论

          本文标题:Linux内核驱动模块动态加载

          本文链接:https://www.haomeiwen.com/subject/iqozmxtx.html