本书结合大量实例,在基于ARM Cortex-A9四核处理器Exynos4412的硬件教学平台和PC机上,全面详细讲解了Linux设备驱动开发。主要内容包含开发环境的搭建,内核模块,字符设备驱动框架,高级I/O,中断和时间管理,互斥和同步,内存和DMA,Linux设备模型,外设的驱动实例,总线类设备驱动,块设备驱动,网络设备驱动和内核调试技巧。对每一个知识点都有一个对应的典型实例,大多数实例既可以在上面说到的嵌入式平台上运行,也可以在PC机上运行。
暂无
前言
随着嵌入式及物联网技术地快速发展,ARM处理器已经广泛地应用到了工业控制、智能仪表、汽车电子、医疗电子、军工电子、网络设备、消费类电子、智能终端等领域。而较新的ARM Cortex-A9架构的四核处理器更是由于其优越的性能被广泛应用到了中高端的电子产品市场。比如基于ARM Cortex-A9的三星Exynos4412处理器就被应用在了三星GALAXY Note II智能手机上。
另外,Linux内核由于其高度的稳定性和可裁剪性等特点,被广泛地应用到了嵌入式系统,Android系统就是一个典型的例子。这样,ARM处理器就和Linux操作系统紧密地联系在了一起。所以,基于ARM和Linux的嵌入式系统就得到了快速的发展。
嵌入式系统是一个定制的系统,所以千变万化、形形色色的硬件都必须要有对应的驱动才能使其正常工作,为这些硬件设备编写驱动就是不可避免的了。虽然有很多内核开发人员已经为很多常见的硬件开发了驱动,但是驱动的升级一般都跟不上新硬件的升级。笔者就多次遇到过内核的驱动和同一系列的升级版本芯片不匹配的情况,这时就要改写驱动程序。所以内核层次的底层开发几乎都要和驱动打交道。另外,了解驱动(或者说内核)的一些底层工作原理,也有助于我们写出更稳定、更高效的应用层代码。
为了能够实现这一目标,并促进嵌入式技术的推广,华清远见研发中心自主研发了一套基于Exynos4412处理器的开发板FS4412,并组织编写了本书。本书注重实践、实用,没有用长篇大论来反复强调一些旁枝末节的内容,但是对于会影响理解的部分又非常详细地分析了内核源码,并给出了大量的图示。书中的各个实例虽然为了突出相关的知识重点而简化了对某些问题的讨论,不能称得上工程上严格意义的好驱动,但是确实也具备了对应的设备驱动开发所必需的各方面。实例按照工程上驱动开发的增量式方式来进行,即先有主体再逐渐完善,循序渐进。读者按照实例能够迅速掌握对应驱动的开发精要,对整个驱动的实现也就有了一个清晰的思路。
本书共14章,循序渐进地讲解了嵌入式Linux设备驱动开发所涉及的理论基础和大量API说明,并配有大量驱动实例。全书主要分为五部分:第一部分是Linux设备驱动开发的概述,包含第1章;第二部分是模块及字符设备驱动的理论,包含第2~8章;第三部分是字符设备驱动实例,包含第9章和第10章;第四部分是Linux块设备驱动和网络设备驱动,包含第11章和第12章;最后一部分是Linux内核的调试和开发环境的搭建,包含第13章和第14章。各章节的主要内容如下。
第1章概述了需要了解Linux驱动程序的人群、Linux驱动开发的特点和本书其他各章节的核心内容。
第2章对Linux内核的模块进行了介绍,现在的驱动几乎都以Linux内核模块的形式来实现,所以这是后续的基础。
第3章讲解Linux字符设备驱动的主体框架,并以一个假想的串口来实现驱动。这是Linux设备驱动入门的关键,所以分析了大量的内核源码。当然,这个驱动是不完善的,需要在后面的各章节逐步添加功能。
第4章在上一章的基础上探讨了字符设备的高级I/O操作,包括ioctl、阻塞、I/O多路复用、异步通知、mmap、定位等,还特别介绍了proc相关的接口。
第5章讲解中断和时间管理,为便于理解,特别加入了中断进入的内核源码分析。时间管理则包含了延时和定时两部分,在定时部分还讨论了新内核中的高分辨率定时器。
第6章讲解了互斥和同步,为了让读者明白互斥对驱动开发的重要性,特别从ARM汇编的层次来讨论了竞态。除了对传统的互斥(自旋锁、信号量等)进行讨论外,还特别说明了RCU机制和使用的范例。
第7章讲解了内核中内存的各种分配方式,还特别谈到了per-CPU变量的使用。最后,对DMA的讨论则专注于新内核引入的dmaengine子系统,并用一个实例进行了具体的展现。
第8章讲解了Linux设备模型,这部分内容比较抽象。为了能帮助读者理解这部分内容,专门实现了设备、总线、驱动三个最简单的实例,从而使读者完全掌握三者之间的关系。这一章的后半部分有大量实用技术的展现,包括电源管理、驱动的自动加载、设备节点的自动创建等。最后还讲解了较新的内核引入的ARM体系结构的设备树。
第9章在前面的理论基础上实现了大量外设的驱动。这些驱动并不都是通过字符设备框架来实现的,目的就是想告诉读者,如果我们能够简化驱动的编写,就尽量简化驱动的编写,多使用内核中已经实现的机制。
第10章讲解了总线类设备驱动的开发,对流行的I2C总线、SPI总线、USB总线和PCI总线都进行了讨论。这些总线都有一个共同的特性,就是都有主机控制器和连接在总线上的设备,我们只讨论了在主机控制器驱动之上的设备驱动,不讨论主机控制器驱动及设备自身的固件或驱动,因为设备驱动是最常开发的驱动。
第11章讲解了块设备驱动,为了便于读者对这部分知识进行理解,特别介绍了磁盘的内部结构,然后用内存虚拟了一个磁盘,用两种方式实现了该虚拟磁盘的块设备驱动。
第12章讲解了网络设备驱动,用一个虚拟的环回以太网卡的驱动展现了网络设备驱动的主体框架,还分析了DM9000网卡驱动的主体框架部分,并和前面的虚拟网卡驱动进行了对比。
第13章介绍了内核的一些调试技术。内核的调试相对来说比较麻烦,但只要能熟练使用这些调试技术,还是能较快找出问题所在的。
第14章是嵌入式Linux设备驱动开发环境的搭建,包含了主机系统的准备和各个软件的安装。尤其是用vim搭建了一个适合于驱动开发的类似于IDE的编辑环境,能够大大提高代码的编写效率。
本书由华清远见成都中心的姜先刚编写,北京中心的刘洪涛承担全书的统稿及审校工作,是贾燕枫、杨曼、袁祖刚、关晓强、谭翠君、李媛媛、张丹、张志华、曹忠明、苗德行、冯利美、卢闫进、蔡蒙等老师心血的结晶,也是他们多年教学成果的积累。他们认真阅读了书稿,提出了大量的建议,并纠正了书稿中的很多错误,在此特表示感谢。
由于作者水平有限,书中不妥之处在所难免,恳请读者批评指正。对于本书的批评和建议,可以发表到www.farsight.com.cn技术论坛。
编 者
2017年3月
你好,本书,139和140页,书写错误,GPF_**,应该是GFP_**
适合有基础的人,不然头会看晕。而且没有找到源码呀。
買書竟然下不到源碼…….. 剛剛在網上看到有人在賣 就買了 上傳給想學driver的人 https://pan.baidu.com/s/171cFt0tDMcNYkoipud2YmQ
压缩文件已损坏
求配書代碼載點,附件連結壞了。