嵌入式 Linux 基礎教程, 2/e (Embedded Linux Primer: A Practical Real-World Approach, 2/e)

克裡斯托弗·哈利南(Christopher Hallinan)

買這商品的人也買了...

商品描述

<內容簡介>

  《嵌入式Linux基礎教程(第2版)》是嵌入式Linux的經典教程,介紹了引導加載程序、系統初始化、文件系統、閃存和內核、應用程序調試技巧等,還講述了構建Linux系統的工作原理,用於驅動不同架構的配置,Linux內核源碼樹的特性,如何根據需求配製內核運行時的行為,如何擴展系統功能,用於構建完整嵌入式Linux發行版的常用構建系統,USB子系統和系統配置工具udev等內容。更重要的是,《嵌入式Linux基礎教程(第2版)》闡述瞭如何修改系統使之滿足讀者自身的需求,確保讀者能夠從中學習一些嵌入式工程中非常有用的提示和技巧。
  《嵌入式Linux基礎教程(第2版)》適合Linux程序員閱讀,也可作為高等院校相關專業師生的參考讀物。

<作者簡介>

  Christopher Hallinan,註明嵌入式Linux技術專家。現任Mentor Graphics公司技術市場工程師,曾任MontaVista軟件公司現場應用工程師,3Com公司工程總監,Crosscomm公司工程總監。他有25年以上網絡和通信產品的軟硬件開發經驗。曾擔任Linux諮詢師,提供定製Linux主板接口、設備驅動程序和引導加載程序等方面的解決方案。

<目錄>

第1章入門1
1.1為什麼選擇Linux 1
1.2嵌入式Linux現狀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小結5
第2章綜述6
2.1嵌入與非嵌入6
2.2剖析嵌入式系統7
2.2.1典型的嵌入式Linux開發環境8
2.2.2啟動目標板9
2.2.3引導內核10
2.2.4內核初始化:概述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閃存文件系統17
2.3.5內存空間17
2.3.6執行上下文19
2.3.7進程虛擬內存20
2.3.8交叉開發環境21
2.4嵌入式Linux發行版22
2.4.1商業Linux發行版24
2.4.2打造自己的Linux發行版24
2.5小結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集成處理器:片上系統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小結44
第4章Linux內核:不同的視角46
4.1背景知識46
4.1.1內核版本47
4.1.2內核源碼庫48
4.1.3使用git下載內核代碼49
4.2 Linux內核的構造49
4.2.1頂層源碼目錄49
4.2.2編譯內核50
4.2.3內核主體:vmlinux 52
4.2.4內核鏡像的組成部分53
4.2.5子目錄的佈局56
4.3內核構建系統57
4.3.1 .config文件57
4.3.2配置編輯器58
4.3.3 Makefile目標61
4.4內核配置66
4.4.1定製配置選項68
4.4.2內核Makefile 71
4.5內核文檔72
4 .6獲得定製的Linux內核72
4.7小結73
第5章內核初始化75
5.1合成內核鏡像: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內核入口:head.o 84
5.2.2內核啟動:main.c 85
5.2.3架構設置86
5.3內核命令行的處理87
5.4子系統初始化92
5.5 init線程94
5.5.1通過initcalls進行初始化95
5.5.2 initcall_debug 96
5 .5.3最後的引導步驟97
5.6小結98
第6章用戶空間初始化100
6.1根文件系統100
6.1.1 FHS:文件系統層次結構
標準101
6.1.2文件系統佈局101
6.1.3最小化的文件系統102
6.1.4嵌入式根文件系統帶
來的挑戰103
6.1.5試錯法104
6.1.6自動化文件系統構建工具104
6.2內核的最後一些引導步驟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引導加載程序對initrd的
支持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小結120
第7章引導加載程序122
7.1引導加載程序的作用122
7.2引導加載程序帶來的挑戰123
7.2.1 DRAM控制器123
7.2.2閃存與RAM 123
7.2.3鏡像的複雜性124
7.2.4執行環境126
7 .3通用引導加載程序:Das U-Boot 126
7.3.1獲取U-Boot 127
7.3.2配置U-Boot 127
7.3.3 U-Boot的監控命令129
7.3.4網絡操作130
7.3.5存儲子系統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移植總結141
7.4 .7 U-Boot鏡像格式141
7.5設備樹對象(扁平設備樹) 143
7.5.1設備樹源碼145
7.5.2設備樹編譯器148
7.5.3使用DTB的其他內核鏡像148
7.6其他引導加載程序149
7.6.1 Lilo 149
7.6.2 GRUB 150
7.6.3其他更多的引導加載程序151
7.7小結152
第8章設備驅動程序基礎154
8 .1設備驅動程序的概念154
8.1.1可加載模塊155
8.1.2設備驅動程序架構155
8.1.3最小設備驅動程序示例156
8.1.4模塊構建的基礎設施157
8 .1.5安裝設備驅動程序160
8.1.6加載模塊160
8.1.7模塊參數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驅動程序方法166
8.3.1驅動程序中的文件系統
操作166
8.3.2設備號的分配169
8.3.3設備節點和mknod 169
8.4綜合應用170
8.5在內核源碼樹外構建驅動171
8.6設備驅動程序和GPL 172
8.7小結173
第9章文件系統174
9.1 Linux文件系統概念175
9.2 ext2 176
9.2.1掛載文件系統177
9.2.2檢查文件系統的完整性178
9.3 ext3 180
9.4 ext4 182
9.5 ReiserFS 182
9.6 JFFS2 183
9.7 cramfs 185
9.8網絡文件系統187
9.9偽文件系統190
9.9.1 /proc文件系統191
9.9.2 sysfs 194
9.10其他文件系統196
9. 11創建簡單的文件系統197
9.12小結199
第10章MTD子系統201
10.1 MTD概述201
10.1.1開啟MTD服務202
10.1.2 MTD基礎203
10.1.3在目標板上配置MTD 205
10.2 MTD分區205
10.2.1使用Redboot分區表進行
分區206
10.2.2使用內核命令行傳遞分區
信息210
10.2.3映射驅動211
10.2.4閃存芯片驅動213
10.2.5與具體闆卡相關的初始化214
10.3 MTD工具215
10.4 UBI文件系統219
10.4.1配置UBIFS 219
10.4.2構建UBIFS鏡像220
10.4.3使用UBIFS作為根文件
系統222
10.5小結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小結235
第12章嵌入式開發環境237
12.1交叉開發環境237
12. 2對主機系統的要求241
12.3為目標板提供服務242
12.3.1 TFTP服務器242
12.3.2 BOOTP/DHCP服務器243
12.3.3 NFS服務器245
12.3.4目標板使用NFS掛載根
文件系統247
12.3.5 U-Boot中使用NFS掛載根
文件系統的例子248
12.4小結250
第13章開發工具252
13.1 GNU調試器(GDB) 252
13.1 .1調試核心轉儲253
13.1.2執行GDB 255
13.1.3 GDB中的調試會話257
13.2數據顯示調試器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內核oops 274
13.5二進制工具276
13.5.1 readelf 277
13.5.2使用readelf查看調試信息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小結284
第14章內核調試技術286
14.1內核調試帶來的挑戰286
14.2使用KGDB進行內核調試287
14.2.1 KGDB的內核配置288
14.2.2在開啟KGDB時引導
目標板289
14.2.3一些有用的內核斷點293
14.2.4 KGDB與控制台共享一個
串行埠294
14.2.5調試非常早期的內核代碼295
14.2.6主線內核對KGDB的支持296
14.3內核調試技術297
14.3.1 gdb遠程串行協議298
14.3.2調試優化的內核代碼300
14.3.3 GDB的用戶自定義命令307
14.3.4有用的內核GDB宏307
14.3.5調試可加載模塊315
14.3.6 printk調試319
14.3.7 Magic SysReq key 320
14.4硬件輔助調試321
14.4.1使用JTAG探測器對閃存
進行編程322
14.4.2使用JTAG探測器進行調
試323
14.5不能啟動的情況326
14.5.1早期的串行埠調試輸
出326
14.5.2轉儲printk的日誌緩衝
區327
14.5.3使用KGDB調試內核異常328
14.6小結329
第15章調試嵌入式Linux應用程序331
15.1目標調試331
15.2遠程(交叉)調試331
15.3調試共享程序庫335
15.4調試多個任務340
15.4.1調試多個進程340
15.4.2調試多線程應用程序342
15.4.3調試引導加載程序/閃存
代碼345
15.5其他遠程調試選項345
15.5.1使用串行埠進行調試345
15.5.2附著到運行的進程上346
15.6小結346
第16章開源構建系統348
16.1為什麼使用構建系統348
16.2 Scratchbox 349
16 .2.1安裝Scratchbox 349
16.2.2創建一個交叉編譯目標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元數據355
16.4.3配方基礎356
16.4.4任務358
16.4.5類359
16.4.6配置元數據360
16.4.7構建鏡像361
16.5小結362
第17章實時Linux 363
17.1什麼是實時363
17.1.1軟實時363
17.1.2硬實時364
17.1.3 Linux調度364
17.1.4延時364
17.2內核搶占365
17.2.1搶占的障礙366
17.2.2搶占模式367
17.2.3 SMP內核368
17.2.4搶占延時的根源369
17.3實時內核補丁369
17.3.1實時補丁的特性370
17.3.2 O(1)調度器371
17.3.3創建實時進程372
17.4實時內核的性能分析373
17. 4.1使用Ftrace追蹤內核行為373
17.4.2檢測搶占被關閉的延時374
17.4.3檢測喚醒延時375
17.4.4檢測中斷被關閉的延時377
17.4.5檢測Soft Lockup 378
17.5小結378
第18章通用串行總線379
18.1 USB概述379
18.1.1 USB的物理拓撲結構379
18.1.2 USB的邏輯拓撲結構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文件系統390
18.4.2使用usbview 392
18.4.3 USB實用程序(lsusb) 394
18.5通用USB子系統395
18.5.1 USB大容量存儲類395
18.5.2 USB HID類397
18.5.3 USB CDC類驅動398
18.5.4 USB網絡支持400
18.6 USB調試401
18.6.1 usbmon 402
18.6.2實用USB雜記403
18.7小結403
第19章udev 405
19.1什麼是udev 405
19.2設備發現406
19.3 udev的默認行為407
19.4理解udev規則409
19.4.1 Modalias 411
19.4.2典型的udev規則配置414
19.4.3 udev的初始系統設置415
19.5加載平臺設備驅動程序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小結425
附錄A可配置的U-Boot命令427
附錄B BusyBox命令430
附錄C SDRAM接口註意事項440
附錄D開源資源447
附錄E簡單的BDI-2000配置文件449