《精通Linux設備驅(qū)動程序開發(fā)》是Linux設備驅(qū)動程序開發(fā)領域的著作。全書基于2.6內(nèi)核,不僅透徹講解了基本概念和技術,更深入探討了其他書沒有涵蓋或淺嘗輒止的許多重要主題和關鍵難點,如PCMCIA、I2C和USB等外部總線以及視頻、音頻、無線連網(wǎng)和閃存等驅(qū)動程序的開發(fā),并講解了相關的內(nèi)核源碼文件,給出了完整的開發(fā)實例。
《精通Linux設備驅(qū)動程序開發(fā)》適合中高級Linux開發(fā)人員閱讀。
全面深入的Linux設備驅(qū)動程序名著
Linux技術大師力作
大量底層技術內(nèi)幕首次公開
時至今日,Linux操作系統(tǒng)充分體現(xiàn)了其跨平臺、開源、支持眾多應用軟件和網(wǎng)路協(xié)議等優(yōu)點,已經(jīng)成為應用廣泛的開發(fā)平臺。
在這部貼近實戰(zhàn)、實例豐富的著作中,享譽世界的Linux驅(qū)動程序開發(fā)大師將與你面對面,系統(tǒng)深入地闡述如何為各種設備開發(fā)可靠的驅(qū)動程序。在回顧了驅(qū)動程序開發(fā)的各種基礎知識和新的Linux 2.6內(nèi)核相關特性之后,作者不僅講述了其他設備驅(qū)動程序圖書中都會涉及的比較容易的內(nèi)容,更迎難而上,深入探討了包括嵌入式Linux開發(fā)在內(nèi)的驅(qū)動程序開發(fā)中必須面對的難點,比如PCMCIA、USB、I2C、視頻、音頻、內(nèi)存、無線通信等,節(jié)食了許多技術內(nèi)幕。對每種驅(qū)動程序,書中除了剖析關鍵技術,還帶你查看相關的內(nèi)核源代碼,提供完整的實例。
Sreekrishnan Venkateswaran,世界Linux開發(fā)技術專家。在IBM工作多年,有豐富的嵌入式Linux和驅(qū)動程序開發(fā)經(jīng)驗,曾將Linux移植到了手表、音樂播放器、VoIP電話、心臟起搏器以及遠程門診監(jiān)控系統(tǒng)等設備上。目前是IBM印度公司的嵌入式解決方案組負責人。他曾擔任Linux Magazine的特邀編輯,主持內(nèi)核技術專欄。
第1章 引言 1
1.1 演進 1
1.2 GNU Copyleft 2
1.3 kernel.org 2
1.4 郵件列表和論壇 3
1.5 Linux發(fā)行版 3
1.6 查看源代碼 4
1.7 編譯內(nèi)核 7
1.8 可加載的模塊 8
1.9 整裝待發(fā) 9
第2章 內(nèi)核 11
2.1 啟動過程 11
2.1.1 BIOS-provided physical RAM map 12
2.1.2 758MB LOWMEM available 14
2.1.3 Kernel command line: ro
root=/dev/hda1 14
2.1.4 Calibrating delay...1197.46
BogoMIPS (lpj=2394935) 15
2.1.5 Checking HLT instruction 16
2.1.6 NET: Registered protocol family 2 17
2.1.7 Freeing initrd memory: 387k freed 17
2.1.8 io scheduler anticipatory
registered (default) 18
2.1.9 Setting up standard PCI resources 18
2.1.10 EXT3-fs: mounted filesystem 19
2.1.11 INIT: version 2.85 booting 19
2.2 內(nèi)核模式和用戶模式 20
2.3 進程上下文和中斷上下文 20
2.4 內(nèi)核定時器 21
2.4.1 HZ和Jiffies 21
2.4.2 長延時 22
2.4.3 短延時 24
2.4.4 Pentium時間戳計數(shù)器 24
2.4.5 實時鐘 25
2.5 內(nèi)核中的并發(fā) 26
2.5.1 自旋鎖和互斥體 26
2.5.2 原子操作 30
2.5.3 讀—寫鎖 31
2.5.4 調(diào)試 32
2.6 proc文件系統(tǒng) 32
2.7 內(nèi)存分配 33
2.8 查看源代碼 34
第3章 內(nèi)核組件 37
3.1 內(nèi)核線程 37
3.1.1 創(chuàng)建內(nèi)核線程 37
3.1.2 進程狀態(tài)和等待隊列 41
3.1.3 用戶模式輔助程序 42
3.2 輔助接口 43
3.2.1 鏈表 44
3.2.2 散列鏈表 49
3.2.3 工作隊列 49
3.2.4 通知鏈 51
3.2.5 完成接口 54
3.2.6 kthread輔助接口 56
3.2.7 錯誤處理助手 57
3.3 查看源代碼 58
第4章 基本概念 61
4.1 設備和驅(qū)動程序介紹 61
4.2 中斷處理 63
4.2.1 中斷上下文 63
4.2.2 分配IRQ號 64
4.2.3 設備實例:導航桿 65
4.2.4 softirq和tasklet 68
4.3 Linux設備模型 71
4.3.1 udev 71
4.3.2 sysfs、kobject和設備類 73
4.3.3 熱插拔和冷插拔 76
4.3.4 微碼下載 76
4.3.5 模塊自動加載 77
4.4 內(nèi)存屏障 78
4.5 電源管理 79
4.6 查看源代碼 79
第5章 字符設備驅(qū)動程序 81
5.1 字符設備驅(qū)動程序基礎 81
5.2 設備實例:系統(tǒng)CMOS 82
5.2.1 驅(qū)動程序初始化 83
5.2.2 打開與釋放 86
5.2.3 數(shù)據(jù)交換 88
5.2.4 查找 92
5.2.5 控制 94
5.3 檢測數(shù)據(jù)可用性 95
5.3.1 輪詢 95
5.3.2 Fasync 98
5.4 和并行端口交互 99
5.5 RTC子系統(tǒng) 108
5.6 偽字符驅(qū)動程序 109
5.7 混雜驅(qū)動程序 110
5.8 字符設備驅(qū)動程序注意事項 115
5.9 查看源代碼 115
第6章 串行設備驅(qū)動程序 118
6.1 層次架構 119
6.2 UART驅(qū)動程序 121
6.2.1 設備實例:手機 122
6.2.2 RS-485 132
6.3 TTY驅(qū)動程序 132
6.4 線路規(guī)程 134
6.5 查看源代碼 141
第7章 輸入設備驅(qū)動程序 143
7.1 輸入事件驅(qū)動程序 144
7.2 輸入設備驅(qū)動程序 150
7.2.1 serio 150
7.2.2 鍵盤 150
7.2.3 鼠標 152
7.2.4 觸摸控制器 157
7.2.5 加速度傳感器 158
7.2.6 輸出事件 158
7.3 調(diào)試 159
7.4 查看源代碼 160
第8章 I2C協(xié)議 161
8.1 I2C/SMBus是什么 161
8.2 I2C核心 162
8.3 總線事務 164
8.4 設備實例:EEPROM 164
8.4.1 初始化 165
8.4.2 探測設備 167
8.4.3 檢查適配器的功能 169
8.4.4 訪問設備 169
8.4.5 其他函數(shù) 170
8.5 設備實例:實時時鐘 171
8.6 i2c-dev 174
8.7 使用LM-Sensors監(jiān)控硬件 174
8.8 SPI總線 174
8.9 1-Wire總線 176
8.10 調(diào)試 176
8.11 查看源代碼 176
第9章 PCMCIA和CF 179
9.1 PCMCIA/CF是什么 179
9.2 Linux-PCMCIA子系統(tǒng) 181
9.3 主機控制器驅(qū)動程序 183
9.4 PCMCIA核心 183
9.5 驅(qū)動程序服務 183
9.6 客戶驅(qū)動程序 183
9.6.1 數(shù)據(jù)結構 184
9.6.2 設備實例:PCMCIA卡 185
9.7 將零件組裝在一起 188
9.8 PCMCIA存儲 189
9.9 串行PCMCIA 189
9.10 調(diào)試 191
9.11 查看源代碼 191
第10章 PCI 193
10.1 PCI系列 193
10.2 尋址和識別 195
10.3 訪問PCI 198
10.3.1 配置區(qū) 198
10.3.2 I/O和內(nèi)存 199
10.4 DMA 200
10.5 設備實例:以太網(wǎng)—調(diào)制解調(diào)器卡 203
10.5.1 初始化和探測 203
10.5.2 數(shù)據(jù)傳輸 209
10.6 調(diào)試 214
10.7 查看源代碼 214
第11章 USB 216
11.1 USB體系架構 216
11.1.1 總線速度 218
11.1.2 主機控制器 218
11.1.3 傳輸模式 219
11.1.4 尋址 219
11.2 Linux-USB子系統(tǒng) 220
11.3 驅(qū)動程序的數(shù)據(jù)結構 221
11.3.1 usb_device結構體 221
11.3.2 URB 222
11.3.3 管道 223
11.3.4 描述符結構 223
11.4 枚舉 225
11.5 設備實例:遙測卡 225
11.5.1 初始化和探測過程 226
11.5.2 卡寄存器的訪問 230
11.5.3 數(shù)據(jù)傳輸 233
11.6 類驅(qū)動程序 236
11.6.1 大容量存儲設備 236
11.6.2 USB-串行端口轉(zhuǎn)換器 241
11.6.3 人機接口設備 243
11.6.4 藍牙 243
11.7 gadget驅(qū)動程序 243
11.8 調(diào)試 244
11.9 查看源代碼 245
第12章 視頻驅(qū)動程序 247
12.1 顯示架構 247
12.2 Linux視頻子系統(tǒng) 249
12.3 顯示參數(shù) 251
12.4 幀緩沖API 252
12.5 幀緩沖驅(qū)動程序 254
12.6 控制臺驅(qū)動程序 265
12.6.1 設備實例:手機 266
12.6.2 啟動logo 270
12.7 調(diào)試 270
12.8 查看源代碼 271
第13章 音頻驅(qū)動程序 273
13.1 音頻架構 273
13.2 Linux聲音子系統(tǒng) 275
13.3 設備實例:MP3播放器 277
13.3.1 驅(qū)動程序函數(shù)和結構體 278
13.3.2 ALSA編程 287
13.4 調(diào)試 288
13.5 查看源代碼 289
第14章 塊設備驅(qū)動程序 291
14.1 存儲技術 291
14.2 Linux塊I/O層 295
14.3 I/O調(diào)度器 295
14.4 塊驅(qū)動程序數(shù)據(jù)結構和方法 296
14.5 設備實例:簡單存儲控制器 298
14.5.1 初始化 299
14.5.2 塊設備操作 301
14.5.3 磁盤訪問 302
14.6 高級主題 304
14.7 調(diào)試 306
14.8 查看源代碼 306
第15章 網(wǎng)絡接口卡 308
15.1 驅(qū)動程序數(shù)據(jù)結構 308
15.1.1 套接字緩沖區(qū) 309
15.1.2 網(wǎng)絡設備接口 310
15.1.3 激活 311
15.1.4 數(shù)據(jù)傳輸 311
15.1.5 看門狗 311
15.1.6 統(tǒng)計 312
15.1.7 配置 313
15.1.8 總線相關內(nèi)容 314
15.2 與協(xié)議層會話 314
15.2.1 接收路徑 314
15.2.2 發(fā)送路徑 315
15.2.3 流量控制 315
15.3 緩沖區(qū)管理和并發(fā)控制 315
15.4 設備實例:以太網(wǎng)NIC 316
15.5 ISA網(wǎng)絡驅(qū)動程序 321
15.6 ATM 321
15.7 網(wǎng)絡吞吐量 322
15.7.1 驅(qū)動程序性能 322
15.7.2 協(xié)議性能 323
15.8 查看源代碼 324
第16章 Linux無線設備驅(qū)動 326
16.1 藍牙 327
16.1.1 BlueZ 328
16.1.2 設備實例:CF卡 329
16.1.3 設備實例:USB適配器 330
16.1.4 RFCOMM 331
16.1.5 網(wǎng)絡 332
16.1.6 HID 334
16.1.7 音頻 334
16.1.8 調(diào)試 334
16.1.9 關于源代碼 334
16.2 紅外 335
16.2.1 Linux-IrDA 335
16.2.2 設備實例:超級I/O芯片 337
16.2.3 設備實例:IR Dongle 338
16.2.4 IrCOMM 340
16.2.5 聯(lián)網(wǎng) 340
16.2.6 IrDA套接字 341
16.2.7 LIRC 341
16.2.8 查看源代碼 342
16.3 WiFi 343
16.3.1 配置 343
16.3.2 設備驅(qū)動程序 346
16.3.3 查看源代碼 347
16.4 蜂窩網(wǎng)絡 347
16.4.1 GPRS 347
16.4.2 CDMA 349
16.5 當前趨勢 350
第17章 存儲技術設備 352
17.1 什么是閃存 352
17.2 Linux-MTD子系統(tǒng) 353
17.3 映射驅(qū)動程序 353
17.4 NOR芯片驅(qū)動程序 358
17.5 NAND芯片驅(qū)動程序 359
17.6 用戶模塊 361
17.6.1 塊設備模擬 361
17.6.2 字符設備模擬 361
17.6.3 JFFS2 362
17.6.4 YAFFS2 363
17.7 MTD工具 363
17.8 配置MTD 363
17.9 XIP 364
17.10 FWH 364
17.11 調(diào)試 367
17.12 查看源代碼 367
第18章 嵌入式Linux 369
18.1 挑戰(zhàn) 369
18.2 元器件選擇 370
18.3 工具鏈 371
18.4 Bootloader 372
18.5 內(nèi)存布局 374
18.6 內(nèi)核移植 375
18.7 嵌入式驅(qū)動程序 376
18.7.1 閃存 377
18.7.2 UART 377
18.7.3 按鈕和滾輪 378
18.7.4 PCMCIA/CF 378
18.7.5 SD/MMC 378
18.7.6 USB 378
18.7.7 RTC 378
18.7.8 音頻 378
18.7.9 觸摸屏 379
18.7.10 視頻 379
18.7.11 CPLD/FPGA 379
18.7.12 連接性 379
18.7.13 專用領域電子器件 380
18.7.14 更多驅(qū)動程序 380
18.8 根文件系統(tǒng) 380
18.8.1 NFS掛載的根文件系統(tǒng) 381
18.8.2 緊湊型中間件 382
18.9 測試基礎設施 383
18.10 調(diào)試 383
18.10.1 電路板返工 384
18.10.2 調(diào)試器 385
第19章 用戶空間的驅(qū)動程序 386
19.1 進程調(diào)度和響應時間 387
19.1.1 原先的調(diào)度器 387
19.1.2 O(1)調(diào)度器 387
19.1.3 CFS 388
19.1.4 響應時間 388
19.2 訪問I/O區(qū)域 390
19.3 訪問內(nèi)存區(qū)域 393
19.4 用戶模式SCSI 395
19.5 用戶模式USB 397
19.6 用戶模式I2C 400
19.7 UIO 401
19.8 查看源代碼 402
第20章 其他設備和驅(qū)動程序 403
20.1 ECC報告 403
20.2 頻率調(diào)整 407
20.3 嵌入式控制器 408
20.4 ACPI 408
20.5 ISA與MCA 410
20.6 火線 410
20.7 智能輸入/輸出 411
20.8 業(yè)余無線電 411
20.9 VoIP 411
20.10 高速互聯(lián) 412
20.10.1 InfiniBand 413
20.10.2 RapidIO 413
20.10.3 光纖通道 413
20.10.4 iSCSI 413
第21章 調(diào)試設備驅(qū)動程序 414
21.1 kdb 414
21.1.1 進入調(diào)試器 415
21.1.2 kdb 415
21.1.3 kgdb 417
21.1.4 gdb 420
21.1.5 JTAG調(diào)試器 421
21.1.6 下載 423
21.2 內(nèi)核探測器 423
21.2.1 kprobe 423
21.2.2 jprobe 427
21.2.3 返回探針 429
21.2.4 局限性 431
21.2.5 查看源代碼 431
21.3 kexec與kdump 431
21.3.1 kexec 432
21.3.2 kdump與kexec協(xié)同工作 432
21.3.3 kdump 433
21.3.4 查看源代碼 437
21.4 性能剖析 437
21.4.1 利用OProfile剖析內(nèi)核性能 438
21.4.2 利用gprof剖析應用程序性能 440
21.5 跟蹤 441
21.6 LTP 444
21.7 UML 444
21.8 診斷工具 444
21.9 內(nèi)核修改配置選項 444
21.10 測試設備 445
第22章 維護與發(fā)布 446
22.1 代碼風格 446
22.2 修改標記 446
22.3 版本控制 447
22.4 一致性檢查 447
22.5 構建腳本 448
22.6 可移植代碼 450
第23章 結束語 451
23.1 流程一覽表 451
23.2 下一步該做什么 452
附錄A Linux匯編 453
附錄B Linux與BIOS 457
附錄C seq文件 461