Linux设备驱动编程模型(基本编)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux设备驱动程序设计
15年来,Linux从一份大学生的作业演变成了Windows最强劲的竞争对手,在网络、企业、政府和
消费电子市场中逐步占据了重要的地位,在有些领域甚至成了最主要的角色。15年来,Linux在欧洲、在美国、在亚洲向微软发起强劲挑战,以至微软CEO鲍尔默一度相信微软会被Linux击败。
随着Linux进入嵌入式设备领域后,关注和投身Linux开发的开发人员越来越多,但目前市面上介绍Linux开发的资料却非常稀少,很多开发人员感到入行无门,我参照《Linux驱动开发详解》(华清远见,宋宝华)以及其他一些参考资料,编写了本教案,由于时间仓促,没有对应制作相关的ppt,请同学们谅解,希望能给大家一些帮助。
在讲课之前,我们预备把所有的参考资料都列举出来,详细的知识点请大家去对应查找我们所列出的
参考书籍。
1、《Linux程序设计》(人民邮电出版社,陈健等译第3版本)主要关注第18章
2、《Linux驱动开发详解》(华清远见,宋宝华)
3、《嵌入式设计及Linux驱动开发指南-基于ARM9处理器(第2版)》(电子工业出版社,孙天泽)
4、《嵌入式软件调试技术》(电子工业出版社,罗克露等)
5、《嵌入式Linux应用开发详解》(电子工业出版社,洗进等)
6、《嵌入式Linux程序设计案例与实验教程》(机械工业出版社,俞辉)
7、《嵌入式系统课程设计》(机械工业出版社,陈虎等)
还有一些互连网资料,这里就不一一列举了。请大家尽量去找这些资料进行学习。
第一讲Linux设备驱动编程之引言
目前,Linux软件工程师大致可分为两个层次:
(1)Linux应用软件工程师(Application Software Engineer):主要利用C库函数和Linux API进行应用软件的编写;
(2)Linux固件工程师(Firmware Engineer):主要进行Bootloader、Linux的移植及Linux设备驱动程序的设计。
一般而言,固件工程师的要求要高于应用软件工程师的层次,而其中的Linux设备驱动编程又是Linux 程序设计中比较复杂的部分,究其原因,主要包括如下几个方面:
(1)设备驱动属于Linux内核的部分,编写Linux设备驱动需要有一定的Linux操作系统内核基础;
(2)编写Linux设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个特定的嵌
入式硬件平台编写驱动的;
(3)Linux设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现bug;
(4)由于属于内核的一部分,Linux设备驱动的调试也相当复杂。
目前,市面上的Linux设备驱动程序参考书籍非常稀缺,少有的经典是由Linux社区的三位领导者Jonathan Corbet、Alessandro Rubini、Greg Kroah-Hartman编写的《Linux Device Drivers》(目前该书
已经出版到第3版,中文译本由中国电力出版社出版)。该书将Linux设备驱动编写技术进行了较系统的
展现,但是该书所列举实例的背景过于复杂,使得读者需要将过多的精力投放于对例子背景的理解上,很
难完全集中精力于Linux驱动程序本身。往往需要将此书翻来覆去地研读许多遍,才能有较深的体会。
我们这里将仍然秉承《Linux Device Drivers》一书以实例为主的风格,但是实例的背景将非常简单,
以求使读者能将集中精力于Linux设备驱动本身,理解Linux内核模块、Linux设备驱动的结构、Linux设备驱动中的并发控制等内容。另外,与《Linux Device Drivers》所不同的是,针对设备驱动的实例,我还
给出了用户态的程序来访问该设备,展现设备驱动的运行情况及用户态和内核态的交互。相信同学们学习
完本部分内容,将为进一步领悟《Linux Device Drivers》一书中的深一点的内容打下很好的基础。
我们所列举的例程除引用的以外全部已经亲自调试通过,主要基于的内核版本为Linux 2.4,例子要在其他内核上运行只需要做少量的修改。
请注意:驱动程序的开发平台我们建议大家全部采用我们实验室的纯Linux系统下进行,并且在我们
讲完本部分内容讲解适合我们创维特实验箱的JXARM2410-1型评估板上的硬件驱动程序(真正的驱动编写)的时候,建议大家完全采用这种办法。也就是说既不要通过在Windows平台上安装VMWare虚拟机,并在VMWare虚拟机上安装Red Hat的办法(如果开发应用层或者80X86对应的驱动还是可以),也不
要在前面我们在内核编程基本知识当中为了教学而采用的Cygwin平台。但请大家注意,后两种办法并非
说完全地不能开发异构系统(即非80X86的CPU)的驱动程序,只是因为还要做很多设置,相当麻烦,
所以我们仅仅介绍在纯粹Linux系统下的开发驱动的标准方法。
第二讲Linux设备驱动编程之内核模块
Linux设备驱动属于内核的一部分,Linux内核的一个模块可以以两种方式被编译和加载:
(1)直接编译进Linux内核,随同Linux启动时加载;
(2)编译成一个可加载和删除的模块,使用insmod加载(modprobe和insmod命令类似,但依赖于相关的配置文件),rmmod删除。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其
他部分一样。
下面我们给出一个内核模块的例子:
#include
#include
MODULE_LICENSE("GPL");
static int __init hello_init (void)
{
printk("Hello module init\n");
return 0;
}
static void __exit hello_exit (void)