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. Android笔记——BaseAdapter的使用
  2. 了解JavaScript 面向对象基础 &amp; 原型与对象
  3. 关于scrollWidth,clientWidth,offsetWidth
  4. 一句话在网页右上角加一个精致下拉框:forkme on github
  5. 为什么要使用 F#?
  6. Thread .join 的用法一例
  7. linux编码
  8. PHP 向 MySql 中数据修改操作时,只对数字操作有效,非数字操作无效,怎么办?
  9. linux awk命令学习
  10. android Failure [INSTALL_FAILED_OLDER_SDK] 安装apk失败
  11. MySQL INSERT DELAYED
  12. imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 1 extraneous bytes be
  13. SDUT 2351 In Danger
  14. Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示
  15. Docker Machine 详解
  16. 201521123088《Java程序设计》第6周学习总结
  17. linux三剑客之一grep
  18. Python基础(4)列表、元组、字符串、字典、集合、文件操作
  19. 解决win10无线无故断网,重启才恢复正常的情况【原】
  20. django 获取错误信息

热门文章

  1. 【转】虚拟机克隆之后,网卡名称从eth0变成eth1之后的解决办法
  2. windows7中用vitualbox安装OS X 10.11 El Capitan 及 Xcode 7.0--转载
  3. 前端PHP入门-019-内置函数之数学函数-很重要
  4. Oracle用imp导入dmp文件记录一下
  5. 51nod 1171 大灾变
  6. Distance Gym - 102028I (思维)
  7. Attention is all you need 论文详解(转)
  8. 安装 Google BBR 加速VPS网络
  9. python模块分析之sqlite3数据库
  10. option和 usb-serial驱动基本区别