简介
多年来,Linux一直是嵌入式计算的主流。然而,涵盖这一主题的书籍却少之又少:本书旨在填补这一空白。术语 “嵌入式Linux “没有很好的定义,可以应用于从恒温器到Wi-Fi路由器到工业控制单元等各种设备内部的操作系统。然而,它们都是建立在相同的基本开源软件上。这些就是我在本书中描述的技术,基于我作为工程师的经验和我为培训课程开发的材料。
技术不会停滞不前。围绕嵌入式计算的行业与主流计算一样容易受到摩尔定律的影响。这意味着指数级的增长,意味着自本书第一版出版以来,有大量的东西发生了令人惊讶的变化。这第三版经过全面修订,使用了主要开源组件的最新版本,其中包括Linux 5.4、Yocto Project 3.1 Dunfell和Buildroot 2020.02 LTS。除了Autotools之外,本书现在还包括CMake,这是一个现代的构建系统,近年来被越来越多的人采用。
《掌握嵌入式Linux编程》大致按照你在实际项目中遇到的顺序来涵盖这些主题。前八章涉及项目的早期阶段,包括选择工具链、引导程序和内核等基础知识。我以Buildroot和Yocto项目为例,介绍了嵌入式构建系统的概念。本节最后对Yocto项目进行了新的深入介绍。
第2节,第9至15章,探讨了在认真进行开发之前需要做出的各种设计决定。它涵盖了文件系统、软件更新、设备驱动、初始程序和电源管理等主题。第12章演示了使用分线板进行快速原型开发的各种技术,包括如何阅读原理图、焊接焊头以及使用逻辑分析仪对信号进行故障诊断。第14章是对Buildroot的深入研究,你将学习如何使用BusyBox runit将你的系统软件分割成独立的服务。
第3节,第16、17和18章,将在项目的实施阶段帮助你。我们从Python打包和依赖性管理开始,随着机器学习应用继续风靡全球,这个话题的重要性越来越大。接下来,我们继续讨论各种形式的进程间通信和多线程编程。本节最后仔细研究了Linux是如何管理内存的,并演示了如何使用现有的各种工具来测量内存使用情况和检测内存泄漏。
第四部分包括第19章和第20章,向你展示了如何有效地利用Linux提供的许多调试和剖析工具,以检测问题和识别瓶颈。第19章现在介绍了如何配置Visual Studio Code以使用GDB进行远程调试。第20章现在包括了BPF的内容,这是一项新的技术,能够在Linux内核内部进行高级程序跟踪。最后一章汇集了几条线索来解释Linux如何用于实时应用。
每一章都介绍了嵌入式Linux的一个主要领域。它描述了背景,以便你可以学习一般的原则,但它也包括详细的工作实例,说明每一个领域的情况。你可以把它当作一本理论书,或一本实例书。如果你能同时做到这两点,效果就最好了:理解理论并在现实生活中进行尝试。
本书适用对象
本书是为那些对嵌入式计算和Linux有兴趣的开发人员编写的,他们希望将自己的知识扩展到该主题的各个分支。在编写本书时,我假定他们对Linux命令行有基本的了解,在编程实例中,对C和Python语言有一定的了解。有几章集中讨论了嵌入式目标板中的硬件,因此,熟悉硬件和硬件接口在这些情况下将是一个绝对的优势。
本书的内容
第1章 “起步”,通过描述嵌入式Linux生态系统和你在开始项目时可利用的选择来设置场景。
第2章,学习工具链,描述了工具链的组成部分,并告诉你如何为目标板创建一个交叉编译代码的工具链。它描述了从哪里获得工具链,并提供了如何从源代码构建工具链的细节。
第3章,关于引导程序,解释了引导程序在将Linux内核载入内存中的作用,并以U-Boot为例。它还介绍了设备树,作为几乎所有嵌入式Linux系统中用来编码硬件细节的机制。
第4章,配置和构建内核,提供了关于如何为嵌入式系统选择一个Linux内核并为设备内的硬件进行配置的信息。它还包括如何将Linux移植到新硬件上。
第5章,构建根文件系统,通过逐步指导如何配置根文件系统,介绍了嵌入式Linux实现的用户空间部分的思想。
第6章,选择构建系统,包括两个常用的嵌入式Linux构建系统:Buildroot和Yocto项目,它们可以自动完成前四章中描述的步骤。
第7章,用Yocto开发,演示了如何在现有BSP层上构建系统映像,用Yocto的可扩展SDK开发板载软件包,以及推出自己的嵌入式Linux发行版,并完成运行时软件包管理。
第8章 “引擎盖下的Yocto “是对Yocto构建工作流程和架构的介绍,包括对Yocto独特的多层方法的解释。它还通过实际配方文件的例子,分解了BitBake的语法和语义的基本知识。
第9章 “创建存储策略 “讨论了管理闪存的挑战,包括原始闪存芯片和嵌入式MMC(eMMC)包。它描述了适用于每种技术类型的文件系统。
第10章,在现场更新软件,研究了设备部署后更新软件的各种方法,包括完全管理的空中(OTA)更新。讨论的关键话题是可靠性和安全性。
第11章,与设备驱动程序的交互,描述了内核设备驱动程序如何通过实现一个简单的驱动程序与硬件交互。它还描述了从用户空间调用设备驱动程序的各种方法。
第12章,使用突破板进行原型开发,演示了如何使用为BeagleBone Black预制的Debian映像和外围突破板来快速制作硬件和软件原型。你将学会如何阅读数据表、为板子布线、Mux设备树绑定以及分析SPI信号。
第13章,启动–init程序,解释了第一个用户空间的
程序–init–如何启动系统的其他部分。它描述了三个版本的init程序,每个版本都适用于不同的嵌入式系统,从简单的BusyBox init,到System V init,再到目前最先进的方法systemd。
第14章 “从BusyBox runit开始 “告诉你如何使用Buildroot将你的系统分成独立的BusyBox runit服务,每个服务都有自己专门的进程监督和日志记录,就像systemd所提供的那样。
第15章 “电源管理 “考虑了各种调整Linux以降低功耗的方法,包括动态频率和电压调整,选择更深的空闲状态,以及系统挂起。其目的是使设备在电池充电的情况下能运行更长时间,同时也能运行得更冷。
第16章,打包Python,解释了将Python模块捆绑在一起进行部署有哪些选择,以及何时使用一种方法而不是另一种。它包括pip、虚拟环境、conda和Docker。
第17章,学习进程和线程,从应用程序员的角度来描述嵌入式系统。本章研究了进程和线程、进程间通信和调度策略。
第18章,管理内存,介绍了虚拟内存背后的思想,以及地址空间是如何被划分为内存映射的。它还描述了如何准确测量内存的使用,以及如何检测内存泄漏。
第19章,用GDB调试,告诉你如何使用GNU调试器GDB和调试代理gdbserver,来调试在目标设备上远程运行的应用程序。它接着展示了如何利用KGDB的内核调试存根,将这个模型扩展到调试内核代码。
第20章,剖析和跟踪,涵盖了测量系统性能的可用技术,从整个系统的剖析开始,然后归纳到特定的
导致性能低下的特定区域。它还描述了如何使用Valgrind来检查一个应用程序使用线程同步和内存分配的正确性。
第21章,实时编程,提供了Linux上实时编程的详细指南,包括内核的配置和PREEMPT_RT实时内核补丁。内核跟踪工具Ftrace被用来测量内核延迟并显示各种内核配置的效果。
更好的利用本书
本书中使用的软件完全是开放源代码。几乎在所有情况下,我都使用了写作时的最新稳定版本。虽然我试图以一种不针对具体版本的方式来描述主要功能,但不可避免的是,一些例子需要调整以适用于后来的软件。
- 更多细节请参见Yocto项目快速构建指南中的兼容Linux发行版部分,网址是https://www.yoctoproject.org/docs/current/brief-yoctoprojectqs/brief-yoctoprojectqs.html。
嵌入式开发涉及两个系统:用于开发程序的主机和运行程序的目标系统。对于主机系统,我使用了Ubuntu 20.04 LTS,但大多数Linux发行版只需稍加修改就可以使用。你可以决定在虚拟机中作为客人运行Linux,但你应该知道,有些任务,例如使用Yocto项目构建一个发行版,要求相当高,最好在Linux的本地安装中运行。
我选择了三个示范性的目标:QEMU模拟器、BeagleBone Black和Raspberry Pi 4。使用QEMU意味着你可以尝试大部分的例子,而不需要投资任何额外的硬件。另一方面,如果你有真正的硬件,有些事情会做得更好,为此,我选择了BeagleBone Black,因为它不贵,可以广泛使用,而且它有非常好的社区支持。树莓派4因其内置Wi-Fi和蓝牙而被添加到第三版中。当然,你并不局限于这三个目标。本书的理念是为你提供问题的一般解决方案,这样你就可以将它们应用于广泛的目标板。
下载示例代码文件
你可以从GitHub下载本书的示例代码文件,地址是
https://github.com/PacktPublishing/Mastering-Embedded-Linux-Programming-Third-Edition。