內容簡介
嵌入式系統是目前最流行的計算機套用技術之一。本書由淺入深地講解基於arm體系結構的嵌入式linux系統開發,內容包括嵌入式系統的基本概念、套用領域等基礎知識;arm處理器的體系結構和功能特點;linux系統核心結構和移植方法、bootloader功能和移植;linux應用程式開發,包括如何操作檔案、管理記憶體、訪問串口、多執行緒和多進程技術,並且剖析了應用程式的結構和工作流程;linux系統設備驅動程式開發,包括如何編寫核心模組、驅動程式分類和功能特點,並且給出了網路設備驅動、flash設備驅動和usb設備驅動的實例分析。
本書附帶1張dvd光碟,內容為專門為本書錄製的9小時視頻、本書涉及的原始碼、ubuntu安裝光碟的鏡像檔案和另外贈送的35小時linux專題學習視頻。
作者簡介
弓雷 在電信行業從事嵌入式系統軟體開發5年。致力於計算機作業系統核心及底層技術的研究。技術涉獵廣泛,擅長計算機通信技術。熟悉Intel IXA架構網路處理器、ARM體系結構、MIPS體系結構、TCP/IP網路協定棧。曾經移植過Linux 2.6核心到嵌入式設備。曾經參與研發某部隊火控武器通信系統、無人駕駛汽車項目通信系統及10GE/POS骨幹網流量管理系統。目前擔任嵌入式軟體研發工程師和微碼軟體研發工程師,從事某公司骨幹網P2P流量管理設備的研發。
目錄
第1篇Linux嵌入式開發基礎篇
第1章嵌入式系統入門 2
1.1什麼是嵌入式系統 2
1.2嵌入式系統套用領域 2
1.2.1家用電器 2
1.2.2交通工具 3
1.2.3公共電子設施 3
1.3嵌入式系統發展 4
1.3.1嵌入式微控制器 4
1.3.2嵌入式微處理器 5
1.3.3未來嵌入式系統發展的方向 6
1.4典型的嵌入式系統組成 6
1.5小結 7
第2章嵌入式軟硬體系統 8
2.1電路基本知識 8
2.1.1什麼是模擬電路 8
2.1.2什麼是數字電路 8
2.1.3數制轉換 9
2.2計算機組成原理 10
2.2.1計算機體系的發展 10
2.2.2中央處理器 10
2.2.3存儲系統 11
2.2.4匯流排系統 12
2.2.5輸入輸出系統 12
2.3軟體基礎知識 12
2.3.1什麼是軟體 13
2.3.2軟體開發流程 13
2.3.3常見的軟體開發模型 14
2.3.4計算機程式語言 14
2.3.5數據結構 15
2.4作業系統知識 15
2.4.1什麼是作業系統 16
2.4.2作業系統的發展歷史 16
2.4.3作業系統由什麼組成 16
2.4.4幾種作業系統的設計思路 17
2.4.5作業系統分類 17
2.5小結 18
第3章ARM處理器 19
3.1微處理器和微控制器 19
3.2ARM處理器介紹 19
3.2.1ARM微處理器的套用領域 20
3.2.2ARM的功能特點 20
3.3ARM指令集 21
3.3.1算術運算指令 21
3.3.2邏輯運算指令 22
3.3.3分支指令 23
3.3.4數據傳送指令 23
3.4ARM的結構 24
3.4.1ARM體系結構的命名方法 24
3.4.2處理器系列劃分 25
3.4.3處理器工作模式 25
3.4.4存儲系統 26
3.4.5定址方式 27
3.5ARM的功能選型 29
3.5.1ARM的選型原則 29
3.5.2幾種常見的ARM核處理器選型參考 32
3.6小結 32
第4章嵌入式Linux 33
4.1常見的嵌入式作業系統 33
4.1.1VxWorks 33
4.1.2WindowsCE 34
4.1.3PalmOS 34
4.1.4Symbian 34
4.2嵌入式Linux作業系統 34
4.2.1什麼是Linux 35
4.2.2Linux與UNIX的不同——GPL著作權協定介紹 35
4.2.3Linux發行版 36
4.2.4常見的嵌入式Linux系統 37
4.3小結 37
第5章建立軟體開發環境 38
5.1獨立的Linux系統 38
5.1.1安裝UbuntuLinux 38
5.1.2關鍵一步——系統的網路設定 46
5.1.3其他必要的設定 46
5.1.4怎樣安裝卸載軟體 48
5.1.5怎樣配置系統服務 48
5.1.6安裝主要的開發工具 48
5.1.7安裝其他的開發工具和文檔 49
5.2運行在Windows上的Linux系統 50
5.2.1什麼是Cygwin 50
5.2.2如何安裝Cygwin 50
5.2.3安裝開發環境 54
5.3Linux常用工具 54
5.3.1Linuxshell和常用命令 55
5.3.2文本編輯工具vi 56
5.3.3搜尋工具find和grep 57
5.3.4FTP工具 61
5.3.5串口工具minicom 63
5.4Windows常用工具 65
5.4.1代碼編輯管理工具SourceInsight 65
5.4.2串口工具XShell 71
5.5ARM集成開發環境ADS 72
5.5.1ADS集成開發環境介紹 73
5.5.2配置ADS調試環境 73
5.5.3建立自己的工程 75
5.6小結 78
第6章第一個Linux應用程式 79
6.1向世界問好--Hello,World! 79
6.1.1用vi編輯原始碼檔案 79
6.1.2用gcc編譯程式 80
6.1.3執行程式 80
6.2程式背後做了什麼 80
6.2.1程式執行的過程 81
6.2.2窺視程式執行中的秘密 82
6.2.3動態庫的作用 83
6.3程式如何來的--編譯的全部過程 84
6.3.1編譯原始碼 84
6.3.2連線目標檔案到指定的庫 85
6.4更簡單的辦法--用Makefile管理工程 86
6.4.1什麼是Makefile 87
6.4.2它是如何工作的 87
6.4.3如何使用Makefile 87
6.4.4好的原始碼管理習慣 88
6.5小結 88
第2篇Linux嵌入式開發套用篇
第7章Linux應用程式編程基礎 90
7.1記憶體管理和使用 90
7.1.1堆和棧的區別 90
7.1.2記憶體管理函式malloc()和free() 93
7.1.3實用的記憶體分配函式calloc()和realloc() 93
7.1.4記憶體管理編程實例 94
7.2ANSIC檔案管理 97
7.2.1檔案指針和流 97
7.2.2存儲方式 98
7.2.3標準輸入、標準輸出和標準錯誤 98
7.2.4緩衝 98
7.2.5打開關閉檔案 99
7.2.6讀寫檔案 100
7.2.7檔案流定位 103
7.2.8ANSIC檔案編程實例 103
7.3POSIX檔案I/O編程 104
7.3.1底層的檔案I/O操作 104
7.3.2檔案描述符 104
7.3.3創建/打開/關閉檔案 105
7.3.4讀寫檔案內容 108
7.3.5檔案內容定位 109
7.3.6修改已打開檔案的屬性 110
7.3.7POSIX檔案編程實例 110
7.4小結 112
第8章開發多進程/執行緒程式 113
8.1多進程開發 113
8.1.1什麼是進程 113
8.1.2進程環境和屬性 114
8.1.3創建進程 115
8.1.4等待進程結束 117
8.1.5退出進程 118
8.1.6常用進程間通信的方法 120
8.1.7進程編程實例 124
8.2多執行緒開發 125
8.2.1執行緒的概念 126
8.2.2進程和執行緒對比 126
8.2.3創建執行緒 127
8.2.4取消執行緒 128
8.2.5等待執行緒 129
8.2.6使用pthread庫執行緒操作實例 129
8.3小結 131
第9章網路通信套用 132
9.1網路通信基礎 132
9.1.1TCP/IP協定族 132
9.1.2IP協定 133
9.1.3TCP協定 135
9.1.4UDP協定 135
9.1.5學習分析協定的方法 135
9.2Socket通信基本概念 137
9.2.1創建socket對象 138
9.2.2面向連線的Socket通信實現 138
9.2.3面向連線的Echo服務編程實例 140
9.2.4無連線的Socket通信實現 144
9.2.5無連線的時間服務編程實例 145
9.3Socket高級套用 148
9.3.1Socket逾時處理 148
9.3.2使用Select機制處理多連線 149
9.3.3使用Poll機制處理多連線 151
9.3.4多執行緒環境Socket編程 152
9.4小結 152
第10章串列口通信編程 154
10.1串口介紹 154
10.1.1什麼是串口 154
10.1.2串口工作原理 154
10.1.3串口流量控制 155
10.2開發串口應用程式 156
10.2.1操作串口需要用到的頭檔案 156
10.2.2串口操作方法 157
10.2.3串口屬性設定 157
10.2.4與Windows串口終端通信 161
10.3串口套用實例--手機簡訊傳送 163
10.3.1PC與手機連線傳送簡訊的物理結構 164
10.3.2AT指令介紹 164
10.3.3GSMAT指令集 165
10.3.4PDU編碼方式 165
10.3.5建立與手機的連線 167
10.3.6使用AT指令傳送簡訊 167
10.4小結 171
第11章嵌入式GUI程式開發 172
11.1LinuxGUI介紹 172
11.1.1LinuxGUI的發展 172
11.1.2常見的嵌入式GUI 173
11.2開發圖形界面程式 174
11.2.1安裝Qt開發環境 174
11.2.2建立簡單的Qt程式 176
11.2.3Qt庫編程結構 178
11.3深入Qt編程 179
11.3.1使用Widget 179
11.3.2對話框程式設計 181
11.3.3信號與槽系統 185
11.4移植Qtopia到ARM開發板 186
11.4.1需要的資源 186
11.4.2準備工作 187
11.4.3編譯主機Qt工具 187
11.4.4交叉編譯qtopia 189
11.5小結 190
第12章軟體項目管理 191
12.1原始碼管理 191
12.1.1什麼是軟體的版本 191
12.1.2版本控制的概念 192
12.2版本控制系統Subversion 193
12.2.1在Linux系統下使用Subversion服務端 193
12.2.2在Windows系統下使用TortoiseSVN客戶端 195
12.3開發文檔管理--常見的開發文檔 199
12.3.1可行性研究報告 200
12.3.2項目開發計畫 200
12.3.3軟體需求說明書 200
12.3.4概要設計 200
12.3.5詳細設計 200
12.3.6用戶手冊 201
12.3.7其他文檔 201
12.4使用trac管理軟體開發文檔 201
12.4.1安裝trac 201
12.4.2配置trac基本設定 202
12.4.3配置trac全局腳本 204
12.4.4設定trac的Web界面 205
12.5Bug跟蹤系統 208
12.5.1Bug管理的概念和作用 208
12.5.2使用Bugzilla跟蹤Bug 208
12.6小結 211
第3篇Liux系統篇
第13章ARM體系結構及開發實例 214
13.1ARM體系結構介紹 214
13.1.1ARM體系結構 214
13.1.2ARM指令集介紹 215
13.2編程模型 216
13.2.1數據類型 216
13.2.2處理器模式 216
13.2.3暫存器 217
13.2.4通用暫存器 217
13.2.5程式狀態暫存器 219
13.2.6異常處理 219
13.2.7記憶體和記憶體I/O映射 220
13.3記憶體管理單元 221
13.3.1記憶體管理介紹 221
13.3.2記憶體訪問順序 222
13.3.3地址翻譯過程 222
13.3.4訪問許可權 223
13.4常見接口和控制器 223
13.4.1GPIO接口 223
13.4.2中斷控制器 224
13.4.3RTC控制器 224
13.4.4看門狗定時器 225
13.4.5試驗:使用GPIO點亮LED 226
13.5小結 227
第14章深入Bootloader 228
14.1初識Bootloader 228
14.1.1PC(個人電腦)上的Bootloader 228
14.1.2什麼是嵌入式系統的Bootloader 229
14.1.3嵌入式系統常見的Bootloader 229
14.2U-Boot分析 230
14.2.1獲取U-Boot 230
14.2.2U-Boot工程結構分析 230
14.2.3U-Boot總體工作流程 232
14.3U-Boot啟動流程分析 233
14.3.1_start標號 233
14.3.2reset標號 235
14.3.3cpu_init_crit標號 237
14.3.4lowlevel_init標號 238
14.3.5relocate標號 239
14.3.6start_armboot()函式 240
14.3.7main_loop()函式 244
14.4移植U-Boot到開發板 248
14.4.1U-Boot移植的一般步驟 248
14.4.2移植U-Boot到目標開發板 249
14.4.3移植U-Boot的常見問題 250
14.5小結 251
第15章解析Linux核心 252
15.1基本知識 252
15.1.1什麼是Linux核心 252
15.1.2Linux核心版本 253
15.1.3如何獲取Linux核心代碼 253
15.1.4編譯核心 253
15.2Linux核心的子系統 260
15.2.1系統調用接口 260
15.2.2進程管理子系統 261
15.2.3記憶體管理子系統 262
15.2.4虛擬檔案系統 263
15.2.5網路堆疊 264
15.2.6設備驅動 265
15.2.7依賴體系結構的代碼 266
15.3Linux核心代碼的工程結構 266
15.3.1原始碼目錄布局 266
15.3.2幾個重要的Linux核心檔案 267
15.4核心編譯系統 268
15.4.1核心編譯系統基本架構 269
15.4.2核心頂層Makefile分析 269
15.4.3核心編譯檔案分析 274
15.4.4目標檔案清除機制 278
15.4.5編譯輔助程式 279
15.4.6KBuild變數 281
15.5小結 282
第16章嵌入式Linux啟動流程 283
16.1Linux核心初始化流程 283
16.2PC的初始化流程 284
16.2.1PCBIOS功能和作用 284
16.2.2硬碟的數據結構 285
16.2.3完整的初始化流程 286
16.3嵌入式系統的初始化 286
16.4Linux核心初始化 287
16.4.1解壓縮核心映像 287
16.4.2進入核心代碼 289
16.5啟動init核心進程 291
16.6根檔案系統初始化 292
16.6.1根檔案系統介紹 292
16.6.2掛載虛擬檔案系統 294
16.7核心交出許可權 300
16.8init進程 300
16.9初始化RAMDisk 301
16.9.1RAMDisk介紹 301
16.9.2如何使用RAMDisk 302
16.9.3實例:使用RAMDisk作為根檔案系統 302
16.10小結 303
第17章Linux檔案系統 304
17.1Linux檔案管理 304
17.1.1檔案和目錄的概念 304
17.1.2檔案的結構 305
17.1.3檔案的類型 305
17.1.4檔案系統的目錄結構 307
17.1.5檔案和目錄的存取許可權 308
17.1.6檔案系統管理 310
17.2Linux檔案系統原理 311
17.2.1非日誌檔案系統 311
17.2.2日誌檔案系統 311
17.3常見的Linux檔案系統 312
17.3.1ext2檔案系統 312
17.3.2ext3檔案系統 315
17.3.3ReiserFS檔案系統 315
17.3.4JFFS檔案系統 316
17.3.5cramfs檔案系統 318
17.4其他檔案系統 319
17.4.1網路檔案系統 319
17.4.2/proc影子檔案系統 320
17.5小結 323
第18章建立交叉編譯工具鏈 324
18.1什麼是交叉編譯 324
18.2需要哪些東西 325
18.3手工創建工具鏈 325
18.3.1準備工作——獲取原始碼 326
18.3.2開始了——建立工作環境 326
18.3.3建立Linux核心頭檔案 327
18.3.4編譯安裝binutils 330
18.3.5編譯安裝gcc的C編譯器 331
18.3.6編譯安裝glibc庫 332
18.3.7編譯安裝gcc的C、C++編譯器 333
18.3.8最後的工作 334
18.4使用腳本創建工具鏈 334
18.5更簡便的方法--獲取已編譯好的交叉編譯環境 336
18.6小結 336
第19章強大的命令系統BusyBox 337
19.1BusyBox簡介 337
19.1.1簡單易懂的BusyBox 337
19.1.2BusyBox工作原理 338
19.1.3安裝BusyBox 339
19.2交叉編譯BusyBox 341
19.3使用BusyBox 343
19.3.1BusyBox初始化 344
19.3.2目標板BusyBox安裝 346
19.4小結 348
第20章Linux核心移植 349
20.1Linux核心移植要點 349
20.2平台相關代碼結構 350
20.3建立目標平台工程框架 351
20.3.1加入編譯選單項 352
20.3.2設定宏與代碼檔案的對應關係 352
20.3.3測試工程框架 353
20.4建立目標平台代碼框架 354
20.4.1ARM處理器相關結構 354
20.4.2建立machine_desc結構 356
20.4.3加入處理函式 356
20.4.4加入定時器結構 357
20.4.5測試代碼結構 357
20.5構建目標板代碼 357
20.5.1處理器初始化 358
20.5.2連線埠映射 360
20.5.3中斷處理 361
20.5.4定時器處理 361
20.5.5編譯最終代碼 361
20.6小結 362
第21章核心和應用程式調試技術 363
21.1使用GDB調試應用程式概述 363
21.2基本的調試技術 363
21.2.1列出原始碼 366
21.2.2斷點管理 368
21.2.3執行程式 370
21.2.4顯示程式變數 370
21.2.5信號管理 371
21.2.6調試實例 371
21.3多進程調試 372
21.4調試意外終止的程式 374
21.5核心調試技術 376
21.5.1printk列印調試信息 376
21.5.2使用/proc虛擬檔案系統 377
21.5.3使用KDB調試工具 379
21.5.4KDB調試指令 382
21.6小結 384
第4篇Linux嵌入式驅動開發篇
第22章Linux設備驅動 386
22.1設備驅動介紹 386
22.2Linux核心模組 386
22.2.1核心模組簡介 387
22.2.2核心模組的結構 387
22.2.3核心模組的載入和卸載 388
22.2.4編寫一個基本的核心模組 389
22.2.5編譯核心模組 390
22.2.6為核心模組添加參數 391
22.3Linux設備驅動 392
22.3.1PCI局部匯流排介紹 392
22.3.2Linux設備驅動基本概念 393
22.3.3字元設備 394
22.3.4塊設備 396
22.3.5網路設備 396
22.4字元設備驅動開發實例 396
22.4.1開發一個基本的字元設備驅動 397
22.4.2測試字元設備驅動 399
22.5小結 400
第23章網路設備驅動程式 401
23.1網路基礎知識 401
23.1.1ISO/OSI網路參考模型 401
23.1.2TCP/IP協定 402
23.2乙太網基礎 404
23.2.1工作原理 405
23.2.2常見乙太網標準 405
23.2.3拓撲結構 406
23.2.4工作模式 406
23.3網卡工作原理 407
23.4核心網路分層結構 408
23.4.1核心網路結構 408
23.4.2與網路有關的數據結構 409
23.4.3核心網路部分的全局變數 410
23.5核心網路設備驅動框架 411
23.5.1net_device結構 411
23.5.2數據包接收流程 413
23.5.3數據包傳送流程 415
23.6實例:DM9000網卡驅動分析 416
23.6.1DM9000晶片介紹 416
23.6.2網卡驅動程式框架 416
23.6.3DM9000網卡驅動主要數據結構 417
23.6.4載入驅動程式 418
23.6.5停止和啟動網卡 423
23.6.6傳送數據包 425
23.6.7接收數據包 427
23.6.8中斷和定時器處理 429
23.7小結 431
第24章Flash設備驅動 432
24.1LinuxFlash驅動結構 432
24.1.1什麼是MTD 432
24.1.2MTD系統結構 433
24.2Flash設備基礎 434
24.2.1存儲原理 434
24.2.2性能比較 435
24.3核心MTD層 436
24.3.1mtd_info結構 436
24.3.2mtd_part結構 439
24.3.3mtd_partition結構 440
24.3.4map_info結構 440
24.3.5nand_chip結構 442
24.4Flash設備框架 443
24.4.1NORFlash設備驅動框架 443
24.4.2NANDFlash設備驅動框架 444
24.5Flash設備驅動實例--NORFlash設備驅動剖析 445
24.5.1數據結構 446
24.5.2驅動初始化 446
24.5.3驅動卸載 447
24.6Flash設備驅動實例--NANDFlash設備驅動分析 448
24.6.1S3C2440NAND控制器介紹 448
24.6.2數據結構 450
24.6.3驅動初始化 450
24.6.4驅動卸載 454
24.6.5初始化NAND控制器 455
24.6.6設定晶片操作 456
24.6.7電源管理 458
24.7小結 459
第25章USB驅動開發 460
25.1USB體系介紹 460
25.1.1USB設計目標 460
25.1.2USB體系概述 461
25.1.3USB體系工作流程 462
25.2USB驅動程式框架 462
25.2.1Linux核心USB驅動框架 462
25.2.2主機驅動結構 465
25.2.3設備驅動結構 468
25.2.4USB驅動程式框架 470
25.3USB驅動實例剖析 473
25.3.1USB串口驅動 473
25.3.2USB鍵盤驅動 475
25.4小結 478