多年來,Linux一直是嵌入式計算的中流砥柱。然而,涵蓋該領域所有主題的書籍非常少,本書旨在填補這一空白。“嵌入式Linux”一詞的定義並不明確,它可以應用於從恆溫器到Wi-Fi路由器,再到工業的各種設備內的操作繫統。但是,它們都建立在相同的基本開源軟件之上。這些正是我們在本書中要描述的技術,本書的寫作基於我們作為工程師的經驗和為培訓課程開發的資料。
技術不會停滯不前。基於嵌入式計算的行業與主流計算一樣容易受到摩爾定律的影響。這種指數級的增長意味著自本書第一版出版以來發生了驚人的大量變化。你現在正在閱讀的第三版經過全面修訂,使用最新版本的主要開源組件,包括Linux 5.4、Yocto Project 3.1 Dunfell和Buildroot 2020.02 LTS。除了Autotools,本書還包含CMake,這是一種新構建繫統,近年來得到了越來越多的采用。
本書大致按照你在實際項目中遇到的順序來涵蓋這些主題。第1篇包括第1~8章,涉及項目的早期階段。本篇涵蓋選擇工具鏈、引導加載程序和內核等基礎知識。我們以Buildroot和Yocto項目為例介紹嵌入式構建繫統的概念。本篇以對Yocto Project的新深入研究結束。
第2篇包括第9~15章,著眼於在進行開發之前需要做出的各種設計決策。本篇涵蓋文件繫統、軟件更新、設備驅動程序、init程序和電源管理等主題。第12章演示使用分線板進行快速原型設計的各種技術,包括如何使用邏輯分析儀讀取原理圖、焊接接頭和排除信號故障等。第14章深入探討Buildroot,你將學習如何使用BusyBox runit將繫統軟件劃分為單獨的服務。
第3篇包括第16~18章,將為你的項目實施階段提供幫助。我們從Python打包和依賴管理開始,隨著機器學習應用程序風靡全球,這個話題變得越來越重要。然後,我們討論各種形式的進程間通信和多線程編程。本篇最後還仔細探討Linux如何管理內存,並演示如何使用各種可用工具來測量內存使用情況和檢測內存洩漏。
第4篇包括第19~21章,向你展示如何有效地利用Linux提供的許多調試和分析工具來檢測問題和識別性能瓶頸。第19章介紹如何配置Visual Studio Code以使用GDB進行遠程調試。第20章介紹BPF,這是一種在Linux內核中實現高級編程跟蹤的新技術。最後一章則闡釋如何在實時應用程序中使用Linux。
本書的每一章都介紹嵌入式Linux的一個主要領域。它描述知識背景,以便你可以了解一般原則,它還包括詳細的有效示例來說明這些領域中的操作。你可以把它當作一本理論書籍,也可以將它作為一本實戰操作指南。如果你能二者兼得,那麼效果當然最好:你可以先熟悉理論,然後在現實生活中嘗試。
本書讀者
本書是為對嵌入式計算和Linux感興趣的開發人員編寫的。在編寫本書時,我們假設你對Linux命令行有基本的了解;在編程示例中,我們假設你對C和Python語言的知識有一定的了解。其中還有幾章側重於嵌入式目標板的硬件,因此對於本書讀者來說,熟悉硬件和硬件接口將是一個明顯的優勢。
內容介紹
本書分為4篇共21章,具體介紹如下。
第1篇:嵌入式Linux的要素,包括第1~8章。
第1章“初識嵌入式Linux開發”,詳細闡釋嵌入式Linux生態繫統,介紹硬件選擇和開發環境配置等準備工作。
第2章“關於工具鏈”,描述工具鏈的組件,演示如何為目標開發板的交叉編譯代碼創建工具鏈。本章還詳細介紹從何處獲取工具鏈,並提供有關如何從源代碼中構建工具鏈的詳細信息。
第3章“引導加載程序詳解”,闡釋引導加載程序在將Linux內核加載到內存這一過程中的作用,並以U-Boot為例演示其操作。本章還介紹設備樹,它是一種對幾乎所有嵌入式Linux繫統中的硬件細節進行編碼的機制。
第4章“配置和構建內核”,介紹如何為嵌入式繫統選擇Linux內核並為設備內的硬件配置它。本章還介紹如何將Linux移植到新的硬件上。
第5章“構建根文件繫統”,通過有關如何配置根文件繫統的分步指南,詳細介紹嵌入式Linux實現的用戶空間部分背後的思想。
第6章“選擇構建繫統”,涵蓋兩個常用的嵌入式Linux構建繫統Buildroot和Yocto Project,它們可以自動執行此前4章中描述的步驟。
第7章“使用Yocto進行開發”,演示如何在現有板級支持包(BSP)層之上構建繫統鏡像,如何使用Yocto的可擴展SDK開發板載軟件包,如何推出你自己的嵌入式Linux發行版,以及如何進行運行時包管理和配置遠程包服務器等。
第8章“Yocto技術內幕”,介紹Yocto的構建工作流程和架構,包括對Yocto獨特的多層方法的解釋。本章還通過實際配方文件中的示例詳細介紹BitBake語法和語義方面的基礎知識。
第2篇:繫統架構和設計決策,包括第9~15章。
第9章“創建存儲策略”,討論管理閃存帶來的挑戰,包括原始閃存芯片和嵌入式MMC(eMMC)封裝。本章還描述適用於各種技術的文件繫統。
第10章“現場更新軟件”,介紹在設備部署後更新軟件的各種方法,包括完全托管的無線(OTA)更新。本章討論的關鍵主題是可靠性和安全性。
第11章“連接設備驅動程序”,描述內核設備驅動程序如何通過實現一個簡單的驅動程序與硬件進行交互。本章還闡釋從用戶空間調用設備驅動程序的各種方法。
第12章“使用分線板進行原型設計”,演示如何使用BeagleBone Black開發板的預構建Debian鏡像和外圍分線板快速構建硬件和軟件原型。你將了解如何閱讀數據表、連接電路板、多路復用設備樹綁定以及分析SPI信號。
第13章“init程序”,解釋第一個用戶空間程序init,討論如何通過它啟動繫統的其餘部分。本章描述init程序的3個版本(每個版本都適用於不同的嵌入式繫統組):從簡單的BusyBox init到System V init,再到當前最先進的方法systemd。
第14章“使用BusyBox runit啟動”,演示如何使用Buildroot將繫統劃分為單獨的BusyBox runit 服務,每個服務都有自己的專用進程監督和日志記錄,就像 systemd 提供的那樣。與System V init不同,BusyBox runit服務是同時啟動而不是順序啟動,這可以顯著加快啟動速度。
第15章“管理電源”,考慮可以調整Linux以降低功耗的各種方法,包括動態頻率和電壓調整、選擇更深的空閑狀態和繫統掛起等。其目的是使設備在電池充電時運行時間更長,並且運行溫度更低。
第3篇:編寫嵌入式應用程序,包括第16~18章。
第16章“打包Python程序”,解釋哪些選項可用於將Python模塊捆綁在一起進行部署,以及何時使用一種方法而不是另一種方法。本章涵蓋pip、venv、conda和Docker。
第17章“了解進程和線程”,從應用程序開發人員的角度描述嵌入式繫統。本章著眼於進程和線程、進程間通信和調度策略。
第18章“管理內存”,介紹虛擬內存背後的思想以及地址空間如何被劃分為內存映射。本章還描述如何準確測量內存使用情況,以及如何檢測內存洩漏。
第4篇:調試和優化性能,包括第19~21章。
第19章“使用GDB進行調試”,演示使用GNU調試器GDB和調試代理gdbserver來調試在目標設備上遠程運行的應用程序。本章還介紹如何擴展這個模型來調試內核代碼,即利用kgdb調試內核代碼。
第20章“性能分析和跟蹤”,涵蓋可用於測量繫統性能的技術。本章從整個繫統的性能分析開始,介紹多種性能分析工具。本章還描述如何使用Valgrind檢查應用程序在線程同步和內存分配方面的正確性。
第21章“實時編程”,提供Linux實時編程的詳細指南,包括內核配置和 PREEMPT_RT實時內核補丁。內核跟蹤工具Ftrace可用於測量內核調度延遲並顯示各種內核配置的效果。
充分利用本書
本書中使用的軟件是完全開源的。在幾乎所有示例中,我們都使用了撰寫本文時可用的最新穩定版本。雖然我們試圖以不特定於版本的方式來描述主要功能,但不可避免的是一些示例需要適應以後的軟件。
本書涵蓋的軟硬件如表P-1所示。
表P-1 本書涵蓋的軟硬件
本書涵蓋的軟硬件 操作繫統需求
BeagleBone Black 不適用
Raspberry Pi 4 不適用
QEMU(32位ARM) Linux(任意版本)
Yocto Project 3.1(Dunfell) 兼容Linux發行版*
Buildroot 2020.02 LTS Linux(任意版本)
crosstool-NG 1.24.0 Linux(任意版本)
U-Boot v2021.01 Linux(任意版本)
Linux Kernel 5.4 Linux(任意版本)
* 有關更多詳細信息,你可以參閱Yocto Project Quick Build(《Yocto Project快速構建》)指南的“Compatible Linux Distribution”(《兼容Linux發行版》)部分。其網址如下:
https://www.yoctoproject.org/docs/current/brief-yoctoprojectqs/brief-yoctoprojectqs.html
嵌入式開發涉及主機和目標兩個繫統:主機用於開發程序,目標用於運行程序。對於主機繫統,我們使用的是Ubuntu 20.04 LTS,但大多數Linux發行版隻需稍作修改即可工作。你可能決定在虛擬機中以訪客身份運行Linux,但你應該知道,某些任務(如使用Yocto Project構建發行版)要求很高,最好在Linux的本機安裝上運行。
本書選擇了3個示例目標:QEMU模擬器、BeagleBone Black和Raspberry Pi 4。使用QEMU意味著你可以嘗試大多數示例,而無須投資任何額外的硬件。另外,如果你有真正的硬件,有些事情會更好,為此,我們選擇了BeagleBone Black,因為它較為便宜,廣泛可用,並且有很好的社區支持。Raspberry Pi 4是在本書第3版中添加的,因為它內置了Wi-Fi和藍牙。當然,你不僅限於這3個目標。本書背後的想法是為你提供問題的通用解決方案,以便你可以將它們應用到廣泛的目標板上。
下載示例代碼文件
本書隨附的代碼可以在GitHub上找到,其網址如下:
https://github.com/PacktPublishing/Mastering-Embedded-Linux-Programming-Third-Edition
如果代碼有更新,那麼它將在GitHub存儲庫中被更新。
下載彩色圖像
我們還提供了一個PDF文件,其中包含本書中使用的屏幕截圖/圖表的彩色圖像。你可以通過以下地址進行下載:
https://static.packt-cdn.com/downloads/9781789530384_ColorImages.pdf
本書約定
本書中使用了許多文本約定。
(1)有關代碼塊的設置如下:
#include
#include
int main (int argc, char *argv[])
{
printf ("Hello, world!\
);
return 0;
}
(2)為了突出代碼塊,相關內容需要以粗體的形式進行顯示:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
(3)任何命令行的輸入或輸出都采用如下所示的粗體代碼形式:
$ sudo tunctl -u $(whoami) -t tap0
(4)術語或重要單詞采用中英文對照的形式給出,在括號內保留其英文原文。示例如下:
在嵌入式設備中最常見的架構是ARM、MIPS、PowerPC和x86,每一種都有32位和64位變體,它們都具有內存(memory management unit,MMU)。
(5)對於界面詞彙或專有名詞將保留其英文原文,在括號內添加其中文譯文。示例如下:
最後,將BR2_ROOTFS_OVERLAY設置為指向覆蓋層的路徑。可以在menuconfig中使用System configuration(繫統配置)| Root filesystem overlay directories(根文件繫統覆蓋層目錄)選項進行配置。
(6)本書還使用了以下兩個圖標:
表示警告或重要的注意事項。
表示提示信息或操作技巧。