前 言(序)——《嵌入式系统Linux内核开发实战指南(ARM平台)》
2007年8月,我从上家公司辞职出来,放弃了刚上市公司骨干中层干部的职位,放弃了丰厚的待遇。
自1996年毕业以来,我一直从事嵌入式系统和Linux内核一线技术开发工作,我所承担的任务和项目基本都是由自己独立完成,即使担任了硬件部主管或技术总监职务,我对自己专长的工作仍是亲历亲为的。一方面,自己热爱这项工作,每攻克一个难题都能体验到莫大的成就感(相信技术工程师都有过这种体会);另一方面,目前国内做嵌入式系统和Linux内核开发的工程师供不应求,水平高的更是奇缺,相关职位的待遇相对其他职位的偏高,少招一个新员工就为公司节省一笔开支,减轻一份负担,所以对于比较简单和事务性的工作我会安排给其他员工,而难度大的工作我几乎都亲自上阵。我习惯加班,来了兴致甚至通宵达旦,凭着这股干劲,经过多年实践积累,自己常能在短时间内解决很多人长时间没有解决的问题。在我工作中接触到Linux之初,为了更好更深入地学习嵌入式系统和Linux内核开发技能,我在业余时间自己花钱设计制作了MC68VZ328和S3C4510两种开发板以及简易JTAG下载、烧写线缆,并成功移植、固化Clinux到这两个开发板上——到目前为止,我已经在当今流行的各种嵌入式硬件平台(包括单片机、MC68K、PowerPC、ARM、MIPS、DSP)和嵌入式操作系统(包括VRTX、VxWorks、PSOS、Linux)上都做过实际开发工作,编写、移植或者调试过UART、Ethernet、I2C、HDLC+E1、LCD、Keyboard、VFD、SCSI、SATA、IDE、CVBS、VGA、PCI、USB等接口和设备的驱动程序。
在与Linux打交道的这么多年里,我一心想把这个开放源码的优秀操作系统吃透,并理所当然地觉得,随着时间的推移和所做项目的增多,自己一定会逐渐认识Linux内核的真实面目;可是一直以来,每当我想在脑海中对Linux内核各组件及其原理进行全面系统概括描述时却总是如鲠在喉,不得其解,这让我心里一直潜藏着一丝隐忧和茫然:由于不了解Linux内核原理,尽管自己能凭借10多年的工作经验通过适当方法很快把任务完成、把难题解决,但却不能在碰到难题一开始就从原理上把握应该从哪儿下手,怎样做、做什么,缺乏全局预见性和高瞻远瞩的能力,这种心中“没底”的感觉驱使我去更深入钻研、发掘,去力争做到心中“有底”;这也让我意识到,虽然经过10多年的勤奋工作,自己已经积累了足够的工作经验,不过由于平时很少阅读理论书籍和Linux内核源代码,Linux内核原理知识并没有像我原来想象的那样自然而然地装进自己的大脑,所以自己的理论水平仍然很欠缺,要想提高就必须经过一个艰苦的沉淀过程;由于平时工作忙、任务紧,我很少有时间来做系统的总结和归纳,在这种情况下,出于对公司和自己负责任考虑,我决定辞去工作,在家专心、系统研读Linux内核源代码,同时也对自己10多年的工作进行一次全面概括和总结。
我花了半年多时间阅读针对ARM处理器平台的Linux 2.6.10内核源代码,记了2000多页的源代码阅读笔记和心得。2008年4月,我在家坐不住想去找工作——辞职前,我常开车去兜风或带家人郊游,辞职后不久,为了节省支出,我把车卖了,这半年多时间里,我除了早晨出去锻炼外,一天难得出门,没有娱乐,没有朋友交流,没有旅游,这对于一个身处物欲横流的繁华都市闹市区的人来说会是一种怎样的生活体验呢?更何况对于英俊潇洒、才华横溢、热情好动的本人呢()——于是我在脑海中总结半年多来的学习成果和收获,虽然感觉眼前比以前亮堂了许多,但仍是朦朦胧胧,似是而非,不得已只好强迫自己继续坐下去。我把以前的工作笔记、工作总结、自制的开发板全部找出来,又买了几本介绍Linux内核原理、驱动程序编写方面的理论书籍,把所有这些与半年多来阅读Linux 2.6内核源代码的笔记和心得进行交叉学习,相互印证,加深理解,同时对这些资料再次进行总结、归纳、记笔记、写心得;到2008年6月,当我再次回头清理头绪,翻看新的笔记时,顿然感觉Linux 2.6内核的轮廓渐渐清晰起来,我很兴奋并突发想象:何不将新的笔记、心得整理完善一下,那样不就可以编辑成一本介绍嵌入式系统硬件原理及软硬件设计流程与方法、嵌入式Linux内核原理及开发方法与技能、常见设备工作原理及其驱动程序的编写方法的完整的书了?联想到现在越来越多的年轻人开始热衷于嵌入式系统Linux内核开发这项高科技、高薪工作,却苦于找不到一本从实战出发全面深入介绍这方面技术的指导书,他们有的不惜花重金去参加培训,可是当这些培训后的部分人到我那面试时,我却发现他们所学甚浅,不懂原理,只知道操作流程,有的甚至连基本的流程都不熟悉;加上以前在一些嵌入式系统和Linux论坛中看到很多网友呼吁有经验的开发人员把自己的工作经验总结一下写出来供大家参考,这更让我有了写这本书的冲动。于是我又耐心坐了3个多月,继续总结、归纳、提炼、整理、完善,到了2008年9月,原来的笔记和心得就浓缩成了《嵌入式系统Linux内核开发实战指南(ARM平台)》,我也实现了一次自我超越,从“摸着石头过河”的尴尬与无奈走向了“不管风吹浪打,胜似闲庭信步”的潇洒与从容!
《嵌入式系统Linux内核开发实战指南(ARM平台)》包含了我11年的工作笔记、经验总结,一年多来对ARM处理器平台Linux 2.6内核源代码的阅读心得和体会以及对几本理论参考书的阅读笔记和心得,这本书是从这些内容中提炼出来的,是我对自己12年工作和学习的概括与总结。
《嵌入式系统Linux内核开发实战指南(ARM平台)》以嵌入式系统Linux内核开发的整个过程为线索,按照先硬件后软件、先易后难的顺序编写。书中内容覆盖了嵌入式系统Linux内核开发的各个方面,全书由“嵌入式系统硬件开发(共10章)”、“Linux内核开发初步(共6章)”、“Linux 2.6内核原理(共9章)”、“Linux内核开发高级指南(共7章)”四部分组成,共32章。其中“嵌入式系统硬件开发”部分主要以ARM处理器为例介绍了嵌入式处理器的特点、内部原理以及硬件开发调试流程和方法,还介绍了如何制作简易JTAG线缆和编写烧写程序;“Linux内核开发初步”部分主要介绍各种bootloader、Linux开发环境的创建、Linux内核的配置和编译以及根文件系统的制作,还简单介绍了Clinux;“Linux 2.6内核原理”部分是本书的核心,该部分以Linux 2.6.10内核源代码为基础深入剖析了Linux 2.6内核的各个组成部分及其实现原理,包括Linux启动过程、内存管理、进程调度、文件系统、模块设计、异常中断处理、软中断和工作队列、并发和竞态、设备驱动程序等,是以源代码阅读心得和体会+参考书阅读笔记和心得+源代码详细注释方式编写的,因为Linux源代码是Linux操作系统理论的实践成果,讲解Linux内核理论的同时加上必要的源代码注释就会非常直观,否则恐怕又会是乏味的天书;“Linux内核开发高级指南”部分则介绍了一些比较高级的技能和开发人员平时很少关注的方面,这部分包括Linux系统参数设置、内核调试、内核移植、内核优化、定时器、杂项以及编译链接文件说明等。
《嵌入式系统Linux内核开发实战指南(ARM平台)》适合已经或者志愿从事嵌入式系统Linux内核开发各阶段、各层次的人员阅读。初级开发人员包括在校大学生可以从中找到努力的方向;中级开发人员可以从中找到更深层细致的内容和有效的方法;高级开发人员可以从中发现不少解决难题的点睛之笔——总之我希望并相信这本书能对爱好或从事嵌入式系统和Linux内核开发的读者有一定帮助,使他们在技术开发的道路上少走一些弯路!
当然,一本书不可能包括全部细节,Linux 2.6内核源代码本身就远不是一本1000多页的书所能容纳的。事实上,随着写作的深入,我发现要写和想写的东西越来越多,这或许就是知识的扩张效应吧:当我们了解的东西很少的时候,未知领域和已知领域的分界线只是一个很小的圈,随着我们知识的增加和积累,这个圈慢慢向外伸展,越来越大,于是我们就感觉到不懂的东西越来越多而不是越来越少。正是这种感觉激发了人们的求知欲,有多少科学家特别是我们中国的科学家,把自己的一生都默默奉献给了国家的科学发展事业,成就了中国世界科技大国的地位!他们从不奢望也不屑获得所谓的“诺贝尔”!——但是无论如何,这本书只能就此告一段落,如果有可能,我会把更多内容和细节写入下一本书中。
由于书中内容太多,其中难免出现一些错别字或文笔不通的现象,也可能会有错误,如果读者碰到这种情况,请在广泛查阅相关资料并亲自实验的基础上得出并坚持正确的结论,不要迷信书本和权威,要敢于怀疑,勤于思考和验证,这样才能更快地进步,这才是科学态度。我诚挚期望读者能向我指出书中的错误和不足,这样我就能与读者共同进步和提高!
最后我要特别提到,在学习和写作的整个过程中,我常看《恰同学少年》——想到那么多平凡而壮丽的人生,自己一年多来吃的这点“苦”又算得了什么呢?呵呵,毛毛雨而已!
2008年12月26日