• linux 驱动程序 HelloWorld


    Linux驱动可以直接编译进内核,也可以以模块的形式进行加载,前者比较复杂,本文就以模块的形式加载!

    vi helloi_driver.c

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>


    static int __init hello_init(void)
    {
    printk(KERN_ALERT "hello driver init! ");
    return 0;
    }

    static void __exit hello_exit(void)
    {
    printk(KERN_ALERT "hello driver exit ");
    }

    module_init(hello_init);
    module_exit(hello_exit);

    程序很简单,没有什么说的。关键时驱动的Makefile文件。

    ifneq ($(KERNELRELEASE),)

    obj-m :=hello_driver.o

    else

    KERNELDIR ?=/lib/modules/$(shell uname -r)/build

    PWD := $(shell pwd)

    modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

    endif

    clean:
    rm -rf *.o *~ .depend .* .

    分析上述Makefile文件,KERNELRELEASE时内核源代码顶层所定义的一个变量,当Makefile第一次执行时,这个变量并没有定义,因此直接执行else中的内容,uname -r命令输出当前系统所使用的版本号,/lib/modules/$(shell uname -r)/build这个就是Linux源码所在的目录,当执行到modules时,-C $(KERNELDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。

    当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

    obj-m后面跟的就是最终的模块名,hello_driver.o,make 会在该目录下自动找到hello_driver.c文件进行编译

    hello_driver.o可能依赖多个文件或者模块,那么在obj-m后面就可以添加下面语句hello _driver-objs:=file.o file1.o

    modules目标指向obj-m变量中设定的模块。

    最后通过insmod加载驱动模块,用rmmod卸载模块,此外还有两个关于模块的命令:lsmod modprob modinfo,lsmod用来列出所有的模块,modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。

    上面加载模块的例子在加载和卸载的过程中,就会有信息输出,通过dmesg打印输出。

  • 相关阅读:
    vue-router HTML5 History 模式(转自官网)
    使用fastjson解析数据后导致顺序改变问题
    Mybatis一对多或多对多只能查出一条数据解决策略
    mybatis 学习教程
    Mybatis根据List批量查询List结果
    @Param注解的用法解析
    关于mybatis使用小于号大于号出错的解决方案
    if test表达式逻辑判断不能用&&
    MyBatis中传入参数parameterType类型详解
    MyBatis 判断条件为等于的问题
  • 原文地址:https://www.cnblogs.com/mingzhang/p/9094111.html
Copyright © 2020-2023  润新知