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

         一直想学习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打印输出。



     

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值