天天看点

《Linux设备驱动开发详解 A》导读

linux从未停歇前进的脚步。linus torvalds,世界上最伟大的程序员之一,linux内核的创始人,git的缔造者,现在仍然在没日没夜地合并补丁、升级内核。做技术的人,从来没有终南捷径,拼得就是坐冷板凳的傻劲。

这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进、浮躁,内心的不安宁使我们极难静下心来研究什么。我见过许多linux工程师,他们的简历上写着“精通”linux内核,有多年的工作经验,而他们的“精通”却只是把某个寄存器从0改成1,从1改成0的不断重复;我也见过许多linux工程师,他们终日埋头苦干,敲打着自己的机器和电路板,却从未冷静下来思考,并不断重构和升华自己的知识体系。

这是要把“牢底”坐穿的程序员,这样“忙忙碌碌”的程序员,从来都不算是好程序员。

对于优秀的程序员,其最优秀的品质是能够心平气和地学习与思考问题,透析代码背后的架构、原理和设计思想。没有思想的代码是垃圾代码,没有思想的程序员,只是在完成低水平重复建设的体力活。很多程序员从不过问自己写的代码最后在机器里面是怎么跑的,很多事情莫名其妙地发生了,很多bug莫名其妙地消失了……他们永远都在得过且过。

由此,衍生出了本书的第一个出发点,那就是带给读者更多关于linux开发思想的讲解,帮助读者奠定根基。本书呈现给读者的更多的是一种思考方法,而不是知识点的简单罗列。

本书除对基础理论部分进行了详细的讲解外,还加强了对驱动编程所涉及的linux内核最底层机理的讲解,内容包括中断、定时器、进程生命周期、uevent、并发、编译乱序、执行乱序、等待队列、i/o模型、内存管理等。这些知识点非常重要,是真正证明程序员理解了linux的部分内容,程序员只有打好根基,才能游刃有余。

本书没有大量描述各种具体驱动类型的章节,如sound、pci、mtd、tty等,而将更多的焦点转移到了驱动编程背后的内核原理,并试图从linux内核的上百个驱动子系统中寻找出内部规律,以培养读者举一反三的能力。

linux内核有上百个驱动子系统,这一点从内核的drivers子目录中就可以看出来:

好吧,傻子才会一个目录一个目录地去看,一个目录一个目录地从头学起。我们势必要寻找各种驱动子系统的共性,摸索规律。在本书中,我们将更多地看到各驱动子系统的类比,以及驱动子系统的层次化设计。

技术工作从来都不能一劳永逸。世界变化得太快,当前技术革新的速度数倍于我们父辈、祖辈、祖祖辈经历过的任何时代。证明你是“真球迷”还是“伪球迷”的时候到了,这个时代是伪程序员的地狱,也是真程序员的天堂。

从浩如烟海的知识体系、不断更新的软件版本中终生学习,不断攻克一个个挑战,获取新养分,寻找新灵感,这实在是黑暗的码农生涯中不断闪现的璀璨光芒。

linux的内核版本不断更新,出现了linux 3.0、linux 3.1、linux 3.2、…、linux 3.19、linux 4.0、linux 4.1,变化的是软件的架构,不变的是linus的热情。

这无疑也是本书的第二个出发点,更新linux驱动编程的知识体系以迎合最新的时代需求。因此,本书有大量关于设备树、arm linux移植、linux电源管理、gpio、时钟、定时器、pinmux、dma等内容。我们的操作平台也转移到了qemu模拟的4核cortex-a9电路板上,书中的实例基本都转移到了市面流行的新芯片上。

最近两三年,老是听许多程序员抱怨,市面上缺乏讲解新内核的资料、缺乏从头到尾讲解设备树的资料,但是我想说,这实在不是什么难点。难点仍然是本书基于第一个出发点要解决的问题,如果有好的基础,以优秀程序员极强的学习能力,应该很快就可以掌握这些新知识。机制没有变,变化的只是策略。

因此学习能力也是优秀程序员的又一个重要品质。没有人生下来就是天才,良好的学习能力也是通过后天的不断学习培养的。可以说,学得越多的人,学新东西的速度一定越快,学习能力也变得越强。因为,知识的共通性实在太多。

读者在阅读本书时,不应该企图把它当成一本工具书和查api的书,而是应该把它当作一本梳理理论体系、开发思想、软件架构的书。唯如此,我们才能适应未来新的变化。

<a href="https://yq.aliyun.com/articles/109254">1.2 无操作系统时的设备驱动</a>

<a href="https://yq.aliyun.com/articles/109256">1.3 有操作系统时的设备驱动</a>

<a href="https://yq.aliyun.com/articles/109259">1.4 linux设备驱动</a>

<a href="https://yq.aliyun.com/articles/109262">1.5 linux设备驱动的开发环境构建</a>

<a href="https://yq.aliyun.com/articles/109291">2.2 存储器</a>

[2.3 接口与总294)

<a href="https://yq.aliyun.com/articles/109298">2.4 cpld和fpga</a>

<a href="https://yq.aliyun.com/articles/109298">2.5 原理图分析</a>

<a href="https://yq.aliyun.com/articles/109303">2.6 硬件时序分析</a>

<a href="https://yq.aliyun.com/articles/109306/">2.7 芯片数据手册阅读方法</a>

<a href="https://yq.aliyun.com/articles/109309">2.8 仪器仪表使用</a>

<a href="https://yq.aliyun.com/articles/109320/">3.2 linux 2.6后的内核特点</a>

<a href="https://yq.aliyun.com/articles/109324">3.3 linux内核的组成</a>

<a href="https://yq.aliyun.com/articles/109330">3.4 linux内核的编译及加载</a>

<a href="https://yq.aliyun.com/articles/109337">3.5 linux下的c编程特点</a>

<a href="https://yq.aliyun.com/articles/109342">3.6 工具链</a>

<a href="https://yq.aliyun.com/articles/109343">3.7 实验室建设</a>

<a href="https://yq.aliyun.com/articles/109346">3.8 串口工具</a>

继续阅读