JRE 和 JDK JRE:Java運行環境,如果想要運行Java程式至少要安裝JRE JDK:Java開發環境(開發工具包),如果要開發Java程式,必須安裝JDK JRE = JVM + 核心類庫 JDK = JRE + 開發工具包 JDK > JRE >JVM 關係如圖所示: JDK下載地址: ...
簡介
多年來,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。