现在的位置: 首页 > 综合 > 正文

Linux驱动最简单驱动——-helloworld

2018年03月16日 ⁄ 综合 ⁄ 共 1559字 ⁄ 字号 评论关闭

         一直想学习Linux驱动开发,却一直没有时间,现在手头事儿终于轻松了!开始进行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!\n");
                return 0;
          }

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

        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打印输出。

     

抱歉!评论已关闭.