《嵌入式系统Linux内核开发实战指南(ARM平台)》前言及网友问答

时间:2022-08-28 19:07:05

王老师博客:http://blog.mcuol.com/User/emblinux/article/9644_1.htm

 

本文节选自王洪辉老师的《嵌入式系统Linux内核开发实战指南(ARM平台)》一书

  前言(序)

      20078月,我从上家公司辞职出来,放弃了刚上市公司骨干中层*的职位,放弃了丰厚的待遇。

    自1996年毕业以来,我一直从事嵌入式系统和Linux内核一线技术开发工作,我所承担的任务和项目基本都是由自己独立完成,即使担任了硬件部主管或技术总监职务,我对自己专长的工作仍是亲历亲为的;一方面,自己热爱这项工作,每攻克一个难题都能体验到莫大的成就感(相信技术工程师都有过这种体会);另一方面,目前国内做嵌入式系统和Linux内核开发的工程师供不应求,水平高的更是奇缺,相关职位的待遇相对其他职位的偏高,少招一个新员工就为公司节省一笔开支,减轻一份负担,所以对于比较简单和事务性的工作我会安排给其他员工,而难度大的工作我几乎都亲自上阵;我习惯加班,来了兴致甚至通宵达旦,凭着这股干劲,经过多年实践积累,自己常能在短时间内解决很多人长时间没有解决的问题;在我工作中接触到Linux之初,为了更好更深入地学习嵌入式系统和Linux内核开发技能,我在业余时间自己花钱设计制作了MC68VZ328S3C4510两种开发板以及简易JTAG下载、烧写线缆,并成功移植、固化mClinux到这两个开发板上—到目前为止,我已经在当今流行的各种嵌入式硬件平台(包括单片机、MC68KPowerPCARMMIPSDSP)和嵌入式操作系统(包括VRTXVxWorksPSOSLinux)上都做过实际开发工作,编写、移植或者调试过UARTEthernetI2CHDLC+E1LCDKeyboardVFDSCSISATAIDECVBSVGAPCIUSB等接口和设备的驱动程序。

    在与Linux打交道的这么多年里,我一心想把这个开放源码的优秀操作系统吃透,并理所当然地觉得,随着时间的推移和所做项目的增多,自己一定会逐渐认识Linux内核的真实面目;可是一直以来,每当我想在脑海中对Linux内核各组件及其原理进行全面系统概括描述时却总是如鲠在喉,不得其解,这让我心里一直潜藏着一丝隐忧和茫然:由于不了解Linux内核原理,尽管自己能凭借10多年的工作经验通过适当方法很快把任务完成、把难题解决,但却不能在碰到难题一开始就从原理上把握应该从哪儿下手,怎样做、做什么,缺乏全局预见性和高瞻远瞩的能力,这种心中“没底”的感觉驱使我去更深入钻研、发掘,去力争做到心中“有底”;这也让我意识到,虽然经过10多年的勤奋工作,自己已经积累了足够的工作经验,不过由于平时很少阅读理论书籍和Linux内核源代码,Linux内核原理知识并没有象我原来想象的那样自然而然地装进自己的大脑,所以自己的理论水平仍然很欠缺,要想提高就必需经过一个艰苦的沉淀过程;由于平时工作忙、任务紧,我很少有时间来做系统的总结和归纳,在这种情况下,出于对公司和自己负责任考虑,我决定辞去工作,在家专心、系统研读Linux内核源代码,同时也对自己10多年的工作进行一次全面概括和总结。

    我花了半年多时间阅读针对ARM处理器平台的Linux 2.6.10内核源代码,记了2000多页的源代码阅读笔记和心得。20084月,我在家坐不住想去找工作—辞职前,我常开车去兜风或带家人郊游,辞职后不久,为了节省支出,我把车卖了,这半年多时间里,我除了早晨出去锻炼外,一天难得出门,没有娱乐,没有朋友交流,没有旅游,这对于一个身处物欲横流的繁华都市闹市区的人来说会是一种怎样的生活体验呢?更何况对于英俊潇洒、才华横溢、热情好动的本人呢(J—于是我在脑海中总结半年多来的学习成果和收获,虽然感觉眼前比以前亮堂了许多,但仍是朦朦胧胧,似是而非,不得已只好强迫自己继续坐下去。我把以前的工作笔记、工作总结、自制的开发板全部找出来,又买了几本介绍Linux内核原理、驱动程序编写方面的理论书籍,把所有这些与半年多来阅读Linux 2.6内核源代码的笔记和心得进行交叉学习,相互印证,加深理解,同时对这些资料再次进行总结、归纳、记笔记、写心得;到086月,当我再次回头清理头绪,翻看新的笔记时,顿然感觉Linux2.6内核的轮廓渐渐清晰起来,我很兴奋并突发想象:何不将新的笔记、心得整理完善一下,那样不就可以编辑成一本介绍嵌入式系统硬件原理及软硬件设计流程与方法、嵌入式Linux内核原理及开发方法与技能、常见设备工作原理及其驱动程序的编写方法的完整的书了?联想到现在越来越多的年轻人开始热衷于嵌入式系统Linux内核开发这项高科技、高薪工作,却苦于找不到一本从实战出发全面深入介绍这方面技术的指导书,他们有的不惜花重金去参加培训,可是当这些培训后的部分人到我那面试时,我却发现他们所学甚浅,不懂原理,不懂技能,只了解一点操作流程,有的甚至连基本的开发流程都不熟悉;加上以前在一些嵌入式系统和Linux论坛中看到很多网友呼吁有经验的开发人员把自己的工作经验总结一下写出来供大家参考,这更让我有了写这本书的冲动。于是我又耐心坐了3个多月,继续总结、归纳、提炼、整理、完善,到了089月,原来的笔记和心得就浓缩成了《嵌入式系统Linux内核开发实战指南(ARM平台)》我也实现了一次自我超越,从“摸着石头过河”的尴尬与无奈走向了“不管风吹浪打,胜似闲庭信步”的潇洒与从容!

    《嵌入式系统Linux内核开发实战指南(ARM平台)》包含了我11年的工作笔记、经验总结,1年多来对ARM处理器平台Linux 2.6内核源代码的阅读心得和体会以及对几本理论参考书的阅读笔记和心得,这本书是从这些内容中提炼出来的,是我对自己12年工作和学习的概括与总结。

    《嵌入式系统Linux内核开发实战指南(ARM平台)》以嵌入式系统Linux内核开发的整个过程为线索,按照先硬件后软件、先易后难的顺序编写。书中内容覆盖了嵌入式系统Linux内核开发的各个方面,全书由“嵌入式系统硬件开发(共10章)”、“Linux内核开发初步(共6章)”、“Linux 2.6内核原理(共9章)”、“Linux内核开发高级指南(共7章)”四部分组成,共32章。其中“嵌入式系统硬件开发”部分主要以ARM处理器为例介绍了嵌入式处理器的特点、内部原理以及硬件开发调试流程和方法,还介绍了如何制作简易JTAG线缆和编写烧写程序;“Linux内核开发初步”部分主要介绍各种bootloaderLinux开发环境的创建、Linux内核的配置和编译以及根文件系统的制作,还简单介绍了uClinux;“Linux 2.6内核原理”部分是本书的核心,该部分以Linux 2.6.10内核源代码为基础深入剖析了Linux 2.6内核的各个组成部分及其实现原理,包括Linux启动过程、内存管理、进程调度、文件系统、模块设计、异常中断处理、软中断和工作队列、并发和竞态、设备驱动程序等,是以源代码阅读心得和体会+参考书阅读笔记和心得+源代码详细注释方式编写的,因为Linux源代码是Linux操作系统理论的实践成果,讲解Linux内核理论的同时加上必要的源代码注释就会非常直观,否则恐怕又会是乏味的天书;“Linux内核开发高级指南”部分则介绍了一些比较高级的技能和开发人员平时很少关注的方面,这部分包括Linux系统参数设置、内核调试、内核移植、内核优化、定时器、杂项以及编译链接文件说明等。

    《嵌入式系统Linux内核开发实战指南(ARM平台)》适合已经或者志愿从事嵌入式系统Linux内核开发各阶段、各层次的人员阅读。初级开发人员包括在校大学生可以从中找到努力的方向;中级开发人员可以从中找到更深层细致的内容和有效的方法;高级开发人员可以从中发现不少解决难题的点睛之笔—总之我希望并相信这本书能对爱好或从事嵌入式系统和Linux内核开发的读者有一定帮助,使他们在技术开发的道路上少走一些弯路!

    当然,一本书不可能包括全部细节,Linux 2.6内核源代码本身就远不是一本1000多页的书所能容纳的。事实上,随着写作的深入,我发现要写和想写的东西越来越多,这或许就是知识的扩张效应吧:当我们了解的东西很少的时候,未知领域和已知领域的分界线只是一个很小的圈,随着我们知识的增加和积累,这个圈慢慢向外伸展,越来越大,于是我们就感觉到不懂的东西越来越多而不是越来越少。正是这种感觉激发了人们的求知欲,有多少科学家特别是我们中国的科学家,把自己的一生都默默奉献给了国家的科学发展事业,成就了中国世界科技大国的地位!他们从不奢望也不屑获得所谓的“诺贝尔”!—但是无论如何,这本书只能就此告一段落,如果有可能,我会把更多内容和细节写入下一本书中。

    由于书中内容太多,其中难免出现一些错别字或文笔不通的现象,也可能会有错误,如果读者碰到这种情况,请在广泛查阅相关资料并亲自实验的基础上得出并坚持正确的结论,不要迷信书本和权威,要敢于怀疑,勤于思考和验证,这样才能更快地进步,这才是科学态度。我诚挚期望读者能向我指出书中的错误和不足,这样我就能与读者共同进步和提高!

    最后我要特别提到,在学习和写作的整个过程中,我常看《恰同学少年》—想到那么多平凡而壮丽的人生,自己一年多来吃的这点“苦”又算得了什么呢?呵呵,毛毛雨而已!

 

 

《嵌入式系统Linux内核开发实战指南(ARM平台)》前言及网友问答

2008年12月26日       

嵌入式在线网友  2009-1-29 1:30:03

  • 你好,我是想从单片机转入到做ARM linux 这方面,我没有参加培训班,自己以前做过一年的WINCE5.0 + s3c2440的二次开发,就是买别人的板子,然后公司做裁剪,写应用程序。后来又做回到单片机了,想有往嵌入式方面发展,想多多请教请教你。该如何入门呢?
  • 王洪辉  2009-1-29 9:58:13
  • 其实你已经入门了,只是你现在可能偏重于应用方面的知识;如果想转入底层驱动和内核方面开发,那么确实还需要做不少事情,总的来说做应用开发比做底层和内核开发容易得多,应用方面的开发的关键在于理解用户需求和个人的编程技巧;而底层软件开发则要跟硬件、内核,要想做好底层软件开发必须能看懂硬件原理、熟悉硬件芯片和硬件设备手册、理解内核原理,还要有丰富的硬件调试经验,因为底层软件一点出问题可能是硬件设计的问题也可能是软件编程的失误;
    如果你确实想转入嵌入式底层和内核开发,那么我建议你自己参考网上的一些开发板自己去设计制作一块电路板,然后自己移植、boot起一个Linux内核,完成了这些,你就已经了解了嵌入式Linux内核开发的整个流程,下一步就是多阅读芯片和设备手册,了解芯片和设备的工作原理和操作方法,最后就是深入理解Linux内核的组成结构和实现原理;要完成所有这些是比较辛苦的,没有几年是下不来的,特别是Linux内核原理,当然可以找一些参考书,我自然要向你推荐我的这本《嵌入式系统Linux内核开发实战指南(ARM平台)》,有了这本书你几乎不用再看其它任何书(如果你要学汇编还要看具体处理器的汇编语言相关书籍),这本书的内容涵盖了嵌入式系统Linux内核开发的各个方面,初级(流程)、中级(技能)、高级(深层原理)都包括,附带的CD中还有我自己设计制作的MC68VZ328和S3C4510两块开发板的原理图、PCB图以及uClinux源代码和交叉开发环境,你可以在看懂、理解原理图的基础上直接用盘中的PCB图去制板,然后自己买器件、焊接、调试,再把盘中的uClinux在板子上跑起来,这样第一步你就完成了;
    第二步就是要多做,争取把各种架构的处理器(单片机、MC68K、ARM、PowerPC、MIPS)开发平台和各种设备的驱动都做一遍,积累经验,这样你的开发技能就会得到很大提高;
    最后一步就是研究Linux内核原理,这一步是最难的,一定要多读源代码,纯理论书籍只能作参考,没有太大的实际意义,最最根本的就是读代码,要下真功夫,否则是不会有成效的,我的这本书就是从内核代码分析入手来阐述Linux内核原理的,可以引导读者自己去阅读理解Linux内核代码,Linux代码就是一个完整操作系统的优秀典范,就是操作系统理论的一个实现,读Linux代码就是实践,这是必须的;
    希望你一些顺利,不过要做好吃苦的思想准备,还有就是要坚持!
  •  
  • 嵌入式在线网友  2009-2-26 10:53:14
  • 王老师你好,我是从事linux应用层的软件开发,工作了几个月时间,平时工作只需懂得使用别人设计好的硬件设备,不懂硬件,该如何入门呢?
  • 王洪辉  2009-2-28 10:11:44
  • 你可以看一下我的博客中的“嵌入式系统Linux内核开发学习指导框图 ”一文还有我在博客中的一些评论文章,都详细提到了应该怎样开始学习嵌入式Linux内核开发,这里我也建议你自己花1000来块钱去做一块小开发板,自己焊接、调试,自己编译、下载、固化Linux内核,走一遍这个过程你的基本功就练好了,可以参考或直接使用我的《嵌入式系统Linux内核开发实战指南(ARM平台)》一书中的S3C4510和JTAG线缆的原理和PCB图去制板,这本书这周就可以上市,可以到北京的书店买到,下周全国各地的书店都可以拿到书,如果你实在不想自己做板子,那么可以花几百元到市场上去买一块S3C2410或S3C2440的开发板自己学着编译、下载、固化Linux内核,但这样做你就会少学到很多硬件调试相关的知识和技能,而这些对你将来做底层软件调试是有很大帮助的。
  • 嵌入式在线网友  2009-3-1 14:37:36
  • 王老师 您好
    我想问下一个初学者首先需要掌握这一块那方面的知识 怎么样才能算入门呢··后续还要掌握哪方面的知识
  • 王洪辉  2009-3-1 16:17:42
  • 在我看来,要学习嵌入式软硬件开发最起码要做到:1)能够自己设计、调试主板;2)自己编写、调试主板各功能模块的测试程序;这是嵌入式开发人员必备的基本功;然后就是写一些外设的驱动程序,这算是中级的;如果还要学Linux,那么至少应该在自己做的板子上boot起一个Linux内核才算对嵌入式Linux内核开发流程有了基本了解;然后就是阅读、移植或者自己编写Linux下的各种设备驱动程序;到此只能算是嵌入式Linux的中级开发人员,如果要想继续提高,就要自己多做项目,把各种架构类型的处理器平台都做一遍,积累丰富的开发经验和技能,与此同时多读Linux内核源代码,前期可以只是围绕接触比较多的设备驱动部分源代码,这样你就可以逐渐成为嵌入式Linux内核高手了;如果你还想成为Linux内核专家,那就请你通读Linux内核各个核心组件的源代码,等你理解了Linux内核每个组件的实现原理,你自然就成了Linux内核专家了,那时你也可以开始试着自己写操作系统了!不过这条路很难走,要有思想准备!
    祝你顺利!