本書涵蓋了操作系統(tǒng)的基本概念和原則,展示了如何將它們應(yīng)用于設(shè)計和實(shí)現(xiàn)完整的嵌入式與實(shí)時操作系統(tǒng)。包括ARM架構(gòu)、ARM指令和編程、用于開發(fā)程序的工具鏈、用于軟件實(shí)現(xiàn)和測試的虛擬機(jī)、程序執(zhí)行映像、函數(shù)調(diào)用約定、運(yùn)行時堆棧使用以及用匯編代碼鏈接C程序的所有基礎(chǔ)和背景信息。
出版者的話
譯者序
前言
關(guān)于作者
第1章 引言 1
1.1 關(guān)于本書 1
1.2 本書的動機(jī) 1
1.3 本書的目標(biāo)讀者 1
1.4 本書的獨(dú)特之處 2
1.5 本書的內(nèi)容 3
1.6 本書可作為嵌入式系統(tǒng)的教科書 5
1.7 本書可作為操作系統(tǒng)的教科書 5
1.8 本書可用于自學(xué) 5
參考文獻(xiàn) 6
第2章 ARM體系結(jié)構(gòu)和程序設(shè)計 7
2.1 ARM處理器模式 7
2.2 ARM CPU寄存器 8
2.2.1 通用寄存器 8
2.2.2 狀態(tài)寄存器 8
2.2.3 ARM處理器模式的變更 9
2.3 指令流水線 10
2.4 ARM指令 10
2.4.1 條件標(biāo)志和條件 10
2.4.2 分支指令 11
2.4.3 算術(shù)運(yùn)算 11
2.4.4 比較運(yùn)算 11
2.4.5 邏輯運(yùn)算 12
2.4.6 數(shù)據(jù)移動操作 12
2.4.7 即時值和桶移位器 12
2.4.8 乘法指令 13
2.4.9 加載和存儲指令 13
2.4.10 基址寄存器 13
2.4.11 塊數(shù)據(jù)傳輸 13
2.4.12 堆棧操作 13
2.4.13 堆棧和子例程 14
2.4.14 軟中斷 14
2.4.15 PSR轉(zhuǎn)移指令 14
2.4.16 協(xié)處理器指令 14
2.5 ARM工具鏈 15
2.6 ARM系統(tǒng)模擬器 15
2.7 ARM程序設(shè)計 16
2.7.1 ARM匯編編程示例1 16
2.7.2 ARM匯編編程示例2 18
2.7.3 匯編和C語言的結(jié)合編程 19
2.8 設(shè)備驅(qū)動程序 25
2.8.1 系統(tǒng)內(nèi)存映射 26
2.8.2 GPIO編程 26
2.8.3 串行I/O的UART驅(qū)動程序 27
2.8.4 彩色LCD驅(qū)動程序 31
2.9 本章小結(jié) 44
思考題 44
參考文獻(xiàn) 45
第3章 中斷和異常處理 46
3.1 ARM異常 46
3.1.1 ARM處理器模式 46
3.1.2 ARM異常類型 47
3.1.3 異常向量表 48
3.1.4 異常處理程序 48
3.1.5 從異常處理程序返回 49
3.2 中斷 50
3.2.1 中斷類型 50
3.2.2 中斷控制器 50
3.2.3 主中斷控制器和輔中斷控制器 51
3.3 中斷處理 52
3.3.1 向量表內(nèi)容 52
3.3.2 硬件中斷序列 52
3.3.3 軟件中的中斷控制 53
3.3.4 中斷處理程序 54
3.3.5 非嵌套中斷處理程序 54
3.4 計時器驅(qū)動程序 55
3.4.1 ARM Versatile 926EJS計時器 55
3.4.2 計時器驅(qū)動程序?qū)崿F(xiàn) 55
3.5 鍵盤驅(qū)動程序 60
3.5.1 ARM PL050鼠標(biāo)-鍵盤接口 60
3.5.2 鍵盤驅(qū)動程序原理 60
3.5.3 中斷驅(qū)動的驅(qū)動程序設(shè)計 60
3.5.4 鍵盤驅(qū)動程序?qū)崿F(xiàn) 61
3.6 UART驅(qū)動程序 66
3.6.1 ARM PL011 UART接口 66
3.6.2 UART寄存器 66
3.6.3 中斷驅(qū)動的UART驅(qū)動程序 67
3.7 安全數(shù)字卡 72
3.7.1 SD卡協(xié)議 72
3.7.2 SDC驅(qū)動程序 72
3.7.3 改進(jìn)的SDC驅(qū)動程序 79
3.7.4 多扇區(qū)數(shù)據(jù)傳輸 80
3.8 向量中斷 83
3.8.1 ARM PL190向量中斷控制器 83
3.8.2 為向量中斷配置VIC 83
3.8.3 向量中斷處理程序 84
3.8.4 向量中斷的演示 84
3.9 嵌套中斷 86
3.9.1 為何需要嵌套中斷 86
3.9.2 ARM中的嵌套中斷 86
3.9.3 在SYS模式下處理嵌套中斷 87
3.9.4 嵌套中斷的演示 87
3.10 嵌套中斷和進(jìn)程切換 90
3.11 本章小結(jié) 90
思考題 91
參考文獻(xiàn) 92
第4章 嵌入式系統(tǒng)的模型 93
4.1 嵌入式系統(tǒng)的程序結(jié)構(gòu) 93
4.2 超級循環(huán)模型 93
4.3 事件驅(qū)動模型 95
4.3.1 超級循環(huán)程序的缺點(diǎn) 95
4.3.2 事件 95
4.3.3 周期性事件驅(qū)動程序 95
4.3.4 異步事件驅(qū)動程序 99
4.4 事件的優(yōu)先級 100
4.5 進(jìn)程模型 101
4.5.1 單處理器進(jìn)程模型 101
4.5.2 多處理器進(jìn)程模型 101
4.5.3 實(shí)地址空間進(jìn)程模型 101
4.5.4 虛擬地址空間進(jìn)程模型 101
4.5.5 靜態(tài)進(jìn)程模型 101
4.5.6 動態(tài)進(jìn)程模型 101
4.5.7 非搶占式進(jìn)程模型 102
4.5.8 搶占式進(jìn)程模型 102
4.6 單處理器內(nèi)核模型 102
4.7 單處理器操作系統(tǒng)模型 102
4.8 多處理器系統(tǒng)模型 102
4.9 實(shí)時系統(tǒng)模型 102
4.10 嵌入式系統(tǒng)軟件設(shè)計方法論 102
4.10.1 高級語言支持事件驅(qū)動編程 103
4.10.2 狀態(tài)機(jī)模型 103
4.10.3 StateChart模型 107
4.11 本章小結(jié) 107
思考題 107
參考文獻(xiàn) 108
第5章 嵌入式系統(tǒng)中的進(jìn)程管理 109
5.1 多任務(wù) 109
5.2 進(jìn)程的概念 109
5.3 多任務(wù)和上下文切換 109
5.3.1 一個簡單的多任務(wù)程序 109
5.3.2 上下文切換 111
5.3.3 多任務(wù)處理的演示 116
5.4 動態(tài)進(jìn)程 117
5.4.1 動態(tài)進(jìn)程的創(chuàng)建 117
5.4.2 動態(tài)進(jìn)程的演示 119
5.5 進(jìn)程調(diào)度 120
5.5.1 進(jìn)程調(diào)度術(shù)語 120
5.5.2 進(jìn)程調(diào)度的目標(biāo)、策略和算法 120
5.5.3 嵌入式系統(tǒng)中的進(jìn)程調(diào)度 121
5.6 進(jìn)程同步 121
5.6.1 睡眠和喚醒 121
5.6.2 使用睡眠/喚醒的設(shè)備驅(qū)動程序 122
5.6.3 使用睡眠/喚醒的事件驅(qū)動嵌入式系統(tǒng) 125
5.6.4 使用睡眠/喚醒的資源管理 127
5.7 信號量 128
5.8 信號量的應(yīng)用 129
5.8.1 信號量鎖 129
5.8.2 互斥鎖 130
5.8.3 使用信號量的資源管理 130
5.8.4 等待中斷和消息 130
5.8.5 進(jìn)程協(xié)作 130
5.8.6 信號量的優(yōu)勢 132
5.8.7 使用信號量的注意事項 132
5.8.8 在嵌入式系統(tǒng)中使用信號量 132
5.9 其他同步機(jī)制 134
5.9.1 OpenVMS中的事件標(biāo)志 134
5.9.2 MVS中的事件變量 135
5.9.3 MVS中的ENQ/DEQ 136
5.10 高級同步的構(gòu)造 136
5.10.1 條件變量 136
5.10.2 管程 136
5.11 進(jìn)程通信 137
5.11.1 共享內(nèi)存 137
5.11.2 管道 137
5.11.3 信號 141
5.11.4 消息傳遞 142
5.12 單處理器嵌入式系統(tǒng)的內(nèi)核 147
5.12.1 非搶占式UP內(nèi)核 147
5.12.2 非搶占式UP內(nèi)核的演示 154
5.12.3 搶占式UP內(nèi)核 154
5.12.4 搶占式UP內(nèi)核的演示 159
5.13 本章小結(jié) 160
思考題 161
參考文獻(xiàn) 162
第6章 ARM中的內(nèi)存管理 163
6.1 進(jìn)程地址空間 163
6.2 ARM中的內(nèi)存管理單元 163
6.3 MMU寄存器 164
6.4 訪問MMU寄存器 165
6.4.1 啟用和禁用MMU 165
6.4.2 域訪問控制 166
6.4.3 轉(zhuǎn)換表基址寄存器 166
6.4.4 域訪問控制寄存器 167
6.4.5 故障狀態(tài)寄存器 167
6.4.6 故障地址寄存器 168
6.5 虛擬地址轉(zhuǎn)換 168
6.5.1 轉(zhuǎn)換表基址 168
6.5.2 轉(zhuǎn)換表 168
6.5.3 一級描述符 169
6.6 段引用的轉(zhuǎn)換 169
6.7 頁引用的轉(zhuǎn)換 170
6.7.1 一級頁表 170
6.7.2 二級頁表描述符 170
6.7.3 小頁引用的轉(zhuǎn)換 171
6.7.4 大頁引用的轉(zhuǎn)換 171
6.8 內(nèi)存管理示例程序 171
6.8.1 使用1MB的段進(jìn)行一級分頁 172
6.8.2 使用4KB的頁進(jìn)行二級分頁 177
6.8.3 具有高VA空間的一級分頁 177
6.8.4 具有高VA空間的二級分頁 182
6.9 本章小結(jié) 184
思考題 184
參考文獻(xiàn) 184
第7章 用戶模式進(jìn)程和系統(tǒng)調(diào)用 185
7.1 簡介 185
7.2 虛擬地址空間映射 185
7.3 用戶模式進(jìn)程 186
7.4 系統(tǒng)內(nèi)核支持用戶模式進(jìn)程 189
7.4.1 PROC結(jié)構(gòu) 189
7.4.2 復(fù)位處理程序 193
7.4.3 內(nèi)核代碼 195
7.4.4 內(nèi)核編譯鏈接腳本 201
7.4.5 具有用戶模式進(jìn)程的內(nèi)核的演示 201
7.5 具有用戶模式進(jìn)程的嵌入式系統(tǒng) 202
7.5.1 相同域中的進(jìn)程 202
7.5.2 相同域中的進(jìn)程的演示 202
7.5.3 具有單個域的進(jìn)程 205
7.5.4 具有單個域的進(jìn)程的演示 205
7.6 RAM磁盤 205
7.6.1 創(chuàng)建RAM磁盤映像 206
7.6.2 進(jìn)程映像文件加載器 208
7.7 進(jìn)程管理 210
7.7.1 進(jìn)程創(chuàng)建 210
7.7.2 進(jìn)程終止 210
7.7.3 進(jìn)程族樹 211
7.7.4 等待子進(jìn)程終止 212
7.7.5 UNIX/Linux中的fork-exec 213
7.7.6 fork的實(shí)現(xiàn) 213
7.7.7 exec的實(shí)現(xiàn) 215
7.7.8 fork-exec的演示 217
7.7.9 用于命令執(zhí)行的簡單sh 219
7.7.10 vfork 220
7.7.11 vfork的演示 221
7.8 線程 222
7.8.1 線程創(chuàng)建 223
7.8.2 線程演示 224
7.8.3 線程同步 225
7.9 具有二級分頁的嵌入式系統(tǒng) 225
7.9.1 二級靜態(tài)分頁 227
7.9.2 二級靜態(tài)分頁的演示 229
7.9.3 二級動態(tài)分頁 229
7.9.4 二級動態(tài)分頁的演示 231
7.10 KMH內(nèi)存映射 232
7.10.1 KMH使用一級靜態(tài)分頁 232
7.10.2 KMH使用二級靜態(tài)分頁 236
7.10.3 KMH使用二級動態(tài)分頁 236
7.11 嵌入式系統(tǒng)支持的文件系統(tǒng) 236
7.11.1 創(chuàng)建SDC映像 237
7.11.2 將SDC分區(qū)格式化為文件系統(tǒng) 237
7.11.3 為SDC分區(qū)創(chuàng)建循環(huán)設(shè)備 238
7.12 具有SDC文件系統(tǒng)的嵌入式系統(tǒng) 238
7.12.1 使用信號量的SDC驅(qū)動程序 238
7.12.2 使用SDC文件系統(tǒng)的系統(tǒng)內(nèi)核 242
7.12.3 SDC文件系統(tǒng)的演示 243
7.13 從SDC引導(dǎo)內(nèi)核映像 244
7.13.1 SDC引導(dǎo)程序 244
7.13.2 從SDC引導(dǎo)內(nèi)核的演示 248
7.13.3 從SDC引導(dǎo)使用動態(tài)分頁的內(nèi)核 249
7.13.4 兩階段引導(dǎo) 250
7.13.5 兩階段引導(dǎo)的演示 251
7.14 本章小結(jié) 252
思考題 252
參考文獻(xiàn) 253
第8章 嵌入式通用操作系統(tǒng) 254
8.1 什么是通用操作系統(tǒng) 254
8.2 什么是嵌入式通用操作系統(tǒng) 254
8.3 將通用操作系統(tǒng)移植到嵌入式系統(tǒng) 254
8.4 為ARM開發(fā)一個嵌入式通用操作系統(tǒng) 255
8.5 EOS的結(jié)構(gòu) 255
8.5.1 硬件平臺 255
8.5.2 EOS源文件樹 256
8.5.3 EOS內(nèi)核文件 256
8.5.4 EOS的功能 257
8.5.5 EOS的啟動順序 257
8.5.6 EOS的進(jìn)程管理 258
8.5.7 EOS的匯編代碼 260
8.5.8 EOS的t.c文件 268
8.5.9 進(jìn)程管理函數(shù) 271
8.5.10 管道 272
8.5.11 消息傳遞 272
8.5.12 消息傳遞的演示 274
8.6 EOS中的內(nèi)存管理 274
8.6.1 EOS的內(nèi)存映射 274
8.6.2 虛擬地址空間 275
8.6.3 內(nèi)核模式pgdir和頁表 275
8.6.4 進(jìn)程用戶模式頁表 275
8.6.5 進(jìn)程切換期間切換pgdir 276
8.6.6 動態(tài)分頁 276
8.7 異常和信號處理 277
8.8 EOS中的信號處理 279
8.8.1 PROC資源中的信號 279
8.8.2 EOS中的信號來源 279
8.8.3 傳遞信號給進(jìn)程 279
8.8.4 更改內(nèi)核中的信號處理程序 279
8.8.5 EOS內(nèi)核中的信號處理 280
8.8.6 在用戶模式下調(diào)度信號捕捉器 280
8.9 設(shè)備驅(qū)動程序 281
8.10 EOS中的進(jìn)程調(diào)度 281
8.11 EOS中的計時器服務(wù) 282
8.12 文件系統(tǒng) 283
8.12.1 文件操作級別 283
8.12.2 文件I/O操作 285
8.12.3 EOS中的EXT2文件系統(tǒng) 291
8.12.4 第一級FS的實(shí)現(xiàn) 293
8.12.5 第二級FS的實(shí)現(xiàn) 300
8.12.6 第三級FS的實(shí)現(xiàn) 305
8.13 塊設(shè)備的I/O緩沖 307
8.14 I/O緩沖區(qū)管理算法 308
8.15 用戶界面 310
8.15.1 init程序 311
8.15.2 login程序 311
8.15.3 sh程序 312
8.16 EOS的演示 312
8.16.1 EOS的啟動 312
8.16.2 EOS的命令處理 313
8.16.3 EOS的信號和異常處理 314
8.17 本章小結(jié) 315
思考題 315
參考文獻(xiàn) 316
第9章 嵌入式系統(tǒng)中的多處理器 317
9.1 多處理器 317
9.2 SMP系統(tǒng)的需求 317
9.3 ARM MPCore處理器 318
9.4 ARM Cortex-A9 MPCore處理器 319
9.4.1 處理器的核心 319
9.4.2 監(jiān)聽控制單元 319
9.4.3 通用中斷控制器 320
9.5 GIC編程示例 320
9.5.1 配置GIC以路由中斷 320
9.5.2 GIC配置代碼說明 327
9.5.3 中斷優(yōu)先級和中斷屏蔽 328
9.5.4 GIC編程的演示 328
9.6 ARM MPCore的啟動順序 328
9.6.1 原始啟動順序 328
9.6.2 引導(dǎo)程序輔助下的啟動順序 329
9.6.3 在虛擬機(jī)上引導(dǎo)SMP 329
9.7 ARM SMP啟動示例 329
9.7.1 ARM SMP啟動示例1 329
9.7.2 ARM SMP啟動示例1的演示 335
9.7.3 ARM SMP啟動示例2 335
9.7.4 ARM SMP啟動示例2的演示 337
9.8 SMP的臨界區(qū) 337
9.8.1 SMP臨界區(qū)的實(shí)現(xiàn) 337
9.8.2 XCHG/SWAP操作的缺點(diǎn) 338
9.8.3 SMP的ARM同步指令 338
9.9 SMP中的同步原語 339
9.9.1 自旋鎖 339
9.9.2 自旋鎖示例 340
9.9.3 使用自旋鎖啟動SMP的演示 341
9.9.4 SMP中的互斥鎖 341
9.9.5 使用自旋鎖實(shí)現(xiàn)互斥鎖 342
9.9.6 使用互斥鎖啟動SMP的演示 343
9.10 全局計時器和本地計時器 344
9.11 SMP中的信號量 347
9.12 條件鎖定 348
9.12.1 條件自旋鎖 349
9.12.2 條件互斥鎖 349
9.12.3 條件信號量操作 350
9.13 SMP中的內(nèi)存管理 350
9.13.1 SMP中的內(nèi)存管理模型 351
9.13.2 統(tǒng)一VA空間 351
9.13.3 非統(tǒng)一VA空間 354
9.13.4 非統(tǒng)一VA空間中的并行計算 356
9.14 SMP中的多任務(wù) 359
9.15 用于進(jìn)程管理的SMP內(nèi)核 360
9.15.1 ts.s文件 361
9.15.2 t.c文件 367
9.15.3 kernel.c文件 369
9.15.4 SMP中的設(shè)備驅(qū)動程序和中斷處理程序 372
9.15.5 SMP中進(jìn)程管理的演示 376
9.16 通用SMP操作系統(tǒng) 377
9.16.1 SMP_EOS的組織結(jié)構(gòu) 377
9.16.2 SMP_EOS源文件樹 378
9.16.3 SMP_EOS內(nèi)核文件 378
9.16.4 SMP_EOS中的進(jìn)程管理 379
9.16.5 保護(hù)SMP中的內(nèi)核數(shù)據(jù)結(jié)構(gòu) 380
9.16.6 SMP中的死鎖預(yù)防 382
9.16.7 調(diào)整UP算法以適用于SMP 384
9.16.8 SMP中的設(shè)備驅(qū)動程序和中斷處理程序 384
9.17 SMP_EOS演示系統(tǒng) 385
9.17.1 SMP_EOS的啟動順序 385
9.17.2 SMP_EOS的功能 386
9.17.3 SMP_EOS的演示 386
9.18 本章小結(jié) 386
思考題 387
參考文獻(xiàn) 388
第10章 嵌入式實(shí)時操作系統(tǒng) 389
10.1 RTOS的概念 389
10.2 RTOS中的任務(wù)調(diào)度 389
10.2.1 速率單調(diào)調(diào)度 389
10.2.2 最早截止期限優(yōu)先調(diào)度 390
10.2.3 截止期限單調(diào)調(diào)度 390
10.3 優(yōu)先級倒置 391
10.4 優(yōu)先級倒置的預(yù)防 391
10.4.1 優(yōu)先級上限 392
10.4.2 優(yōu)先級繼承 392
10.5 RTOS的概況 392
10.5.1 FreeRTOS 392
10.5.2 MicroC/OS 393
10.5.3 NuttX 393
10.5.4 VxWorks 394
10.5.5 QNX 395
10.5.6 實(shí)時Linux 395
10.5.7 現(xiàn)有RTOS的評價 397
10.6 RTOS的設(shè)計原則 400
10.6.1 中斷處理 400
10.6.2 任務(wù)管理 400
10.6.3 任務(wù)調(diào)度 400
10.6.4 同步工具 400
10.6.5 任務(wù)通信 400
10.6.6 內(nèi)存管理 401
10.6.7 文件系統(tǒng) 401
10.6.8 跟蹤與調(diào)試 401
10.7 單處理器RTOS 401
10.7.1 UP_RTOS的任務(wù)管理 401
10.7.2 UP_RTOS的任務(wù)同步 402
10.7.3 UP_RTOS的任務(wù)調(diào)度 402
10.7.4 UP_RTOS的任務(wù)間通信 403
10.7.5 臨界區(qū)的保護(hù) 403
10.7.6 文件系統(tǒng)和日志 403
10.7.7 具有靜態(tài)周期性任務(wù)和循環(huán)調(diào)度的UP_RTOS 404
10.7.8 具有靜態(tài)周期性任務(wù)和搶占式調(diào)度的UP_RTOS 416
10.7.9 具有共享資源的動態(tài)任務(wù)的UP_RTOS 422
10.8 多處理器RTOS 429
10.8.1 用于任務(wù)管理的SMP_RTOS內(nèi)核 430
10.8.2 調(diào)整UP_RTOS以適應(yīng)SMP 446
10.8.3 SMP_RTOS的嵌套中斷 449
10.8.4 SMP_RTOS的搶占式任務(wù)調(diào)度 450
10.8.5 基于SGI的任務(wù)切換 451
10.8.6 SMP_RTOS的分時任務(wù)調(diào)度演示 453
10.8.7 SMP_RTOS的搶占式任務(wù)調(diào)度演示 455
10.8.8 優(yōu)先級繼承 458
10.8.9 SMP_RTOS系統(tǒng)的演示 460
10.9 本章小結(jié) 464
思考題 464
參考文獻(xiàn) 465