虽然Linux方面已经有很多好书,但是没有哪一本书能为嵌入式Linux开发人员提供广泛的信息和建议。当然,有一些非常优秀的书籍介绍了Linux内核和Linux系统管理等方面的知识,本书也参考了许多我认为在同类书中最优秀的著作。.
本书的大部分素材取自我在这些年来收到的一些开发工程师提出的问题,当时我的职位是嵌入式Linux顾问。现在我是Monta Vista Software公司的现场应用工程师,该公司是嵌入式Linux发行厂商的领跑者。
即便对于很有经验的软件工程师来说,嵌入式Linux也带来了一些特殊的挑战。首先,那些具有多年实时操作系统(RTOS)开发经验的工程师很难把思维转换到Linux上;其次,有经验的应用程序开发人员通常很难理解多种开发环境的复杂性。
虽然这只是一本面向刚接触嵌入式Linux开发人员的基础读物,但是我确信有经验的嵌入式Linux开发人员也一定能从中找到有用的提示和技巧,这些可是我花费多年积累总结出来的。
给嵌入式Linux开发者的实用建议
书中包括了我的一些观点。作为一名嵌入式工程师,要跟上嵌入式Linux环境的快速发展,你需要知道这些观点。本书没有重点讲解Linux内核内部原理,在谈论内核的章节中侧重从项目角度介绍内核,你可以阅读专门介绍内核内部原理的著作来了解相关知识。通过本书可以学习内核源码树的组织和布局,了解组成内核映像的二进制文件组件以及如何加载它们,它们在嵌入式系统中的作用等知识。图5-1是我最欣赏的一幅图,它形象地说明了合成内核映像的构建过程。
本书的一些章节讲述了构建系统的工作原理,以及怎样将满足项目需求的定制的内核变化加载到内核中。你会了解用于驱动不同体系结构配置的机制和Linux内核源码树的特性;更重要的是,掌握如何修改系统使之满足自己的需求。除此之外,我们还深入探讨了内核命令行参数机制,介绍了它是如何工作的,如何根据需求配置内核运行时行为,如何扩展系统功能,如何导航内核源代码,如何为相关嵌入式系统的不同任务配置内核。其他内容还包括嵌入式项目中一些非常有用的提示和技巧,内容涵盖了引导装入程序、系统初始化、文件系统和闪存、内核调试技巧以及应用程序调试技巧等。
读者对象
本书需要读者具有一定的C语言编程基础,对局域网和因特网有基本的了解,理解IP地址的概念以及IP地址在简单局域网中的用法,还需要理解十六进制和八进制编码方式以及它们常见的用法。
本书也涉及一些C语言编译和链接中较为深入的概念,所以如果你能粗略复习一下C语言链接器的概念就更好了。同时,了解GNU make操作和语法对于阅读本书也很有帮助。
本书不是什么
本书不是一本详细介绍硬件的指南。嵌入式开发者所面临的困难之一就是现在硬件设备之间有巨大的差异。一款集成部分外围设备的现代32位处理器,其用户手册动辄就有1000页,这没有捷径可走。但从程序员的角度看,如果需要理解硬件设备,你必须花费大量时间研读硬件数据手册和参考指南,同时要花费更多的时间编写和测试这些硬件设备的工作代码。
这也不是一本讲述Linux内核和内部原理的书。从本书中无法学到用来实现Linux虚拟内存管理策略和过程的内存管理单元(MMU)的精深知识。已经有许多关于这个主题的优秀书籍,我建议你翻阅每章后面的“参考资源”。
排版约定
文件名和代码采用Courier字体,需要读者输入的命令使用加粗Courier字体。新术语或重要的概念使用楷体加以强调。
路径名前如有3个点则表示众所周知但未明确指定的顶层目录。上下文不同,顶层目录也会不同,但大多数情况下是指Linux内核源码目录的顶层。例如,.../arch/ppc/kernel/setup.c表示setup.c文件位于Linux内核源码树的体系结构分支上。实际路径可能是~/sandbox/linux.2.6.14/arch/ppc/kernel/setup.c。
本书结构
第1章简要介绍了Linux被迅速应用在嵌入式环境的驱动因素,介绍了与嵌入式Linux相关的几个重要的标准和组织。
第2章介绍了许多与后几章所构建的嵌入式Linux相关的概念。
第3章将站在更高的层面了解用于构建嵌入式Linux系统的流行的处理器和平台,介绍了从主要处理器厂商精选的几款产品,以及几乎所有主流的体系结构。
.第4章从略微不同的角度审视Linux内核。这里没有重点讲解内核理论或其内部原理,只是介绍了内核的结构、布局和构建结构,目的是使读者从一开始就能学习这门庞大的软件工程项目。更重要的是,要知道哪些内容是必须重点关注的,包括对内核构建系统的详细讲解。
第5章详细说明了Linux内核的初始化过程。你可以学习到与体系结构和引导装入程序相关的映射组件,是如何拼接成适合下载到闪存的内核映射,并最终通过嵌入式系统的引导装入程序启动的。从这一章学到的知识将帮助你自定义Linux内核,使之可以满足你自己的嵌入式应用的需求。
第6章继续讲述初始化过程。当Linux内核完成自身初始化后,应用程序将根据预先确定的方式继续初始化过程。读完这一章以后,你就具备了自定义用户空间应用程序启动顺序的知识。
第7章主要介绍引导装入程序及其在嵌入式Linux系统中的作用。这一章以现在流行的开源引导装入程序U-Boot为例,说明了移植的概念;还简要介绍了其他几种现在使用着的引导装入程序,以便用户有特殊需求时可以有多种选择。
第8章介绍了Linux设备驱动程序模型,提供了很多进行设备驱动程序开发的背景资料,这些资料都在“参考资源”中列出。
第9章列举了目前嵌入式系统中使用的一些流行的文件系统,包括在闪存设备上最常用的JFFS2文件系统。这一章还简要介绍了如何创建自己的文件系统映像,这也是嵌入式Linux开发人员所面临的一项艰巨任务。
第10章介绍了MTD(Memory Technology Devices,内存技术设备)子系统。MTD是Linux文件系统和硬件内存设备(尤其是闪存)之间一种非常有效的抽象层。
第11章介绍了BusyBox,它是我们构建小型嵌入式系统最常用的工具。这一章讲述如何根据特殊需求对BusyBox进行配置和构建,随后介绍了仅使用BusyBox环境完成系统初始化的全过程。附录B列举了最新版本BusyBox提供的命令。
第12章详细介绍了典型交叉开发环境的特殊需求。这一章所介绍的一些技术能有效地提高嵌入式开发人员的工作效率,例如强大的NFS根目录挂载开发配置。
第13章介绍了一些有用的开发工具。介绍了使用gdb进行调试,包括核心转储分析;并通过示例介绍了strace、ltrace、top和ps,以及内存剖析工具mtrace和dmalloc。这一章最后介绍了更重要的一些二进制实用工具,如readelf等。
第14章深入探讨了一些Linux内核的调试技术,介绍了内核调试器KGDB的用法,提出了gdb和KGDB组合使用的许多调试技巧。这一章涉及的内容还包括硬件JTAG调试器的用法,以及当内核无法启动时的一些故障分析技巧。..
第15章把调试环境从内核转移至应用程序。这一章继续完善前两章用到的gdb示例,讲述了多线程和多进程的调试技巧。
第16章介绍了将Linux移植到自定义开发板的相关问题。这一章通过一个简单的示例,逐步说明了Linux内核移植到PowerPC板的详细过程,还讲解了几个困扰Linux内核移植方面新手的重要概念。读完本章后,会同第13章和第14章提出的技术,你应该能够对自己的开发板进行移植工作。
第17章介绍了嵌入式Linux中一个令人激动的发展:通过配置CONFIG_RT选项实现实时。这里介绍的特性通过RT选项得以实现,同时还介绍了如何在设计中使用这些特性。这一章也介绍了在应用程序中测试延时的技巧。
附录内容包括U-Boot可配置命令、BusyBox命令、SDRAM接口的注意事项、开源开发者的资源、BDI-2000调试器的配置文件范例。BDI-2000是目前很流行的硬件JTAG调试器。
其他
如果你能够边看书边在Linux工作站上动手实验,将会从书中得到最大的收获。可以找一个较旧的x86计算机完成嵌入式系统实验。如果有条件能连接其他体系结构的平台进行实验就更好了。你将受益于学习到大型代码库(如Linux内核)的布局和组织,在浏览内核并亲自动手实验时,能学到一些更重要的知识和经验。
看一下本书使用的代码并试着理解书中的示例,要使用不同的设置方案、配置选项和不同的硬件设备进行实验。除可获得丰富的知识,还充满了乐趣!
版权说明
本书使用的开源代码的版权归很多个人或公司所有。复制代码遵循了GNU公共许可,即GPL。
致谢
我由衷地敬佩开源软件工程师的崇高精神,深深地折服于我们社区中远远超过我的天才们。在本书的创作过程中,我向Linux和开源社区的很多人提出了大量问题,大多数问题都能很快得到答案,而且还经常获得鼓励。我要向Linux和开源社区中帮我解答问题的朋友致以真挚的谢意(排名不分先后):
Dan Malek为第2章的部分内容提供了创作灵感。
Dan Kegel和Daniel Jacobowitz耐心地帮我解答了关于工具链的问题。
Scott Anderson 提供了第14章中gdb宏的最初的思想。
Brad Dixon不断地用他所掌握的知识挑战和扩展我的技术洞察力。
George Davis帮我解答了ARM的问题。
Jim Lewis为我提供了关于MTD的意见和建议。
Cal Erickson帮我解答了关于gdb用法的问题。
John Twomey就第3章内容给出了建议。
Lee Revell、Sven-Thorsten Dietrich和Daniel Walker就实时Linux的内容提供了建议。
非常感谢AMCC、Embedded Planet、Ultimate Solutions和United Electronic Industries公司,它们提供了示例硬件。感谢我的公司Monta Vista,允许我进行这次与工作无关的创作,并且提供了一些软件示例。在创作过程中,还有很多人贡献了他们的想法,并给予我鼓励和支持,我也非常感激!
我要诚挚地感谢最初审阅本书的团队,他们迅速地阅读了每一章,提供了极好的反馈、注释和想法。谢谢Arnold Robbins、Sandy Terrace、Kurt Lloyd和Rob Farber。还要感谢Arnold帮助我这个写作新手学习撰写技术图书的规则。虽然我已经努力排除每处错误,但错误肯定还会存在,这都归咎于我。
感谢Mark L. Taub使本书得以完成,感谢他的鼓励和无限的耐心。还要感谢制作团队,包括Kristy Hart、Jennifer Cramer、Krista Hansing和Cheryl Lenser。
最后,还要把最特别、最衷心的感谢献给Cary Dillman,在我撰写本书时她阅读了每一章,整个创作过程中都有她的不断鼓励和重要的贡献。...
Christopher Hallinan