內容簡介
《嵌入式Linux編程》引導你遍曆整個嵌入式linux産品的周期,並提供在每個階段可用組件和選項的深入描述。首先,你將學習關於工具鏈、引導加載程序、Linux內核,以及如何配置根文件係統。然後,你將學習如何使用兩個常用的構建係統,即Buildroot和Yocto項目,以加快和簡化開發過程。在這個堅實的基礎上,下麵的章節考慮如何佳地使用rawNAND/NOR閃存和托管閃存eMMC芯片,包括增加器件壽命的機製以及進行可靠的現場更新。然後,我們將探討POSIX綫程的使用,這對終設備的響應能力和性能有著很大的影響。本書的結尾部分探討使用perf和ftrace剖析和跟蹤應用程序以及內核代碼的技術。
目錄
譯者序
推薦序
審校者簡介
前言
第1章 概述 1
1.1 選擇閤適的操作係統 2
1.2 參與者 3
1.3 項目生命周期 4
1.4 開放源碼 5
1.5 嵌入式Linux係統硬件 6
1.6 本書使用的硬件 7
1.7 本書使用的軟件 9
1.8 總結 9
第2章 學習工具鏈 10
2.1 工具鏈是什麼 10
2.2 工具鏈類型:本地工具鏈和交叉工具鏈 11
2.3 選擇C庫 13
2.4 尋找工具鏈 14
2.5 工具鏈解析 17
2.6 工具鏈中的其他工具 20
2.7 查看C庫的組件 21
2.8 鏈接庫:靜態和動態鏈接 21
2.9 交叉編譯藝術 24
2.10 交叉編譯的問題 28
2.11 總結 29
第3章 引導加載程序 30
3.1 引導加載程序都做瞭些什麼 30
3.2 引導序列 31
3.3 使用UEFI固件引導 32
3.4 從引導加載程序到內核 33
3.5 設備樹介紹 34
3.6 選擇引導加載程序 38
3.7 U-Boot 39
3.8 Barebox 49
3.9 總結 51
第4章 移植與配置內核 52
4.1 內核做瞭什麼 52
4.2 選擇內核 53
4.3 內核構建 55
4.4 編譯 60
4.5 清理內核源 63
4.6 啓動你的內核 63
4.7 將Linux移植到新闆上 66
4.8 延伸閱讀 69
4.9 總結 69
第5章 構建根文件係統 71
5.1 根文件係統是什麼 71
5.2 根文件係統的程序 75
5.3 根文件係統庫 78
5.4 設備節點 79
5.5 proc與sysfs文件係統 80
5.6 內核模塊 81
5.7 把根文件係統轉移到目標 81
5.8 創建啓動內存磁盤 82
5.9 init程序 85
5.10 配置用戶賬號 86
5.11 啓動守護進程 87
5.12 管理設備節點的更好方法 88
5.13 配置網絡 89
5.14 藉助設備錶創建文件係統映像 90
5.15 使用NFS掛載根文件係統 92
5.16 使用TFTP加載內核 94
5.17 延伸閱讀 95
5.18 總結 95
第6章 選擇構建係統 96
6.1 不再手動創建嵌入式Linux 96
6.2 構建係統 96
6.3 包格式和包管理器 98
6.4 Buildroot 98
6.5 Yocto項目 104
6.6 延伸閱讀 116
6.7 總結 116
第7章 創建存儲策略 117
7.1 存儲器選擇 117
7.2 從引導加載程序訪問閃存 121
7.3 從Linux中訪問閃存 122
7.4 閃存文件係統 127
7.5 NOR和NAND閃存的文件係統 128
7.6 托管閃存的文件係統 134
7.7 隻讀壓縮文件係統 138
7.8 臨時文件係統 138
7.9 使根文件係統為隻讀 139
7.10 文件係統選擇 140
7.11 現場更新 140
7.12 延伸閱讀 142
7.13 總結 143
第8章 設備驅動程序介紹 144
8.1 設備驅動程序的作用 144
8.2 字符設備 145
8.3 塊設備 147
8.4 網絡設備 147
8.5 在運行時尋找驅動程序 149
8.6 找到正確的設備驅動程序 153
8.7 用戶空間中的設備驅動程序 153
8.8 編寫內核設備驅動程序 158
8.9 加載內核模塊 163
8.10 查找硬件配置 163
8.11 延伸閱讀 166
8.12 總結 167
第9章 啓動初始化程序 168
9.1 在內核啓動後 168
9.2 初始化程序簡介 169
9.3 BusyBox init 169
9.4 System V init 171
9.5 systemd 176
9.6 延伸閱讀 181
9.7 總結 181
第10章 學習進程和綫程 182
10.1 進程還是綫程 182
10.2 進程 183
10.3 綫程 191
10.4 調度 196
10.5 延伸閱讀 200
10.6 總結 200
第11章 內存管理 201
11.1 虛擬內存基礎 201
11.2 內核空間內存布局 202
11.3 用戶空間內存布局 205
11.4 進程內存映射 206
11.5 交換 207
11.6 用mmap映射內存 208
11.7 我的應用程序使用瞭多少內存 209
11.8 每個進程的內存使用情況 210
11.9 識彆內存泄漏 213
11.10 內存耗盡 215
11.11 延伸閱讀 217
11.12 總結 217
第12章 使用GDB調試 218
12.1 GNU調試器:GDB 218
12.2 準備調試 218
12.3 使用GDB調試應用程序 219
12.4 使用gdbserver遠程調試 219
12.5 開始調試 221
12.6 調試共享庫 224
12.7 即時調試 225
12.8 調試分叉和綫程 226
12.9 核心文件 226
12.10 GDB用戶界麵 228
12.11 調試內核代碼 230
12.12 延伸閱讀 237
12.13 總結 237
第13章 剖析和跟蹤 238
13.1 觀察者效應 238
13.2 開始剖析 239
13.3 使用top進行剖析 240
13.4 介紹perf 241
13.5 其他剖析器:OProf?ile和gprof 245
13.6 跟蹤事件 247
13.7 介紹Ftrace 247
13.8 使用LTTng 252
13.9 使用Valgrind剖析應用程序 256
13.10 Callgrind 256
13.11 Helgrind 256
13.12 使用strace顯示係統調用 257
13.13 總結 259
第14章 實時編程 260
14.1 什麼是實時性 260
14.2 確認非確定性的來源 262
14.3 理解調度延遲 263
14.4 內核搶占 263
14.5 實時Linux內核(PREEMPT_RT) 264
14.6 綫程化中斷處理程序 264
14.7 可搶占的內核鎖 266
14.8 獲得PREEMPT_RT補丁 266
14.9 高精度定時器 267
14.10 在實時應用中避免頁麵錯誤 268
14.11 中斷屏蔽 269
14.12 測量調度延遲 2
前言/序言
Preface 前 言 嵌入式係統是一種設備,它的裏麵有一颱微控製器。洗衣機、電視機、打印機、汽車、飛機和機器人都是由一個或多個微控製器控製的。隨著這些設備變得越來越復雜,以及我們對於這些設備所擁有功能期望的提高,對於一個強大的操作係統來控製它們的需求不斷增長。Linux逐漸成為首選的操作係統。 Linux的優勢來源於它的開源模型,它鼓勵代碼共享。這意味著,具有眾多背景並且經常由不同競爭公司雇用的軟件工程師們,可以閤作創建最新的操作係統內核並且跟蹤硬件開發。這樣一個代碼庫,可以對上至最大的超級計算機下至手錶提供支持。Linux隻是操作係統的一個組件。要創建一個工作係統,還需要許多其他組件,從基本的工具,如命令外殼,到具有Web內容並且與雲服務通信的圖形用戶界麵。Linux內核與眾多其他的開源組件一起,可以構建一個在廣泛的領域中發揮作用的係統。 然而,靈活性是一把雙刃劍。盡管它可以針對一個特定問題給係統設計師提供廣泛的備選解決方案,但是它也提齣瞭這樣的問題,即需要知道哪個方案是最好的選擇。本書的目的是詳細描述如何使用免費的開源項目構建一個嵌入式Linux係統,以生成一個健壯、可靠、高效的係統。基於作者作為一名谘詢顧問和培訓師的多年經驗,本書將使用實例來說明最佳實踐。 本書內容本書是按典型的嵌入式Linux項目的生命周期綫組織的。前6章介紹如何建立項目,組織、Linux係統,以及選擇閤適的Linux構建係統。下一步,到達需要對係統架構和設計選擇做齣某些關鍵決策的階段,包括閃存、設備驅動程序和init係統。接著,是利用已構建的嵌入式平颱編寫應用程序的階段,其中有兩章是關於進程、綫程和內存管理的。最後,來到調試和優化平颱的階段,這是在第12章和第13章討論的。最後一章描述如何為實時應用程序配置Linux。 第1章 通過描述係統設計師在項目開始時的可行選擇來設置場景。 第2章 描述工具鏈的組件,特彆是交叉編譯。本章描述從何處獲取一個工具鏈,並且提供從源代碼構建工具鏈的細節。 第3章 以U-Boot和Bareboot為例,解釋引導加載程序在初始化設備硬件中的作用。本章還描述設備樹,這是一種在許多嵌入式係統中使用的硬件配置編碼方式。 第4章 提供關於如何針對一個嵌入式係統選擇Linux內核以及為設備內部硬件配置Linux內核的信息。本章還包括如何將Linux移植到新的硬件。 第5章 通過一個關於如何配置根文件係統的分步指南,介紹關於嵌入式Linux實現的用戶空間部分所隱含的思想。 第6章 包括兩個嵌入式Linux構建係統,通過構建係統可以自動化前麵4章描述的步驟,並且總結本書第一部分。 第7章 討論閃存管理所引起的挑戰,包括raw f?lash芯片和嵌入式MMC或eMMC封裝。本章描述適用於每種技術類型的文件係統。本章還包括如何現場更新設備固件的技術。 第8章 通過一個簡單的驅動程序實例描述內核設備驅動程序如何與硬件交互。本章還描述從用戶空間調用設備驅動程序的各種方法。 第9章 說明第一個用戶空間程序init如何啓動係統的其餘部分。本章描述init程序的三個版本,每個版本適用於一組不同的嵌入式係統,從BusyBox init到systemd復雜性遞增。 第10章 從應用程序員的角度描述嵌入式係統。本章討論進程和綫程、進程間通信和調度策略。 第11章 介紹虛擬內存背後的思想,以及如何將地址空間劃分為內存映射。本章還介紹如何檢測正在使用的內存和內存泄漏。 第12章 介紹如何使用GNU調試器GDB,以交互方式調試用戶空間和內核代碼。本章還描述內核調試器kdb。 第13章 涵蓋可用於測量係統性能的技術,從全係統分析開始,然後聚焦特定的區域,該區域通常是造成性能不佳的瓶頸。本章還描述Valgrind工具,用於檢查應用程序是否正確使用綫程同步和內存分配。 第14章 提供關於Linux實時編程的詳細指南,包括內核配置和實時內核補丁,還提供關於測量實時延遲的工具描述。本章還包括關於如何通過鎖定內存來減少頁麵故障數量的信息。 本書所需配套環境本書中使用的軟件完全是開源的。在大多數情況下,使用的版本是在本書寫作時可用的最新的穩定版本。盡管我試圖以一種不針對特定版本的方式描述主要特性,但是不可避免地,在命令實例中包含的一些細節將無法在後來的版本中工作。我希望與它們相關的描述能夠提供足夠的信息,從而可以將同樣的原則應用到軟件包的後期版本中。 在創建一個嵌入式係統時涉及兩個係統:用於交叉編譯軟件的主機係統和用於運行軟件的目標係統。對於主機係統,我使用的是Ubuntu 14.04,但是大多數Linux發行版隻需要很小的修改即可工作。同樣地,需要選擇一個目標係統來錶示嵌入式係統。我選擇瞭兩個:BeagelBone Black和QEMU CPU仿真器,用於仿真ARM目標。後者意味著你可以試驗這些實例,而不必為一個實際的目標設備來投資硬件。同時,通過對特定細節的修改,例如設備名稱和內存布局,應該有可能將實例應用到範圍更廣泛的目標。 ……
嵌入式Linux編程 下載 mobi epub pdf txt 電子書