《嵌入式Linux基礎教程(第2版)》是嵌入式Linux的經(jīng)典教程,介紹了引導加載程序、系統(tǒng)初始化、文件系統(tǒng)、閃存和內(nèi)核、應用程序調(diào)試技巧等,還講述了構建Linux系統(tǒng)的工作原理,用于驅(qū)動不同架構的配置,Linux內(nèi)核源碼樹的特性,如何根據(jù)需求配制內(nèi)核運行時的行為,如何擴展系統(tǒng)功能,用于構建完整嵌入式Linux發(fā)行版的常用構建系統(tǒng),USB子系統(tǒng)和系統(tǒng)配置工具udev等內(nèi)容。更重要的是,《嵌入式Linux基礎教程(第2版)》闡述了如何修改系統(tǒng)使之滿足讀者自身的需求,確保讀者能夠從中學習一些嵌入式工程中非常有用的提示和技巧。
《嵌入式Linux基礎教程(第2版)》適合Linux程序員閱讀,也可作為高等院校相關專業(yè)師生的參考讀物。
嵌入式Linux著作
Amazon全五星評價
全面剖析嵌入式Linux開發(fā),揭示大量技術內(nèi)幕
廣泛的硬件支持、高效穩(wěn)定的內(nèi)核、開源共享的軟件開發(fā)工具、完善的網(wǎng)絡通信和文件管理機制等特點,是嵌入式Linux獲得了廣泛應用,已成為嵌入式開發(fā)的主流平臺。
本書是嵌入式Linux領域的名著,全面深入而又簡明地闡述了構建嵌入式Linux系統(tǒng)的精髓。本書不僅剖析了嵌入式Linux系統(tǒng),而且講述了處理器、內(nèi)核、引導加載程序、設備驅(qū)動開發(fā)、文件系統(tǒng)等關鍵組件,介紹了嵌入式Linux系統(tǒng)的開發(fā)工具、調(diào)試技術。作者多年積累總結(jié)的嵌入式Linux開發(fā)技巧和提示,無論對初學者還是有經(jīng)驗的開發(fā)人員,都彌足珍貴。這一版不僅對原有章節(jié)進行了全面的修訂、更新和改進,還新增了udev、USB和開源構建系統(tǒng)等內(nèi)容。
Christopher Hallinan,注明嵌入式Linux技術專家,F(xiàn)任Mentor Graphics公司技術市場工程師,曾任MontaVista軟件公司現(xiàn)場應用工程師,3Com公司工程總監(jiān),Crosscomm公司工程總監(jiān)。他有25年以上網(wǎng)絡和通信產(chǎn)品的軟硬件開發(fā)經(jīng)驗。曾擔任Linux咨詢師,提供定制Linux主板接口、設備驅(qū)動程序和引導加載程序等方面的解決方案。
第1章 入門 1
1.1 為什么選擇Linux 1
1.2 嵌入式Linux現(xiàn)狀 2
1.3 開源和GPL 2
1.4 標準及相關組織 3
1.4.1 Linux標準基礎 3
1.4.2 Linux基金會 4
1.4.3 電信級Linux 4
1.4.4 移動Linux計劃:Moblin 4
1.4.5 服務可用性論壇 5
1.5 小結(jié) 5
第2章 綜述 6
2.1 嵌入與非嵌入 6
2.2 剖析嵌入式系統(tǒng) 7
2.2.1 典型的嵌入式Linux開發(fā)環(huán)境 8
2.2.2 啟動目標板 9
2.2.3 引導內(nèi)核 10
2.2.4 內(nèi)核初始化:概述 12
2.2.5 第一個用戶空間進程:init 13
2.3 存儲 14
2.3.1 閃存 14
2.3.2 NAND型閃存 15
2.3.3 閃存的用途 16
2.3.4 閃存文件系統(tǒng) 17
2.3.5 內(nèi)存空間 17
2.3.6 執(zhí)行上下文 19
2.3.7 進程虛擬內(nèi)存 20
2.3.8 交叉開發(fā)環(huán)境 21
2.4 嵌入式Linux發(fā)行版 22
2.4.1 商業(yè)Linux發(fā)行版 24
2.4.2 打造自己的Linux發(fā)行版 24
2.5 小結(jié) 24
第3章 處理器基礎 26
3.1 獨立處理器 26
3.1.1 IBM 970FX 27
3.1.2 英特爾奔騰M 27
3.1.3 英特爾凌動TM 28
3.1.4 飛思卡爾MPC7448 28
3.1.5 配套芯片組 28
3.2 集成處理器:片上系統(tǒng) 30
3.2.1 Power架構 30
3.2.2 飛思卡爾Power架構 30
3.2.3 飛思卡爾PowerQUICC I 31
3.2.4 飛思卡爾PowerQUICC II 32
3.2.5 PowerQUICC II Pro 32
3.2.6 飛思卡爾PowerQUICC III 33
3.2.7 飛思卡爾QorIQTM 34
3.2.8 AMCC Power架構 36
3.2.9 MIPS 38
3.2.10 Broadcom MIPS 38
3.2.11 其他MIPS 39
3.2.12 ARM 40
3.2.13 德州儀器ARM 40
3.2.14 飛思卡爾ARM 42
3.2.15 其他ARM處理器 43
3.3 其他架構 43
3.4 硬件平臺 43
3.4.1 CompactPCI 43
3.4.2 ATCA 44
3.5 小結(jié) 44
第4章 Linux內(nèi)核:不同的視角 46
4.1 背景知識 46
4.1.1 內(nèi)核版本 47
4.1.2 內(nèi)核源碼庫 48
4.1.3 使用git下載內(nèi)核代碼 49
4.2 Linux內(nèi)核的構造 49
4.2.1 頂層源碼目錄 49
4.2.2 編譯內(nèi)核 50
4.2.3 內(nèi)核主體:vmlinux 52
4.2.4 內(nèi)核鏡像的組成部分 53
4.2.5 子目錄的布局 56
4.3 內(nèi)核構建系統(tǒng) 57
4.3.1。甤onfig文件 57
4.3.2 配置編輯器 58
4.3.3 Makefile目標 61
4.4 內(nèi)核配置 66
4.4.1 定制配置選項 68
4.4.2 內(nèi)核Makefile 71
4.5 內(nèi)核文檔 72
4.6 獲得定制的Linux內(nèi)核 72
4.7 小結(jié) 73
第5章 內(nèi)核初始化 75
5.1 合成內(nèi)核鏡像:Piggy及其他 75
5.1.1 Image對象 78
5.1.2 與具體架構相關的對象 78
5.1.3 啟動加載程序 79
5.1.4 引導消息 80
5.2 初始化時的控制流 83
5.2.1 內(nèi)核入口:head.o 84
5.2.2 內(nèi)核啟動:main.c 85
5.2.3 架構設置 86
5.3 內(nèi)核命令行的處理 87
5.4 子系統(tǒng)初始化 92
5.5 init線程 94
5.5.1 通過initcalls進行初始化 95
5.5.2 initcall_debug 96
5.5.3 最后的引導步驟 97
5.6 小結(jié) 98
第6章 用戶空間初始化 100
6.1 根文件系統(tǒng) 100
6.1.1 FHS:文件系統(tǒng)層次結(jié)構
標準 101
6.1.2 文件系統(tǒng)布局 101
6.1.3 最小化的文件系統(tǒng) 102
6.1.4 嵌入式根文件系統(tǒng)帶
來的挑戰(zhàn) 103
6.1.5 試錯法 104
6.1.6 自動化文件系統(tǒng)構建工具 104
6.2 內(nèi)核的最后一些引導步驟 104
6.2.1 第一個用戶空間程序 106
6.2.2 解決依賴關系 106
6.2.3 定制的初始進程 107
6.3 init進程 107
6.3.1 inittab 109
6.3.2 Web服務器啟動腳本示例 111
6.4 初始RAM磁盤 112
6.4.1 使用initrd進行引導 113
6.4.2 引導加載程序?qū)nitrd的
支持 113
6.4.3 initrd的奧秘所在:
linuxrc 115
6.4.4 initrd探究 116
6.4.5 構造initrd鏡像 116
6.5 使用initramfs 117
6.6 關機 119
6.7 小結(jié) 120
第7章 引導加載程序 122
7.1 引導加載程序的作用 122
7.2 引導加載程序帶來的挑戰(zhàn) 123
7.2.1 DRAM控制器 123
7.2.2 閃存與RAM 123
7.2.3 鏡像的復雜性 124
7.2.4 執(zhí)行環(huán)境 126
7.3 通用引導加載程序:Das U-Boot 126
7.3.1 獲取U-Boot 127
7.3.2 配置U-Boot 127
7.3.3 U-Boot的監(jiān)控命令 129
7.3.4 網(wǎng)絡操作 130
7.3.5 存儲子系統(tǒng) 132
7.3.6 從磁盤引導 133
7.4 移植U-Boot 133
7.4.1 EP405的U-Boot移植 133
7.4.2 U-Boot Makefile中的配置
目標 134
7.4.3 EP405的第一次構建 135
7.4.4 EP405 處理器初始化 136
7.4.5 與具體板卡相關的初始化 138
7.4.6 移植總結(jié) 141
7.4.7 U-Boot鏡像格式 141
7.5 設備樹對象(扁平設備樹) 143
7.5.1 設備樹源碼 145
7.5.2 設備樹編譯器 148
7.5.3 使用DTB的其他內(nèi)核鏡像 148
7.6 其他引導加載程序 149
7.6.1 Lilo 149
7.6.2 GRUB 150
7.6.3 其他更多的引導加載程序 151
7.7 小結(jié) 152
第8章 設備驅(qū)動程序基礎 154
8.1 設備驅(qū)動程序的概念 154
8.1.1 可加載模塊 155
8.1.2 設備驅(qū)動程序架構 155
8.1.3 最小設備驅(qū)動程序示例 156
8.1.4 模塊構建的基礎設施 157
8.1.5 安裝設備驅(qū)動程序 160
8.1.6 加載模塊 160
8.1.7 模塊參數(shù) 161
8.2 模塊工具 162
8.2.1 insmod 162
8.2.2 lsmod 163
8.2.3 modprobe 163
8.2.4 depmod 164
8.2.5 rmmod 165
8.2.6 modinfo 165
8.3 驅(qū)動程序方法 166
8.3.1 驅(qū)動程序中的文件系統(tǒng)
操作 166
8.3.2 設備號的分配 169
8.3.3 設備節(jié)點和mknod 169
8.4 綜合應用 170
8.5 在內(nèi)核源碼樹外構建驅(qū)動 171
8.6 設備驅(qū)動程序和GPL 172
8.7 小結(jié) 173
第9章 文件系統(tǒng) 174
9.1 Linux文件系統(tǒng)概念 175
9.2 ext2 176
9.2.1 掛載文件系統(tǒng) 177
9.2.2 檢查文件系統(tǒng)的完整性 178
9.3 ext3 180
9.4 ext4 182
9.5 ReiserFS 182
9.6 JFFS2 183
9.7 cramfs 185
9.8 網(wǎng)絡文件系統(tǒng) 187
9.9 偽文件系統(tǒng) 190
9.9.1 /proc文件系統(tǒng) 191
9.9.2 sysfs 194
9.10 其他文件系統(tǒng) 196
9.11 創(chuàng)建簡單的文件系統(tǒng) 197
9.12 小結(jié) 199
第10章 MTD子系統(tǒng) 201
10.1 MTD概述 201
10.1.1 開啟MTD服務 202
10.1.2 MTD基礎 203
10.1.3 在目標板上配置MTD 205
10.2 MTD分區(qū) 205
10.2.1 使用Redboot分區(qū)表進行
分區(qū) 206
10.2.2 使用內(nèi)核命令行傳遞分區(qū)
信息 210
10.2.3 映射驅(qū)動 211
10.2.4 閃存芯片驅(qū)動 213
10.2.5 與具體板卡相關的初始化 214
10.3 MTD工具 215
10.4 UBI文件系統(tǒng) 219
10.4.1 配置UBIFS 219
10.4.2 構建UBIFS鏡像 220
10.4.3 使用UBIFS作為根文件
系統(tǒng) 222
10.5 小結(jié) 222
第11章 BusyBox 224
11.1 BusyBox簡介 224
11.2 BusyBox的配置 225
11.3 BusyBox的操作 227
11.3.1 BusyBox的init 230
11.3.2 rcS初始化腳本示例 232
11.3.3 BusyBox在目標板上的
安裝 233
11.3.4 BusyBox小應用 235
11.4 小結(jié) 235
第12章 嵌入式開發(fā)環(huán)境 237
12.1 交叉開發(fā)環(huán)境 237
12.2 對主機系統(tǒng)的要求 241
12.3 為目標板提供服務 242
12.3.1 TFTP服務器 242
12.3.2 BOOTP/DHCP 服務器 243
12.3.3 NFS服務器 245
12.3.4 目標板使用NFS掛載根
文件系統(tǒng) 247
12.3.5 U-Boot中使用NFS掛載根
文件系統(tǒng)的例子 248
12.4 小結(jié) 250
第13章 開發(fā)工具 252
13.1 GNU調(diào)試器(GDB) 252
13.1.1 調(diào)試核心轉(zhuǎn)儲 253
13.1.2 執(zhí)行GDB 255
13.1.3 GDB中的調(diào)試會話 257
13.2 數(shù)據(jù)顯示調(diào)試器 258
13.3 cbrowser/cscope 260
13.4 追蹤和性能評測工具 261
13.4.1 strace 261
13.4.2 strace命令行選項 264
13.4.3 ltrace 266
13.4.4 ps 267
13.4.5 top 269
13.4.6 mtrace 270
13.4.7 dmalloc 272
13.4.8 內(nèi)核oops 274
13.5 二進制工具 276
13.5.1 readelf 277
13.5.2 使用readelf查看調(diào)試信息 278
13.5.3 objdump 280
13.5.4 objcopy 281
13.6 其他二進制實用程序 281
13.6.1 strip 281
13.6.2 addr2line 282
13.6.3 strings 282
13.6.4 ldd 282
13.6.5 nm 283
13.6.6 prelink 283
13.7 小結(jié) 284
第14章 內(nèi)核調(diào)試技術 286
14.1 內(nèi)核調(diào)試帶來的挑戰(zhàn) 286
14.2 使用KGDB進行內(nèi)核調(diào)試 287
14.2.1 KGDB的內(nèi)核配置 288
14.2.2 在開啟KGDB時引導
目標板 289
14.2.3 一些有用的內(nèi)核斷點 293
14.2.4 KGDB與控制臺共享一個
串行端口 294
14.2.5 調(diào)試非常早期的內(nèi)核代碼 295
14.2.6 主線內(nèi)核對KGDB的支持 296
14.3 內(nèi)核調(diào)試技術 297
14.3.1 gdb遠程串行協(xié)議 298
14.3.2 調(diào)試優(yōu)化的內(nèi)核代碼 300
14.3.3 GDB的用戶自定義命令 307
14.3.4 有用的內(nèi)核GDB宏 307
14.3.5 調(diào)試可加載模塊 315
14.3.6 printk調(diào)試 319
14.3.7 Magic SysReq key 320
14.4 硬件輔助調(diào)試 321
14.4.1 使用JTAG探測器對閃存
進行編程 322
14.4.2 使用JTAG探測器進行調(diào)
試 323
14.5 不能啟動的情況 326
14.5.1 早期的串行端口調(diào)試輸
出 326
14.5.2 轉(zhuǎn)儲printk的日志緩沖
區(qū) 327
14.5.3 使用KGDB調(diào)試內(nèi)核異常 328
14.6 小結(jié) 329
第15章 調(diào)試嵌入式Linux應用程序 331
15.1 目標調(diào)試 331
15.2 遠程(交叉)調(diào)試 331
15.3 調(diào)試共享程序庫 335
15.4 調(diào)試多個任務 340
15.4.1 調(diào)試多個進程 340
15.4.2 調(diào)試多線程應用程序 342
15.4.3 調(diào)試引導加載程序/閃存
代碼 345
15.5 其他遠程調(diào)試選項 345
15.5.1 使用串行端口進行調(diào)試 345
15.5.2 附著到運行的進程上 346
15.6 小結(jié) 346
第16章 開源構建系統(tǒng) 348
16.1 為什么使用構建系統(tǒng) 348
16.2 Scratchbox 349
16.2.1 安裝Scratchbox 349
16.2.2 創(chuàng)建一個交叉編譯目標 350
16.3 Buildroot 351
16.3.1 安裝Buildroot 352
16.3.2 配置Buildroot 352
16.3.3 構建Buildroot 353
16.4 OpenEmbedded 354
16.4.1 OpenEmbedded的組成 355
16.4.2 BitBake元數(shù)據(jù) 355
16.4.3 配方基礎 356
16.4.4 任務 358
16.4.5 類 359
16.4.6 配置元數(shù)據(jù) 360
16.4.7 構建鏡像 361
16.5 小結(jié) 362
第17章 實時Linux 363
17.1 什么是實時 363
17.1.1 軟實時 363
17.1.2 硬實時 364
17.1.3 Linux調(diào)度 364
17.1.4 延時 364
17.2 內(nèi)核搶占 365
17.2.1 搶占的障礙 366
17.2.2 搶占模式 367
17.2.3 SMP內(nèi)核 368
17.2.4 搶占延時的根源 369
17.3 實時內(nèi)核補丁 369
17.3.1 實時補丁的特性 370
17.3.2 O(1)調(diào)度器 371
17.3.3 創(chuàng)建實時進程 372
17.4 實時內(nèi)核的性能分析 373
17.4.1 使用Ftrace追蹤內(nèi)核行為 373
17.4.2 檢測搶占被關閉的延時 374
17.4.3 檢測喚醒延時 375
17.4.4 檢測中斷被關閉的延時 377
17.4.5 檢測Soft Lockup 378
17.5 小結(jié) 378
第18章 通用串行總線 379
18.1 USB概述 379
18.1.1 USB的物理拓撲結(jié)構 379
18.1.2 USB的邏輯拓撲結(jié)構 381
18.1.3 USB版本 382
18.1.4 USB連接器 382
18.1.5 USB線纜 383
18.1.6 USB模式 384
18.2 配置USB 384
18.3 sysfs和USB設備命名 388
18.4 實用的USB工具 390
18.4.1 USB文件系統(tǒng) 390
18.4.2 使用usbview 392
18.4.3 USB 實用程序(lsusb) 394
18.5 通用USB子系統(tǒng) 395
18.5.1 USB大容量存儲類 395
18.5.2 USB HID類 397
18.5.3 USB CDC類驅(qū)動 398
18.5.4 USB網(wǎng)絡支持 400
18.6 USB調(diào)試 401
18.6.1 usbmon 402
18.6.2 實用USB雜記 403
18.7 小結(jié) 403
第19章 udev 405
19.1 什么是udev 405
19.2 設備發(fā)現(xiàn) 406
19.3 udev的默認行為 407
19.4 理解udev規(guī)則 409
19.4.1 Modalias 411
19.4.2 典型的udev規(guī)則配置 414
19.4.3 udev的初始系統(tǒng)設置 415
19.5 加載平臺設備驅(qū)動程序 417
19.6 定制udev的行為 419
19.7 持久的設備命名 420
19.8 udev和busybox配合使用 423
19.8.1 busybox mdev 423
19.8.2 配置mdev 425
19.9 小結(jié) 425
附錄A 可配置的U-Boot命令 427
附錄B BusyBox命令 430
附錄C SDRAM接口注意事項 440
附錄D 開源資源 447
附錄E 簡單的BDI-2000配置文件 449