多年来,Linux 一直是嵌入式计算的中流砥柱。 然而,从整体上涵盖这一主题的书籍却少之又少:这本书就是为了填补这一空白。 “嵌入式 Linux”一词定义不明确,可以适用于从恒温器到 Wi-Fi 路由器再到工业控制单元的各种设备内的操作系统。 然而,它们都是基于相同的基本开源软件构建的。 这些都是我在这本书中描述的技术,基于我作为一名工程师的经验和我为培训课程开发的材料。
技术不会停滞不前。 以嵌入式计算为基础的行业和主流计算一样容易受到摩尔定律的影响。 这意味着,自本书第一版出版以来,许多事情都发生了惊人的变化。 第三版经过全面修订,使用了主要开源组件的最新版本,包括 Linux5.4、Yocto Project 3.1 Dunfall 和 Buildroot 2020.02 LTS。 除了 Autotools 之外,这本书现在还涵盖了 CMake,这是一种现代构建系统,近年来得到了越来越多的采用。
掌握嵌入式 Linux 编程大致按照您在实际项目中遇到的顺序介绍这些主题。 前八章涉及项目的早期阶段,涵盖了选择工具链、引导加载器和内核等基础知识。 我以 Buildroot 和 Yocto 项目为例介绍了嵌入式构建系统的概念。 这一部分以对 Yocto 项目的新的深入报道结束。
第 2 节,第 9 章到15介绍了在正式进行开发之前需要做出的各种设计决策。 它涵盖了文件系统、软件更新、设备驱动程序、init
程序和电源管理等主题。 第 12 章演示了利用分路板进行快速成型的各种技术,包括如何读取原理图、焊头和使用逻辑分析仪排除信号故障。 第 14 章是对 Buildroot 的深入研究,您将学习如何使用 BusyBoxrunit
将系统软件划分为独立的服务。
第 3 节、第 16 章、17和18将帮助您进入项目的实施阶段。 我们从 Python 打包和依赖项管理开始,随着机器学习应用继续席卷全球,这个话题变得越来越重要。 接下来,我们将介绍各种形式的进程间通信和多线程编程。 本节最后仔细研究了 Linux 如何管理内存,并演示了如何使用各种可用的工具测量内存使用情况和检测内存泄漏。
第四节包括第 19 章和20,向您展示了如何有效地利用 Linux 提供的许多调试和性能分析工具来检测问题和识别瓶颈。 第 19 章现在介绍如何配置 Visual Studio 代码以使用 GDB 进行远程调试。 第 20 章现在包括了 BPF 的内容,BPF 是一种在 Linux 内核中实现高级编程跟踪的新技术。 最后一章汇集了几个线程来解释 Linux 如何用于实时应用。
每章介绍嵌入式 Linux 的一个主要领域。 它描述了背景以便您可以了解一般原则,但它还包括详细的工作示例,说明这些领域中的每一个。 你可以把它当作一本理论书,或者一本样例书。 如果你两者兼而有之,效果最好:理解理论,然后在现实生活中尝试。
这本书是为对嵌入式计算和 Linux 感兴趣的开发人员编写的,这些开发人员希望将他们的知识扩展到该主题的各个分支。 在写这本书时,我假设您对 Linux 命令行有基本的了解,在编程示例中,我假定您有 C 和 Python 语言的实用知识。 有几章侧重于嵌入式目标板中的硬件,因此,熟悉硬件和硬件接口在这些情况下将是明显的优势。
第 1 章,从开始,通过描述嵌入式 Linux 生态系统和项目开始时提供的选择来设置场景。
第 2 章,了解工具链描述了工具链的组件,并向您展示了如何为目标线路板创建用于交叉编译代码的工具链。 它描述了从哪里获得工具链,并提供了关于如何从源代码构建工具链的详细信息。
第 3 章,All About Bootloaders解释了引导加载程序在将 Linux 内核加载到内存中的作用,并使用 U-Boot 作为示例。 它还引入了设备树作为几乎所有嵌入式 Linux 系统中用于编码硬件细节的机制。
第 4 章,配置和构建内核提供了有关如何为嵌入式系统选择 Linux 内核并为设备内的硬件配置它的信息。 它还介绍了如何将 Linux 移植到新硬件上。
第 5 章,构建根文件系统通过如何配置根文件系统的分步指南介绍了嵌入式 Linux 实现的用户空间部分背后的思想。
第 6 章,选择构建系统涵盖了两个常用的嵌入式 Linux 构建系统,Buildroot 和 Yocto Project,它们自动执行前四章中描述的步骤。
第 7 章,使用 Yocto进行开发,演示了如何在现有 BSP 层上构建系统映像,如何使用 Yocto 的可扩展 SDK 开发板载软件包,以及如何使用完整的运行时包管理来运行您自己的嵌入式 Linux 发行版。
第 8 章,Yocto Under the Hood介绍了 Yocto 的构建工作流程和体系结构,包括对 Yocto 独特的多层方法的解释。 它还通过实际食谱文件中的示例分析了 BitBake 语法和语义的基础知识。
第 9 章,创建存储策略讨论了管理闪存(包括原始闪存芯片和嵌入式 MMC(eMMC)封装所带来的挑战。 它描述了适用于每种技术的文件系统。
第 10 章,现场更新软件研究了设备部署后更新软件的各种方式,包括完全托管的空中(OTA)更新。 正在讨论的关键话题是可靠性和安全性。
第 11 章,与设备驱动程序接口,描述内核设备驱动程序如何通过实现一个简单的驱动程序与硬件交互。 它还描述了从用户空间调用设备驱动程序的各种方式。
第 12 章,使用转接板进行原型制作,演示了如何使用 Beaglebone Black 的预置 Debian 映像和外围转接板快速制作硬件和软件原型。 您将学习如何阅读数据手册、布线电路板、多路复用设备树绑定以及分析 SPI 信号。
第 13 章,启动-init 程序解释了第一个用户空间
程序-init
-如何启动系统的其余部分。 它描述了init
程序的三个版本,每个版本都适用于不同的嵌入式系统组,从 BusyBoxinit
的简单性到 System Vinit
,再到当前最先进的方法systemd
。
第 14 章,从 BusyBox Runit开始,向您展示如何使用 Buildroot 将您的系统划分为独立的 BusyBoxrunit
服务,每个服务都有自己的专用进程监控和日志记录,就像systemd
提供的那样。
第 15 章,管理电源考虑了调整 Linux 以降低功耗的各种方法,包括动态频率和电压调整、选择更深的空闲状态和系统挂起。 其目的是让设备在充满电池的情况下运行更长时间,同时也能运行得更冷。
第 16 章,打包 Python解释了将 Python 模块捆绑在一起进行部署有哪些选择,以及何时使用一种方法而不是另一种方法。 它涵盖pip
、虚拟环境、conda
和 Docker。
第 17 章,了解进程和线程从应用员的角度描述嵌入式系统。 本章介绍进程和线程、进程间通信以及调度策略。
第 18 章,管理内存介绍了虚拟内存背后的思想,以及如何将地址空间划分为内存映射。 它还描述了如何准确测量内存使用情况以及如何检测内存泄漏。
第 19 章,使用 gdb调试,向您展示了如何使用 GNU 调试器 gdb 和调试代理gdbserver
来调试在目标设备上远程运行的应用。 它接着展示了如何通过 KGDB 使用内核调试存根来扩展此模型以调试内核代码。
第 20 章,分析和跟踪涵盖了可用于测量系统性能的技术,从整个系统配置文件开始,然后聚焦于瓶颈导致性能较差的特定 区域。 它还描述了如何使用 Valgrind 检查应用使用线程同步和内存分配的正确性。
第 21 章,实时编程提供了 Linux 实时编程的详细指南,包括内核配置和PREEMPT_RT
实时内核补丁。 内核跟踪工具 Ftrace 用于测量内核延迟,并显示各种内核配置的影响。
本书中使用的软件完全是开源的。 在几乎所有情况下,我都使用了撰写本文时可用的最新稳定版本。 虽然我试图以一种不特定于版本的方式描述主要功能,但不可避免的是,其中一些示例需要修改才能与以后的软件一起使用。
有关详细信息,请参阅位于https://www.yoctoproject.org/docs/current/brief-yoctoprojectqs/brief-yoctoprojectqs.html的Yocto 项目快速构建指南的兼容 Linux 发行版*部分。
嵌入式开发涉及两个系统:用于开发程序的主机和运行程序的目标。 对于主机系统,我使用的是 Ubuntu20.04LTS,但大多数 Linux 发行版只需稍作修改即可运行。 您可能决定在虚拟机中作为来宾运行 Linux,但您应该知道,某些任务(如使用 Yocto Project 构建发行版)要求很高,在 Linux 的本机安装上运行效果更好。
我选择了三个示例目标:QEMU 模拟器、Beaglebone Black 和 Raspberry PI 4。使用 QEMU 意味着您可以在不投资任何额外硬件的情况下试用大多数示例。 另一方面,如果你有真正的硬件,有些东西会工作得更好,为此,我选择了 Beaglebone Black,因为它不贵,随处可见,而且有非常好的社区支持。 Raspberry Pi 4 是在第三版中增加的,因为它有内置的 Wi-Fi 和蓝牙功能。 当然,你并不局限于这三个目标。 这本书背后的想法是为你提供问题的一般解决方案,这样你就可以将它们应用到广泛的目标板上。
您可以从 gihub 下载本书的示例代码文件,地址是 https://github.com/PacktPublishing/Mastering-Embedded-Linux-Programming-Third-Edition。
如果代码有更新,它将在现有的 GitHub 存储库中进行更新。 我们还在https://github.com/PacktPublishing/上提供了丰富的图书和视频目录中的其他代码包。 看看他们!
我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。 您可以在此处下载:http://www.packtpub.com/sites/default/files/downloads/9781789530384_ColorImages.pdf。
本书中使用了许多文本约定。
Code in text
:指示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。 这里有一个示例:“要配置网络的主机端,您需要来自 User Mode Linux(UML)项目的tunctl
命令。”
代码块设置如下:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
printf ("Hello, world!\n");
return 0;
}
任何命令行输入或输出都如下所示:
$ sudo tunctl -u $(whoami) -t tap0
粗体:表示您在屏幕上看到的新术语、重要单词或单词。 例如,菜单或对话框中的单词显示在文本中,如下所示。 这里有一个例子:“单击 Etcher 中的Flash来写入图像。”
提示或重要说明
看起来就像这样。
欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中提及书名,并向我们发送电子邮件至[email protected]。
勘误表:虽然我们已经竭尽全力确保内容的准确性,但错误还是会发生。 如果您在这本书中发现了错误,请向我们报告,我们将不胜感激。 请访问www.Packtpub.com/support/errata,选择您的图书,单击勘误表提交表链接,然后输入详细信息。
盗版:如果您在互联网上遇到任何形式的非法复制我们的作品,请您提供地址或网站名称,我们将不胜感激。 请通过[email protected]联系我们,并提供该材料的链接。
如果您有兴趣成为一名作者:如果有一个您擅长的主题,并且您有兴趣撰写或投稿一本书,请访问Auths.Packtpub.com。
请留下评论。 一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢? 这样,潜在读者就可以看到并使用您不偏不倚的意见来做出购买决定,我们 Packt 可以了解您对我们产品的看法,我们的作者也可以看到您对他们的书的反馈。 谢谢!
有关 Packt 的更多信息,请访问Packt.com。