嵌入式Linux基础教程(embedded Linux primer)
embedded Linux primer 的中文版。由华清远见翻译。译者序如果早些看到 Christopher Hallinan的这本书,我就不会在开发过程中走那么多弯路了!人类无限膨胀的欲望促进了嵌入式的发展。回想10年前,你能想象手机可以照相吗?你能想象汽车里会安装全球定位系统吗?今天看来,这些都是多么普通的功能,因为只要调用一些函数(压缩算法)就可以实现。但是你想过吗?如果没有操作系统的支持,很多复杂的功能是无法完成的。要从事嵌入式开发,掌握操作系统的知识是必要的本领之一个不可忽视的事实是电子产品的性能不断提升,而价格却在下降。开发商越来越重视成本免费、自由的 Linux无疑是一个强有力的竞争者。凭借优异的特性和良好的发展趋势, Linux轻而易举地坐上了嵌入式操作系统的头把交椅。嵌入式系统并不见得有多么高深,但是因为嵌入式系统本身涉及了很多学科,致使很多初学者时常深感迷茫,不知道从何入手,即便是编译环境都很难搭建,更不用说调试和部署了。幸运的是, Christopher Hallinan的这部著作为我们学习嵌入式系统提供了捷径。请允许我在此使用“捷径”一词,因为我在刚刚踏入嵌入式 Linux大门时,其中的很多概念也一度让我觉得神秘而困惑。虽然网络搜索功能很强大,但是就如同迷失在一棵大树的树叶之间,你很难摸索到树十,找到正确的方向,而 Christopher Hallinan的这本书就是指引我们前进的“树干”。更可贵的是,本书每章后都提供了相关参考资料,你会很容易地查找到需要了解的内容。在如此短的篇幅内阐述嵌入式 Linux的方方面面是不可能的。但本书作者却让你在一本书中轻松地掌握了嵌入式开发的脉络,这是难能可贵的。本书内容广泛而又不乏深度,嵌入式 Linux开发的初学者和提高者都能从中获得巨大收获。本书的翻译工作由北京华清远见科技信息有限公司负责组织,拿到书后,我们的翻译团队粗略地浏览了一遍,一致认为本书的内容尽在我们的掌握之中,毕竟我们自认为在嵌入式 Linux领域小有经验。但在翻译过程中,我们渐渐改变了最初的错误的想法。看起来和写出来有很大不同。除了赞叹作者扎实的基本功外,我们更被作者高超的写作艺术深深折服。摆在我们面前最大的难题不是技术,而是如何尽可能地把作者的原意表现出来。我想,这也是衡量一本书翻译质量的关键吧!翻译的具体分工如下:王辉翻译第1章至第4章、第8章,张小全翻译第5章、第6章、第9章至第11章,其余部分及全书统稿由孙天泽完成。我要特别感谢袁文菊、吴彦波两位老师对本书所做的贡献。我希望能够代表嵌入式同行们感谢人民邮电出版社图灵公司,是他们以卓越的眼光引进了这部著作。尽管我们做了充分的准备,但是受能力所限,译文中仍难免存在一些错误,还请读者批评指正。最后,祝读者能通过学习本书获得较大的提高序计算机无处不在!在过去大约25年中,只要不是与世隔绝的人就肯定不会对此感到大惊小怪。现在,计算机不仅占据了我们的桌面,进驻了我们的厨房,而且越来越多地进入到我们的生活场所,即便是在微波炉、电烤箱、移动电话和便携式数字音乐播放器中也出现了它的身影。选择本书的读者肯定已经了解了不少,但还想学习更多的嵌入式系统知识。就在不久前,嵌入式系统还不是很强大,它们运行具有特殊目的、专用的操作系统,而这些操作系统与工业标准的系统有很大不同(而且,它们也更难于开发)。现在,嵌入式系统即使在功能上不比家用计算机强大,但至少也与其相当(例如高端游戏终端)。伴随着这种强大的功能,运行 Linux等成熟操作系统的能力也呼之欲出,在嵌入式产品中使用 Linux这样的操作系统变得具有非常大的意义。一个庞大的开发者社区更使得这一切成为可能。开发环境和部署环境惊人相似,这也使得程序员的生活变得更轻松。现在我们既有由虚拟内存系统提供的保护地址空间的安全性,又有多用户的能力和灵活性。真是不老少了。出于这个原因,全世界的公司都在许多设备中选择使用Iinuⅸx,如PDA、家庭娱乐系统,甚至移动电话——不管你信不信!这本书很令我振奋。它为那些想在嵌入式系统中使用 Linux的开发人员提供了极好的学习路线指导。本书内容简洁、准确,组织合理, Christopher的知识和见解贯穿全书,你不仅能得到很多信息和帮助,也能获得阅读的乐趣。我希望在你学习的同时也能感受到这种乐趣,我自己已经感受到了。Arnold Robbins著名 Linux专家)虽然 Linux方面己经有很多好书,但是没有哪一本书能为嵌入式 Linux开发人员提供广泛的信息和建议。当然,有一些非常优秀的书籍介绍了 Linux内核和 Linux系统管理等方面的知识,本书也参考了许多我认为在同类书中最优秀的著作。本书的大部分素材取自我在这些年来收到的一些开发工程师提出的问题,当时我的职位是嵌入式 Linux顾问。现在我是 Monta vista software公司的现场应用工程师,该公司是嵌入式 Linux发行厂商的领跑者。即便对于很有经验的软件工程师来说,嵌入式 Linux也带来了一些特殊的挑战。首先,那些具有多年实时操作系统(RTOS)开发经验的工程师很难把思维转换到 Linux上;其次,有经验的应用程序开发人员通常很难理解多种开发环境的复杂性。虽然这只是一本面向刚接触嵌入式 Linux开发人员的基础读物,但是我确信有经验的嵌入式Linux开发人员也一定能从中找到有用的提示和技巧,这些可是我花费多年积累总结出来的。给嵌入式Lnux开发者的实用建议书中包括了我的一些观点。作为一名嵌入式工程师,要跟上嵌入式 Linux环境的快速发展,你需要知道这些观点。本书没有重点讲解 Linux内核内部原理,在谈论内核的章节中侧重从项目角度介绍内核,你可以阅读专门介绍内核内部原理的著作来了解相关知识。通过本书可以学习内核源码树的组织和布局,了解组成内核映像的二进制文件组件以及如何加载它们,它们在嵌入式系统中的作用等知识。图5-1是我最欣赏的一幅图,它形象地说明了合成内核映像的构建过程。本书的一些章节讲述了构建系统的工作原理,以及怎样将满足项目需求的定制的内核变化加载到内核中。你会了解用于驱动不同体系结构配置的机制和 Linux内核源码树的特性;更重要的是,掌握如何修改系统使之满足自己的需求。除此之外,我们还深入探讨了内核命令行参数机制,介绍了它是如何工作的,如何根据需求配置内核运行时行为,如何扩展系统功能,如何导航内核源代码,如何为相关嵌入式系统的不同任务配置内核。其他内容还包括嵌入式项目中一些非常有用的提示和技巧,内容涵盖了引导装入程序、系统初始化、文件系统和闪存、内核调试技巧以及应用程序调试技巧等。2前言读者对象本书需要读者具有一定的C语言编程基础,对局域网和因特网有基本的了解,理解IP地址的概念以及P地址在简单局域网中的用法,还需要理解十六进制和八进制编码方式以及它们常见的用法。本书也涉及一些C语言编译和链接中较为深入的概念,所以如果你能粗略复习一下C语言链接器的概念就更好了。同时,了解 GNU make操作和语法对于阅读本书也很有帮助。本书不是什么本书不是一本详细介绍硬件的指南。嵌入式开发者所面临的困难之一就是现在硬件设备之间有巨大的差异。一款集成部分外围设备的现代32位处理器,其用户手册动辄就有1000页,这没有捷径可走。但从程序员的角度看,如果需要理解硬件设备,你必须花费大量时间研读硬件数据手册和参考指南,同时要花费更多的时间编写和测试这些硬件设备的工作代码这也不是一本讲述 Linux内核和内部原理的书。从本书中无法学到用来实现 Linux虚拟内存管理策略和过程的内存管理单元(MMU)的精深知识。已经有许多关于这个主题的优秀书籍,我建议你翻阅每章后面的“参考资源”排版约定文件名和代码采用 Courier字体,需要读者输入的命令使用加粗 Courier字体。新术语或重要的概念使用楷体加以强调路径名前如有3个点则表示众所周知但未明确指定的顶层目录。上下文不同,顶层目录也会不同,但大多数情况下是指Linuκ内核源码目录的顶层。例如,,/arch/ppc/ kerne1/ setup.c表示 setup.c文件位于 Linux内核源码树的体系结构分支上。实际路径可能是/sandbox/linux. 2.6.14/arch/ppc/kernel/setup. co本书结构第1章简要介绍了 Linux被迅速应用在嵌入式环境的驱动因素,介绍了与嵌入式 Linux相关的几个重要的标准和组织。第2章介绍了许多与后几章所构建的嵌入式 Linux相关的概念。第3章将站在更高的层面了解用于构建嵌入式 Linux系统的流行的处理器和平台,介绍了从主要处理器厂商精选的几款产品,以及几乎所有主流的体系结构。第4章从略微不同的角度审视 Linux内核。这里没有重点讲解内核理论或其内部原理,只是介绍了内核的结构、布局和构建结构,目的是使读者从一开始就能学习这门庞大的软件工程项目。更重要的是,要知道哪些内容是必须重点关注的,包括对内核构建系统的详细讲解。第5章详细说明了 Linux内核的初始化过程。你可以学习到与体系结构和引导装入程序相关前言3的映射组件,是如何拼接成适合下载到闪存的内核映射,并最终通过嵌入式系统的引导装入程序启动的。从这一章学到的知识将帮助你自定义 Linux内核,使之可以满足你自己的嵌入式应用的需求。第6章继续讲述初始化过程。当 Linux内核完成自身初始化后,应用程序将根据预先确定的方式继续初始化过程。读完这一章以后,你就具备了自定义用户空间应用程序启动顺序的知识。第7章主要介绍引导装入程序及其在嵌入式 Linux系统中的作用。这一章以现在流行的开源引导装入程序U-Boot为例,说明了移植的概念;还简要介绍了其他几种现在使用着的引导装入程序,以便用户有特殊需求时可以有多种选择第8章介绍了 Linux设备驱动程序模型,提供了很多进行设备驱动程序开发的背景资料,这些资料都在“参考资源”中列出。第9章列举了目前嵌入式系统中使用的一些流行的文件系统,包括在闪存设备上最常用的JFFS2文件系统。这一章还简要介绍了如何创建自己的文件系统映像,这也是嵌入式 Linux开发人员所面临的一项艰巨任务。第10章介绍了MTD( Memory Technology Devices,内存技术设备)子系统。MTD是 Linux文件系统和硬件内存设备(尤其是闪存)之间一种非常有效的抽象层。第11章介绍了 Busy Box,它是我们构建小型嵌入式系统最常用的工具。这一章讲述如何根据特殊需求对 Busy Box进行配置和构建,随后介绍了仅使用 Busy Box环境完成系统初始化的全过程。附录B列举了最新版本 Busy Box提供的命令。第12章详细介绍了典型交叉开发环境的特殊需求。这一章所介绍的一些技术能有效地提高嵌入式开发人员的工作效率,例如强大的NFS根目录挂载开发配置。第13章介绍了一些有用的开发工具。介绍了使用gb进行调试,包括核心转储分析;并通过示例介绍了 strace、1 trace、top和ps,以及内存剖析工具 mtrace和dma11oc。这一章最后介绍了更重要的一些二进制实用工具,如 reade1f等。第14章深入探讨了一些 Linux内核的调试技术,介绍了内核调试器KGDB的用法,提出了gdb和KGDB组合使用的许多调试技巧。这一章涉及的内容还包括硬件JAG调试器的用法,以及当内核无法启动时的一些故障分析技巧。第15章把调试环境从内核转移至应用程序。这一章继续完善前两章用到的gdb示例,讲述了多线程和多进程的调试技巧。第16章介绍了将 Linux移植到自定义开发板的相关问题。这一章通过一个简单的示例,逐步说明了Linx内核移植到 PowerPC板的详细过程,还讲解了几个困扰 Linux内核移植方面新手的重要概念。读完本章后,会同第13章和第14章提出的技术,你应该能够对自己的开发板进行移植工作。第17章介绍了嵌入式 Linux中一个令人激动的发展:通过配置 CONFIG_R选项实现实时。这里介绍的特性通过RT选项得以实现,同时还介绍了如何在设计中使用这些特性。这一章也介绍了在应用程序中测试延时的技巧。附录内容包括U-Boot可配置命令、 Busy Box命令、 SDRAM接口的注意事项、开源开发者4前言的资源、BDI2000调试器的配置文件范例。BD2000是目前很流行的硬件JTAG调试器其他如果你能够边看书边在 Linux工作站上动手实验,将会从书中得到最大的收获。可以找一个较旧的x86计算机完成嵌入式系统实验。如果有条件能连接其他体系结构的平台进行实验就更好了。你将受益于学习到大型代码库(如 Linux内核)的布局和组织,在浏览内核并亲自动手实验时,能学到一些更重要的知识和经验。看一下本书使用的代码并试着理解书中的示例,要使用不同的设置方案、配置选项和不同的硬件设备进行实验。除可获得丰富的知识,还充满了乐趣!版权说明本书使用的开源代码的版权归很多个人或公司所有。复制代码遵循了GNU公共许可,即GPL。致谢我由衷地敬佩开源软件工程师的崇高精神,深深地折服于我们社区中远远超过我的天才们。在本书的创作过程中,我向 Linux和开源社区的很多人提出了大量问题,大多数问题都能很快得到答案,而且还经常获得鼓励。我要向Linuκ和开源社区中帮我解答问题的朋友致以真挚的谢意(排名不分先后):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。还要感谢 Amold帮助我这个写作新手学习撰写技术图书的规则。虽然我已经努力排除每处错误,但错误肯定还会存在,前言5这都归昝于我。感谢 Mark L.Taub使本书得以完成,感谢他的鼓励和无限的耐心。还要感谢制作团队,包括Kristy Hart、 Jennifer Cramer、 Krista Hansing和 Cheryl Lenser最后,还要把最特别、最衷心的感谢献给 Cary Dillman,在我撰写本书时她阅读了每一章,整个创作过程中都有她的不断鼓励和重要的贡献Christopher hallinan目录第1章引言……………………………………参考资源…………………………221.1为什么使用Lnux……1第3章处理器基础12嵌入式 Linux现状…31单机处理器2313开源和GPL……………………………14标准和相关机构22333.1.1IBM970FX3. 1.2 Intel Pentium14.lLSB…3. 1.3 Freescale14.2OSDL…33.14配套芯片组,1.5小结…………………43.2集成化处理器:片上系统………………27参考资源“3.2.1 PowerPC…………27第2章嵌入式初体验…53.2.2 AMCC PowerPC……………………272.1需要嵌入式系统吗…………………………53. 2.3 Freescale PowerPC.……3022嵌入式系统剖析……63.24MPs…322.1典型嵌入式 Linux系统设置3.2.5 Broadcom MIPS222启动目标板…………3.2.6 AMD MIPS……34223启动内核……………………93.27其他类型的MIPS…………3522.4内核初始化概述……103.2.8ARM……………35225第一个用户空间进程:init…113.29TARM………………………352.3存储的思考……23.2.10 Freescale arM………………37231闪存…123.2.11 Intel ARM XScale………………37232NAND闪存………………133212其他ARM………………………38233闪存的用途………143213其他体系结构…………38234闪存文件系统1433硬件平台……………………………38235存储器空间………………1533.1 CompactPCI…382.3.6运行上下文…………………………163.32ATCA……………………………39237进程中的虚拟内存………1734小结……………………………3923.8交叉开发环境…………19参考资源………………………4024嵌入式Liux的发行版…20第4章Lnux内核不同视角41241 Linux商业发行版……………214.1背景知识242 Linux自定义发行版………………214.1.1内核的版本………422.5小结……………………………214.1.2内核源码库………………43
- 2021-05-06下载
- 积分:1