Linux从未停歇脚步。Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核。做技术,从来没有终南捷径,拼的就是坐冷板凳的傻劲。
这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进、浮躁。内心的不安宁使我们极难静下心来研究什么。我见过许许多多的Linux工程师,他们的简历书写着“精通”Linux内核,有多年的工作经验,而他们的“精通”却只是把某个寄存器从0改成1,从1改成0的不断重复;我见过许许多多的Linux工程师,他们终日埋头苦干,敲打着自己的机器和电路板,却从未冷静下来思考,并不断重构和升华自己的知识体系。
这是要把牢底坐穿的程序员。这样“忙忙碌碌”的程序员,从来都不是什么好程序员。
优秀的程序员,最优秀的品质是能够内心宁静地学习与思考问题,透析代码背后的架构、原理和设计思想。没有思想的代码是垃圾代码,没有思想的程序员,只是在完成低水平重复建设的体力活。很多程序员,连自己写的代码最后在机器里面怎么跑都从不过问,很多事情莫名其妙地发生了,很多bug莫名其妙地消失了……永远都是得过且过。
由此,衍生出《Linux设备驱动开发详解》新版的第一个出发点,那就是带给读者更多关于Linux开发背后思想的讲解,奠定根基。《Linux设备驱动开发详解(基于4.0内核)》呈现给读者的,更多的是一种思考,而不是知识点的简单罗列。
这次更新更进一步加强了对驱动编程所涉及Linux内核最底层机理的讲解,并对前2版的基础理论部分进行了大篇幅地重写,实例代码也被大面积重构。大幅度修改的内容包括中断、定时器、进程生命周期、uevent、并发、编译乱序、执行乱序、等待队列、I/O模型、内存管理等。这些知识点是如此重要,是真正证明程序员对Linux理解的部分,只有打好根基,才能游刃有余。
新版删除了《Linux设备驱动开发详解》第一版、第二版大量描述各种具体具体驱动类型的章节比如Sound、PCI、MTD、TTY等,而将更多焦点转移到了驱动编程背后的内核原理, 并试图从Linux内核上百个驱动子系统中寻找出内部的规律,以培养读者举一反三的能力。
Linux内核有上百个驱动子系统,这一点从内核的drivers子目录就可以看出来:
好吧,傻子才会一个目录一个目录地去看,一个目录一个目录地从头学起。我们势必要寻找各种驱动子系统的共性,摸索规律。本次更新,我们将更多看到各驱动子系统的类比,以及驱动子系统的层次化设计。
技术工作,从来都不是一劳永逸。这世界变化太快,当前技术革新的速度数倍于我们父辈祖辈祖祖辈经过的任何时代。证明你是真球迷还是伪球迷的时候到了。这是伪程序员的地狱,也是真程序员痛苦中的狂欢。
从浩如烟海的知识体系中、不断更新的软件版本中终生学习,不断攻克一个个挑战,获取新的养分,寻找新的灵感,这实在是黑暗码农生涯中不断闪现的璀璨光芒。
自本书第一版、第二版发布后,内核版本不断刷新,3.0、3.1、3.2…3.19、4.0、4.1,变化的是软件的架构,不变的是Linus的热情。
这无疑是本次升级的第二个出发点,更新Linux驱动编程的知识体系以符合最新的时代。所以,本次更新大量新增了关于Device Tree、ARM Linux移植、Linux电源管理、GPIO、clock、timer、pinmux、DMA等的内容。我们的操作平台,也转移到了QEMU模拟的4核Cortex-A9电路板,书中的实例,基本都转移到了市面流行的新芯片。
最近两三年,老是听到许多程序员抱怨,缺乏讲新内核的资料、缺乏从头到尾讲Device Tree的资料,但是我想说,这实在不是什么难点。难点仍然是本书第一个出发点要解决的问题,如果有好的基础,以优秀程序员极强的学习能力,应该很快就可以掌握这些新知识。机制没有变,变化的是只是策略。
所以学习能力,也是优秀程序员的又一品质。没有人生下来就是天才,良好学习能力的培训,本身也是通过不断学习来获取的。可以说,学的越多的人,学新东西一定越快,学习能力也变得越强。因为,知识的共通性实在太多。
读者阅读本书的思路,不应该是企图把它当成一本工具书、查API的书,而是一本梳理完整理论体系、开发思想、软件架构的书。唯如此,我们才能适应未来新的变化。
不知不觉中,离本书的第一次出版已经过去了七个年头。而自本次更新开始实施至今,也经过了一轮寒暑更替。岁月如歌,七载而下,我已非当年的意气青年。本书一版,二版,再版,这实非当初的预料。回首过去,我们惊奇地发现,这七年,正好是Linux由弱而盛,节节胜利的七年。也是许多如我一般的码农成家立业、结婚生子的七年。未来七年的Linux会是什么样子,我们无从预料。本书是否会有更进一步的新版,我们也无法预知,一如Linux没有路线图。社区和生态就是最好的Roadmap,万事随缘,而唯一不变的只是激情。
时代的滚滚车轮,推动着Linux内核的版本不断向前,也推动着每个人的人生。红尘滚滚,
我不去想是否能够成功,
既然选择了远方,
便只顾风雨兼程。
最后,本书能得以出版,要感谢带领我向前的人生导师和我的众多小伙伴,他们或者在我人生的关键时刻改变了我,或者带给了我黑暗程序生涯中无尽的快乐和动力。我的小伙伴,他们力挺我,鼓励我,也辱骂我,奚落我,这些,就是真挚的友情。
谨以此书,致以对杨平先生、何昭然、方毅伟、李华毅、宋志吾、杜向龙、叶祥振、刘昊、王榕、何烨、曾过、刘永生、段炳华、章君义、王文琪、卢鹏、刘涛、徐西宁、吴赫、任桥伟、秦龙廷、胡良兵、张家旺、王雷、Bryan Wu、Eric Miao、Qipan Li、Guoying Zhang、Jiansong Chen、应荣军、Haoyu Zhong、刘洪涛、季久峰、邴杰、孙志忠、吴国举、Bob Liu、赵小吾、贺亚锋、刘仕杰、Hao Yin等老师和小伙伴的深深感激;谨以此书,致以对我的父母大人、老婆大人、兄长和姐姐、伟大丈母娘的深深感激,本书新版的写作时间超过一年,其过程是一种巨大的肉体和精神折磨,没有他们的默默支持和不断鞭策,是不可能完成的;谨以此书,致以对为本书做出巨大贡献的编辑、策划老师们,尤其是张国强老师深深的感激!
由于篇幅的关系,我没有办法一一列举所有我要感激的人入感谢名单。但是,我这些年从你们那里获得的,远远大于我付出的。所以,内心深处,唯有怀着对小伙伴深深的感恩,不断前行。岁月如歌,吾歌狂行。
宋宝华
2015年4月于上海浦东