Linux设备驱动01
准备:
1、英语-是工具
2、电路原理图-补充“数电”的知识
3、阅读内核代码的能力
linux:vi+ctags+cscope
windows:source insight
驱动开发的步骤
I、编辑
模块的组成:
1、许可证的声明,许可证通常使用GPL协议,如果不声明许可证内核会产生“抱怨”信息,同时内核中的一些遵循GPL协议的功能函数将会无法使用,造成驱动功能受限。
2、加载函数,初始化模块,在使用insmod加载驱动模块时自动调用,该函数必须声明为int init_module(void),insmod调用时会自动加载这个函数。
3、卸载函数,恢复函数,在使用rmmod卸载驱动模块时会自动调用,函数必须声明为void cleanup_module(void),rmmod会自动调用这个函数。
完整示例代码:
hello.c
/**
* 驱动示例程序
* 实现驱动的加载和卸载
*/
//引入相应的头文件,内核和模块的头文件
#include <linux/kernel.h>
#include <linux/module.h>
//声明许可证信息,也可以使用这个来声明许可证
//MODULE_LICENSE("Dual BSD/GPL")
//这表示支持BSD和GPL两种协议
MOUDLE_LICENSE("GPL");
//insmod自动加载的函数,必须如此声明
int init_module(void)
{
//内核中打印信息,需要使用printk函数
printk("Hello world!!!");
return 0;
}
//rmmod自动调用的函数,必须如此声明
void cleanup_module(void)
{
printk("goodbey!!!");
}
保存
II、编译
使用内核的编译文件
1、拷贝代码到内核文件中;
2、修改对应的Kconfig/Makefile文件
3、使用make menuconfig命令选中对应的菜单项,<*>表示编译进内核,<M>表示编译成模块。
4、编译
make zImage
make modules
前者编译内核,后者编译模块,编译完成后生成相应的xxx.ko文件。

外部模块的编译,上面的方法必须要到内核的源文件中修改Kconfig和Makefile,实际操作中比较复杂,通常我们会采用这种编译方法。
使用内核文档查看编译的方法,进入Linux内核目录下的Documentation
使用命令make –C <path-to-kernel> M=`pwd`命令进行编译,该命令的使用依赖于内核源码树,必须针对特定的硬件平台,并且有编译过的内核。

其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用该命令提示错误,是因为在当前目录中缺少Makefile文件,现在建立Makefile文件输入以下代码:
obj-m += hello.o
保存再次编译

编译通过。
我们还可以通过一个通用的Makefile文件来完成这个步骤
代码如下:
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean:
rm -rvf *.o *.ko *.mod.c module* Module*
.PHONY:modules clean
else
#修改hello.o文件为自己需要的文件即可
obj-m += hello.o
endif
编译生成hello.ko模块
III、测试
1、插入模块
sudo insmod hello.ko
当前的终端并没有显示输出的信息,这是因为终端默认会屏蔽掉所有的内核信息,解决方法有:
1、切入物理终端
2、使用dmesg显示当前的日志信息
3、vi /var/log/messages显示日志信息

2、lsmod列出当前系统动态加载的模块
3、rmmod hello 卸载模块,成功卸载的前提是存在/lib/modules/$(shell uname -r)/build目录
4、modinfo显示模块的信息
modinfo hello.ko显示如下信息:

5、modprobe 模块名-按依赖关系加载所有的模块,使用不多。
Linux设备驱动01的更多相关文章
- linux设备驱动第四篇:驱动调试方法
http://www.cnblogs.com/donghuizaixian/archive/2015/04/02/4387083.html 上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神, ...
- linux设备驱动第四篇:从如何定位oops的代码行谈驱动调试方法
上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序 ...
- (转)Linux设备驱动之HID驱动 源码分析
//Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...
- 浅谈Android系统移植、Linux设备驱动
一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- Linux设备驱动工程师之路——内核链表的使用【转】
本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...
- linux设备驱动归纳总结(十二):简单的数码相框【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
随机推荐
- pg 资料大全1
https://github.com/ty4z2008/Qix/blob/master/pg.md?from=timeline&isappinstalled=0 PostgreSQL(数据库) ...
- sql中的or的用法说明
数据库里a c 0 10 20 31 41 51 6这样执行完这语句之后查出来有几条语句? 答案是3条 而我想要的是a为0或1并且c为3的数据显示 应该只有1条的 所以应该这样写 Sql ...
- Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable--转载
原文地址: @RequestMapping is one of the most widely used Spring MVC annotation.org.springframework.web.b ...
- iOS 开发之— NSURLProtocol
最近在项目里由于电信那边发生dns发生域名劫持,因此需要手动将URL请求的域名重定向到指定的IP地址,但是由于请求可能是通过NSURLConnection,NSURLSession或者AFNetwor ...
- [JavaEE] SSH框架笔记_S.S.H框架各自的优缺点
Struts的原理和优点.Struts工作原理MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化.M ...
- Parallel.ForEach() 并行循环
现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...
- Dapper ORM 用法
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K ...
- 使用PIL处理image
获得一个Image实例 import Image im = Image.open('1.jpg') #返回一个Image对象,open只对图片的头做处理,所以open操作是非常快的 resize,裁剪 ...
- iframe跨域自适应高度
思路: 现有主界面main在域a下,被嵌套页面B在域b下,被嵌套页面B又嵌套一个在域a下的中介页面A. 当用户打开浏览器访问mail.html的时候载入B,触发B的onload事件获取其自身高度,然后 ...
- CentOS 7 使用外部邮箱 发送邮件和附件—mail,mailx
1.查看软件包是否安装 [root@localhost ~]# rpm -qa|grep mail mailx-12.5-12.el7_0.x86_64 javamail-1.4.6-8.el7.no ...