我在1997年任职一家硬件厂商的时候,首次提议在嵌入式系统中使用Linux,我的建议在当时不仅令人感到惊讶,也受到某些质疑。现在,在嵌入式系统中使用Linux不再是可笑的事情了。的确,有不少大公司及政府机关在其嵌入式软件的需求上逐渐开始依赖Linux。
Linux在一些嵌入式应用上的成功应用引起了广泛的兴趣和热烈的回应,这导致了"嵌入式Linux"相关文章、网站、公司及文档的泛滥。除了一闪即逝的宣布,杂志里的文章,数以百计的项目和产品,都宣告了将Linux用于嵌入式系统是轻而易举的事情,然而正在探索有用指南的专业开发者们,却仍在为建立嵌入式Linux系统的基本方法和技术寻觅答案。
目前大部分的文档都只着重于如何使用各类套件即跨平台开发工具,以及目标板二进制码(target binary,译注1)。有的文档则只局限在如何在目标板(target board)上运行Linux。
与现有的文档不同,本书并不会假定你手边有哪些工具,或是限定项目的范围。本书只会要你通过Internet下载必要的套件、浏览特定的在线文档,以及通过项目的邮件论坛与其他开发者一起分享经验。你还需要开发主机以及目标板硬件的说明文件,不会要求你向任何厂商购买任何产品或服务。
除了提供最大的自由度并让你掌控自己的设计之外,这么做还最接近在嵌入式系统中使用Linux的先驱者们所采用的方式。这些先驱者对Linux所做的事,本质上包括将它拆开以符合应用的需要,并根据其目的对它进行定制。因此,Linux突破嵌入式世界的方式与许多软件厂商将其产品扩展至新应用领域的做法不同。作为嵌入式系统开发者,你可能会发现,与厂商销售的产品相比,Linux比较容易应用到设计中。
本书的做法就是提供所有的细节,并讨论在嵌入式系统中使用Linux时将会遇到的各种困境,让你能够把Linux应用在设计中。虽然本书的内容不可能涵盖所有的嵌入式设计,但是书中提供的资源却可以让你轻易获得必要的信息,使你能够在嵌入式系统中使用Linux,并对它进行定制。
撰写本书的目的在于拉近在设计中使用开放源码和自由软件的嵌入式系统的开发者跟建立和维护这些开放源码和自由软件套件的开发者的距离。尽管有许多主流嵌入式系统开发者(其中不乏高水平的程序设计者)会依赖第三方提供他们需要的嵌入式Linux,但无疑他们也有机会对所依赖的开放源码和自由软件(free software)计划做出贡献。最后,这种动力将可确保Linux持续成为嵌入式系统首选的操作系统。
本书对象
本书锁定的第一种读者,是那些想要在未来或目前的计划中使用Linux的有经验的嵌入式系统设计者。本书会假定这一类读者已经熟悉用于开发嵌入式系统的技术和术语,如交叉编译,进行BDM或JTAG调试,以及如何处理不完善或不完全的硬件。如果是这一类读者,可能会想要跳过前面一些章节中与嵌入式系统开发背景知识有关的部分。然而,还是需要阅读一些前面的章节(尤其是第二章),因为这一章包含了在嵌入式系统中使用Linux内核的特别提示。
本书锁定的第二种读者,是那些想要熟悉嵌入式Linux系统开发工具和技术但没有经验的嵌入式系统开发者。本书并非嵌入式系统的入门书,不过若你想探究本书所讨论到的一些课题,可以参考一些入门性质的教科书。本书附录二列出了一些有用的书籍以及信息来源。
如果你是对Linux已经很熟悉的高级用户或系统管理员,那么本书应该可以帮助你进行高度定制的Linux安装。例如,如果你发现发行套件安装了过多的包,而你想要从头开始建立自己定制的发行套件,本书有许多部分应该可以派上用场,特别是第六章的内容。
最后,本书应该可以帮助那些想要了解如何建立与操作Linux系统的程序设计者或Linux的热衷者。尽管本书并未说明如何建立一般用途的发行套件,不过其所提到的许多技术,在一定程度上可以媲美用来进行定制嵌入式Linux安装的一般用途发行套件。
本书范畴及背景知识
要在嵌入式系统中展现Linux的最佳性能,需要以下背景知识,这些知识在许多书中都交代得很清楚:
嵌入式系统
一般而言,你必须熟悉嵌入式系统的开发、程序设计和调试,这包括软件、硬件两方面。
Unix系统管理
你必须能够胜任各种系统管理工作,如硬件的配置、系统的设定、维护以及利用shell命令脚本让管理工作自动化。
Linux设备驱动程序
你必须知道如何对各种Linux设备驱动程序进行开发及调试。
.Linux内核的运行原理
你必须尽可能了解内核的运行原理。
GNU软件开发工具
你必须具备有效利用GNU工具的能力。这包括了解许多常被认为是晦涩难懂的选项和工具程序。
本书会假定你至少熟悉论述题目中的基本概念。另一方面,阅读本书你不需要知道一些内容,例如Linux设备驱动程序是如何建立的,或与嵌入式系统开发有关的每一件事。翻阅本书的时候,若看到符合你的嵌入式系统的Linux用法,可能你会觉得需要取得这个Linux用法的进一步信息。除了阅读本书时你自己参考的其他书籍,还可以看一看附录二所列的书单,或许会从中找到这些背景知识的进一步信息。
尽管本书只讨论如何在嵌入式系统中使用Linux,但是对想要在嵌入式系统中使用BSD的开发者来说多少会有一些帮助。不过本书所作的许多说明都必须依据BSD与Linux间的差异重新诠释。
本书架构
本书由三大部分构成。第一部分由第一到三章组成。这三章的内容涵盖建立任何嵌入式Linux系统必备的基本知识。尽管这三章并未提到任何程序,不过它们都是建立嵌入式Linux系统时不可或缺的知识。第二部分由第四到九章组成。这几章的内容都非常重要,其中安排了用来建立任何嵌入式Linux系统的必要步骤。不管你的系统的目的或功能是什么,都必须阅读这几章的内容。
第三部分由第十和十一章组成。虽然这两章所包含的内容都很重要,不过并不是建立嵌入式Linux系统必需的。
第一章"概述"将会深入嵌入式Linux系统的世界。本章首先会介绍基本定义,接着会探讨嵌入式Linux系统的实际问题,包括从嵌入式系统的观点来探讨开放源码和自由软件版权问题。然后会介绍本书其他部分将会用到的范例系统,以及本书将会用到的实现方法。
第二章"基本概念"用来描述建立任何嵌入式Linux系统时必须具备的基本概念。
第三章"所支持的硬件"完整地介绍了Linux所支持的嵌入式硬件,以及告诉读者何处可以找到实现这些硬件的驱动程序和子系统。本章还会探讨处理器的架构、总线和接口,I/0、存储设备、一般用途的网络功能、工业等级的网络功能,以及系统监控。
第四章"开发工具"将会说明如何安装与使用各种用来建立嵌入式Linux系统的开发工具。其中最值得注意的是,如何从头开始建立与安装GNU工具链组件;此外还会分节讨论Java、Perl和Python,以及探讨可用来与嵌入式目标板交互的各种终端仿真程序。
第五章"内核方面的考虑"将会探讨在嵌入式系统中Linux内核的选择、配置、交叉编译、安装以及使用。
第六章"根文件系统的内容"将会说明如何使用本书前面提到的组件来建立根文件系统,包括C链接库的安装,以及建立适当的/der条目。比较值得注意的是,本章的说明涵盖了BusyBox、TinyLogin、Embutils和System V init的安装和使用。
第七章"存储设备管理"将会讲解如何操作以及为嵌入式Linux系统配置存储设备。本章将重点放在固态存储设备上,如固有的flash和DiskOnChip设备,以及MTD子系统。
第八章"根文件系统的设置"将会说明如何为嵌入式系统的存储设备设置在第六章建立的根文件系统。这包括建立JFFS2和CRAMFS文件系统的映像,以及在NFTL上使用磁盘形式的文件系统。
第九章"设置bootloader"将会针对每个嵌入式Linux平台探讨各种可用的bootloader(引导加载程序)。并且会进一步探讨如何在DiskOnChip设备上使用GRUB以及U-Boot。此外还包含用BOOTP/DHCP、TFTP和NFS来进行网络引导。
第十章"设置网络服务"会将重点放在各种网络服务(如SNMP、SSH和HTTP)的软件包的配置、安装和使用。
第十一章"调试工具"的内容涵盖了嵌入式Linux系统开发软件时可能遇到的主要调试问题。这包含了如何在跨平台(cross-platform)开发环境中使用gdb、进行跟踪、性能分析,以及内存调试。
附录一"工作单"提出了一份可搭配本书一起使用的工作单,可以为嵌入式Linux系统提供完整的计划书。
附录二"资源"的内容包含了建立嵌入式Linux系统时可供利用的资源。
附录三"重要的版权声明"的内容包含了LinusTorvalds与其他内核开发者讨论内核版权、以及非GPL版权的二进制内核模块相关问题时的重要信件。
尽管第七到九章看起来像是各自独立的章节,不过它们的内容却高度地关联。举例来说,要了解第七章探讨的目标板存储设备的配置,得先了解第八章探讨的目标板文件系统,反之亦然。此外,存储设备的设置还必须先了解第九章探讨的bootloader的设置与操作,反之亦然。因此,我建议各位先一口气读完第七到九章,再执行这几章中提到的任何指令。这样当你设定目标板的时候,才有办法按照这几章所描述的程序进行操作。
本书用到的硬件
正如我们在第三章中所见,Linux支持各式各样的硬件。由于篇幅有限,本书只能选用几种嵌入式系统作为各种程序的测试平台。表P-1完整地列出了本书将会用到的系统。这些系统中有些是主流市场上的商品,如iPAQ或Dreamcast。我刻意将它们列入,主要是让有兴趣的读者可以轻易找到用来学习建立嵌入式Linux系统的材料。例如,Sega出品的Dreamcast游戏机,可以在eBay上以低于50美元的价格买到。尽管Dreamcast使用特殊格式的CD-ROM来引导,不过它却是学习Linux跨平台开发的最便宜方法之一。当然,也可以使用旧的x86 PC来作实验,不过这样就比较没意思了。