Linux设备驱动编程模型(基本编)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 // init&exit相关宏

MODULE_LICENSE("GPL");

static int __init hello_init (void)

{

printk("Hello module init\n");

return 0;

}

static void __exit hello_exit (void)

相关文档
最新文档