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打印输出。
最新文章
- Android笔记——BaseAdapter的使用
- 了解JavaScript 面向对象基础 &; 原型与对象
- 关于scrollWidth,clientWidth,offsetWidth
- 一句话在网页右上角加一个精致下拉框:forkme on github
- 为什么要使用 F#?
- Thread .join 的用法一例
- linux编码
- PHP 向 MySql 中数据修改操作时,只对数字操作有效,非数字操作无效,怎么办?
- linux awk命令学习
- android Failure [INSTALL_FAILED_OLDER_SDK] 安装apk失败
- MySQL INSERT DELAYED
- imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Corrupt JPEG data: 1 extraneous bytes be
- SDUT 2351 In Danger
- Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示
- Docker Machine 详解
- 201521123088《Java程序设计》第6周学习总结
- linux三剑客之一grep
- Python基础(4)列表、元组、字符串、字典、集合、文件操作
- 解决win10无线无故断网,重启才恢复正常的情况【原】
- django 获取错误信息
热门文章
- 【转】虚拟机克隆之后,网卡名称从eth0变成eth1之后的解决办法
- windows7中用vitualbox安装OS X 10.11 El Capitan 及 Xcode 7.0--转载
- 前端PHP入门-019-内置函数之数学函数-很重要
- Oracle用imp导入dmp文件记录一下
- 51nod 1171 大灾变
- Distance Gym - 102028I (思维)
- Attention is all you need 论文详解(转)
- 安装 Google BBR 加速VPS网络
- python模块分析之sqlite3数据库
- option和 usb-serial驱动基本区别