Linux驅動開發入門與實戰(第3版)
鄭強
買這商品的人也買了...
-
$690$538 -
$360$281 -
$267深入淺出 SSD:固態存儲核心技術、原理與實戰
-
$1,200$948 -
$2,750$2,613 -
$894$849 -
$1,194$1,134 -
$1,000$660 -
$880$695 -
$880$695 -
$719$683 -
$611$575 -
$780$515 -
$780$663 -
$894$849 -
$539$512 -
$720$562 -
$720$562 -
$820$648 -
$600$450 -
$599$569 -
$954$906 -
$834$792 -
$709圖解 Linux 核心 (基於6.x)
-
$820$648
相關主題
商品描述
本書是獲得大量讀者好評的“Linux典藏大系”中的《Linux驅動開發入門與實戰》(第3版)。《Linux驅動開發入門與實戰(第3版)》內容充實,重點突出,實例豐富,實用性強,涵蓋Linux驅動開發從基礎知識到核心原理,再到應用實例的大部分核心知識。本書專門提供教學視頻、源代碼、思維導圖、習題參考答案和教學PPT等超值配套資料,可以幫助讀者高效、直觀地學習。 《Linux驅動開發入門與實戰(第3版)》共19章,分為3篇。第1篇“基礎知識”涵蓋Linux驅動開發概述、嵌入式處理器和開發板、構建嵌入式驅動程序開發環境、構建嵌入式Linux操作系統、構建第一個驅動程序、簡單的字符設備驅動程序等內容;第2篇“核心技術”涵蓋設備驅動的並發控制、設備驅動的阻塞和同步機制、中斷與時鐘機制、內外存訪問等內容;第3篇“應用實戰”涵蓋設備驅動模型、RTC實時時鐘驅動程序、看門狗驅動程序、IIC設備驅動程序、LCD設備驅動程序、觸摸屏設備驅動程序、輸入子系統設計、塊設備驅動程序、USB設備驅動程序等內容。 《Linux驅動開發入門與實戰(第3版)》適合所有想系統學習Linux驅動開發的入門與進階人員閱讀,也適合從事驅動開發的工程師閱讀,還適合高等院校相關專業的學生和培訓機構的學員作為學慣用書。
目錄大綱
第1篇 基礎知識
第1章 Linux驅動開發概述 2
1.1 Linux設備驅動基礎知識 2
1.1.1 設備驅動程序概述 2
1.1.2 設備驅動程序的作用 2
1.1.3 設備驅動的分類 3
1.2 Linux操作系統與驅動的關系 4
1.3 Linux驅動程序開發簡介 4
1.3.1 用戶態和內核態 5
1.3.2 模塊機制 5
1.3.3 編寫設備驅動程序需要瞭解的知識 6
1.4 編寫設備驅動程序的註意事項 6
1.4.1 應用程序開發與驅動程序開發的差異 6
1.4.2 使用GUN C開發驅動程序 7
1.4.3 不能使用C函數庫開發驅動程序 7
1.4.4 沒有內存保護機制 8
1.4.5 小內核棧 8
1.4.6 重視可移植性 8
1.5 Linux驅動的發展趨勢 9
1.5.1 Linux驅動的發展前景 9
1.5.2 驅動的應用 9
1.5.3 相關學習資源 9
1.6 小結 10
1.7 習題 10
第2章 嵌入式處理器和開發板 11
2.1 處理器 11
2.1.1 處理器簡介 11
2.1.2 處理器的種類 11
2.2 ARM處理器 12
2.2.1 ARM處理器簡介 12
2.2.2 ARM處理器系列 13
2.2.3 ARM處理器的應用 14
2.2.4 ARM處理器的選型 15
2.2.5 ARM處理器選型舉例 18
2.3 S3C2440開發板 19
2.3.1 S3C2440開發板簡介 19
2.3.2 S3C2440開發板的特性 19
2.3.3 其他開發板 21
2.4 小結 21
2.5 習題 21
第3章 構建嵌入式驅動程序開發環境 23
3.1 安裝虛擬機和Linux系統 23
3.1.1 在Windows上安裝虛擬機 23
3.1.2 在虛擬機上安裝Linux系統 27
3.1.3 設置共享目錄 29
3.2 代碼閱讀工具Source Insight 30
3.2.1 Source Insight簡介 31
3.2.2 閱讀源代碼 31
3.3 小結 34
3.4 習題 35
第4章 構建嵌入式Linux操作系統 36
4.1 Linux操作系統簡介 36
4.2 Linux操作系統的優點 37
4.3 Linux內核子系統 38
4.3.1 進程管理 38
4.3.2 內存管理 39
4.3.3 文件系統 39
4.3.4 設備管理 40
4.3.5 網絡管理 40
4.4 Linux源代碼結構分析 40
4.4.1 arch目錄 40
4.4.2 drivers目錄 41
4.4.3 fs目錄 41
4.4.4 其他目錄 42
4.5 內核配置選項 43
4.5.1 配置編譯過程 43
4.5.2 常規配置 44
4.5.3 模塊配置 46
4.5.4 塊設備層配置 47
4.5.5 CPU類型和特性配置 47
4.5.6 電源管理配置 48
4.5.7 總線配置 49
4.5.8 網絡配置 49
4.5.9 設備驅動配置 50
4.5.10 文件系統配置 54
4.5.11 其他配置 56
4.6 嵌入式文件系統簡介 56
4.6.1 嵌入式系統的存儲介質 57
4.6.2 JFFS文件系統 57
4.6.3 YAFFS文件系統 58
4.7 構建根文件系統簡介 58
4.7.1 Linux根文件系統目錄結構 59
4.7.2 使用BusyBox構建根文件系統 60
4.8 小結 65
4.9 習題 65
第5章 構建第一個驅動程序 67
5.1 升級內核 67
5.1.1 為什麽要升級內核 67
5.1.2 升級內核的方式 68
5.2 編寫Hello World驅動程序 70
5.2.1 驅動模塊的組成 70
5.2.2 編寫Hello World模塊 71
5.2.3 編譯Hello World模塊 72
5.2.4 模塊的操作命令 74
5.2.5 Hello World模塊對文件系統的影響 75
5.3 模塊參數和模塊之間的通信 76
5.3.1 模塊參數 76
5.3.2 模塊使用的文件格式ELF 76
5.3.3 模塊之間的通信 77
5.3.4 模塊之間的通信實例 78
5.4 將模塊加入內核 81
5.4.1 向內核添加模塊 81
5.4.2 Kconfig文件 81
5.4.3 Kconfig文件的語法 83
5.4.4 應用實例:在內核中增加add_sub模塊 86
5.4.5 對add_sub模塊進行配置 87
5.5 小結 89
5.6 習題 89
第6章 簡單的字符設備驅動程序 91
6.1 字符設備驅動程序框架 91
6.1.1 字符設備和塊設備 91
6.1.2 主設備號和次設備號 92
6.1.3 申請和釋放設備號 94
6.2 初識cdev結構體 95
6.2.1 cdev結構體簡介 95
6.2.2 file_operations結構體簡介 96
6.2.3 cdev和file_operations結構體的關系 97
6.2.4 inode結構體簡介 98
6.3 字符設備驅動程序的組成 99
6.3.1 字符設備驅動程序的加載和卸載函數 99
6.3.2 file_operations結構體成員函數 100
6.3.3 驅動程序與應用程序的數據交換 100
6.3.4 字符設備驅動程序組成小結 101
6.4 VirtualDisk字符設備驅動程序 101
6.4.1 VirtualDisk的頭文件、宏和設備結構體 102
6.4.2 加載和卸載驅動程序 102
6.4.3 初始化和註冊cdev 104
6.4.4 打開和釋放函數 104
6.4.5 讀寫函數 105
6.4.6 seek()函數 106
6.5 小結 108
6.6 習題 108
第2篇 核心技術
第7章 設備驅動的並發控制 110
7.1 並發與競爭 110
7.2 原子變量操作 110
7.2.1 定義原子變量 110
7.2.2 原子整型操作 111
7.2.3 原子位操作 113
7.3 自旋鎖 114
7.3.1 自旋鎖的操作方法 114
7.3.2 自旋鎖的註意事項 115
7.4 信號量 116
7.4.1 信號量的實現 116
7.4.2 信號量的操作方法 117
7.4.3 自旋鎖與信號量的對比 119
7.5 完成量 119
7.5.1 完成量的實現 120
7.5.2 完成量的操作方法 120
7.6 小結 122
7.7 習題 122
第8章 設備驅動的阻塞和同步機制 123
8.1 阻塞和非阻塞 123
8.2 等待隊列 123
8.2.1 等待隊列的實現 123
8.2.2 等待隊列操作方法 124
8.3 同步機制實驗 126
8.3.1 同步機制設計 126
8.3.2 同步機制驗證 129
8.4 小結 131
8.5 習題 131
第9章 中斷與時鐘機制 133
9.1 中斷簡述 133
9.1.1 中斷的概念 133
9.1.2 中斷的宏觀分類 134
9.1.3 中斷產生的位置分類 134
9.1.4 同步和異步中斷 135
9.2 中斷的實現過程 135
9.2.1 中斷信號線 136
9.2.2 中斷控制器 136
9.2.3 中斷處理過程 136
9.2.4 中斷的安裝與釋放 137
9.3 按鍵中斷實例 138
9.3.1 按鍵設備原理圖 138
9.3.2 有寄存器設備和無寄存器設備 139
9.3.3 G埠控制寄存器 139
9.4 按鍵驅動程序實例分析 141
9.4.1 初始化函數s3c2440_buttons_init() 142
9.4.2 中斷處理函數isr_button() 143
9.4.3 退出函數s3c2440_buttons_exit() 144
9.5 時鐘機制 144
9.5.1 時間度量 144
9.5.2 延時 145
9.6 小結 146
9.7 習題 146
第10章 內外存訪問 147
10.1 內存分配 147
10.1.1 kmalloc()函數 147
10.1.2 vmalloc()函數 148
10.1.3 後備高速緩存 150
10.2 頁面分配 151
10.2.1 內存分配 151
10.2.2 物理地址和虛擬地址之間的轉換 154
10.3 設備I/O埠的訪問 155
10.3.1 Linux I/O埠讀寫函數 155
10.3.2 I/O內存讀寫 155
10.3.3 使用I/O埠 157
10.4 小結 159
10.5 習題 159
第3篇 應用實戰
第11章 設備驅動模型 162
11.1 設備驅動模型概述 162
11.1.1 設備驅動模型的功能 162
11.1.2 sysfs文件系統 163
11.1.3 sysfs文件系統的目錄結構 164
11.2 設備驅動模型的核心數據結構 166
11.2.1 kobject結構體 166
11.2.2 設備屬性kobj_type 170
11.3 kobject對象的應用 173
11.3.1 設備驅動模型結構 173
11.3.2 kset集合 174
11.3.3 kset與kobject的關系 176
11.3.4 kset的相關操作函數 176
11.3.5 註冊kobject到sysfs實例 177
11.3.6 實例測試 181
11.4 設備驅動模型的三大組件 182
11.4.1 總線 182
11.4.2 總線屬性和總線方法 186
11.4.3 設備 187
11.4.4 驅動 188
11.5 小結 191
11.6 習題 192
第12章 實時時鐘驅動程序 193
12.1 RTC實時時鐘的硬件原理 193
12.1.1 實時時鐘簡介 193
12.1.2 RTC實時時鐘的功能 193
12.1.3 RTC實時時鐘的工作原理 195
12.2 RTC實時時鐘架構 199
12.2.1 註冊和卸載平臺設備驅動 199
12.2.2 RTC實時時鐘的平臺設備驅動 200
12.2.3 RTC驅動探測函數 201
12.2.4 RTC設備註冊函數devm_rtc_device_register() 204
12.3 RTC文件系統接口 204
12.3.1 文件系統接口rtc_class_ops 205
12.3.2 RTC實時時鐘獲得時間函數s3c_rtc_gettime() 206
12.3.3 RTC實時時鐘設置時間函數s3c_rtc_settime() 207
12.3.4 RTC驅動探測函數s3c_rtc_getalarm() 208
12.3.5 RTC實時時鐘設置報警時間函數s3c_rtc_setalarm() 209
12.4 小結 210
12.5 習題 211
第13章 看門狗驅動程序 212
13.1 看門狗概述 212
13.1.1 看門狗的功能 212
13.1.2 看門狗的工作原理 212
13.2 設備模型 214
13.2.1 平臺設備模型 214
13.2.2 平臺設備 215
13.2.3 平臺設備驅動 217
13.2.4 平臺設備驅動的註冊和註銷 218
13.2.5 混雜設備 219
13.2.6 混雜設備的註冊和註銷 220
13.3 看門狗設備驅動程序分析 220
13.3.1 看門狗驅動程序的一些變量定義 220
13.3.2 註冊和卸載看門狗驅動 221
13.3.3 看門狗驅動程序探測函數 221
13.3.4 設置看門狗復位時間函數s3c2410wdt_set_heartbeat() 223
13.3.5 看門狗的開始函數s3c2410wdt_start()和停止函數s3c2410wdt_stop() 224
13.3.6 看門狗驅動程序移除函數s3c2410wdt_remove() 225
13.3.7 平臺設備驅動s3c2410wdt_driver中的其他重要函數 226
13.3.8 看門狗中斷處理函數s3c2410wdt_irq() 227
13.4 小結 227
13.5 習題 227
第14章 IIC設備驅動程序 229
14.1 IIC設備的總線及其協議 229
14.1.1 IIC總線的特點 229
14.1.2 IIC總線的信號類型 230
14.1.3 IIC總線的數據傳輸 230
14.2 IIC設備的硬件結構 230
14.3 IIC設備驅動程序的層次結構 232
14.3.1 IIC設備驅動概述 232
14.3.2 IIC設備層 233
14.3.3 i2c_driver和i2c_client的關系 235
14.3.4 IIC總線層 236
14.3.5 IIC設備層和總線層的關系 237
14.3.6 寫IIC設備驅動的步驟 238
14.4 IIC子系統的初始化 238
14.4.1 IIC子系統初始化函數i2c_init() 238
14.4.2 IIC子系統退出函數i2c_exit() 239
14.5 適配器驅動程序 240
14.5.1 S3C2440對應的適配器結構體 240
14.5.2 IIC適配器加載函數i2c_add_adapter() 242
14.5.3 IDR機制 242
14.5.4 適配器卸載函數i2c_del_adapter() 244
14.5.5 IIC總線通信方法s3c24xx_i2c_algorithm結構體 244
14.5.6 適配器的傳輸函數s3c24xx_i2c_doxfer() 246
14.5.7 適配器的中斷處理函數s3c24xx_i2c_irq() 249
14.5.8 字節傳輸函數i2c_s3c_irq_nextbyte() 251
14.5.9 適配器傳輸停止函數s3c24xx_i2c_stop() 253
14.5.10 中斷處理函數的一些輔助函數 254
14.6 IIC設備層驅動程序 255
14.6.1 加載和卸載IIC設備驅動模塊 255
14.6.2 探測函數s3c24xx_i2c_probe() 256
14.6.3 移除函數s3c24xx_i2c_remove() 258
14.6.4 控制器初始化函數s3c24xx_i2c_init() 259
14.6.5 設置控制器數據發送頻率函數s3c24xx_i2c_clockrate() 259
14.7 小結 261
14.8 習題 262
第15章 LCD設備驅動程序 263
15.1 FrameBuffer概述 263
15.1.1 FrameBuffer與應用程序的交互 264
15.1.2 FrameBuffer的顯示原理 264
15.1.3 LCD顯示原理 265
15.2 FrameBuffer結構分析 265
15.2.1 FrameBuffer架構 265
15.2.2 FrameBuffer驅動程序的實現 266
15.2.3 FrameBuffer驅動程序的組成 267
15.3 LCD驅動程序分析 272
15.3.1 LCD模塊的加載和卸載函數 273
15.3.2 LCD驅動程序的平臺數據 274
15.3.3 LCD模塊的探測函數 275
15.3.4 移除函數 279
15.4 小結 280
15.5 習題 280
第16章 觸摸屏設備驅動程序 282
16.1 觸摸屏設備的工作原理 282
16.1.1 觸摸屏設備簡介 282
16.1.2 觸摸屏設備類型 282
16.1.3 電阻式觸摸屏 283
16.2 觸摸屏設備的硬件結構 283
16.2.1 S3C2440觸摸屏接口簡介 283
16.2.2 S3C2440觸摸屏接口的工作模式 284
16.2.3 S3C2440觸摸屏設備寄存器 284
16.3 觸摸屏設備驅動程序分析 288
16.3.1 觸摸屏設備驅動程序構成 288
16.3.2 S3C2440觸摸屏設備驅動程序的註冊和卸載 289
16.3.3 S3C2440觸摸屏驅動模塊探測函數 289
16.3.4 觸摸屏設備驅動程序中斷處理函數 292
16.3.5 S3C2440觸摸屏設備驅動模塊的remove()函數 293
16.4 測試觸摸屏設備驅動程序 294
16.5 小結 295
16.6 習題 295
第17章 輸入子系統設計 297
17.1 input子系統入門 297
17.1.1 簡單的實例 297
17.1.2 註冊函數input_register_device() 299
17.1.3 向子系統報告事件 303
17.2 Handler處理器註冊分析 308
17.2.1 輸入子系統的構成 308
17.2.2 input_handler結構體 308
17.2.3 註冊input_handler 309
17.2.4 input_handle結構體 310
17.2.5 註冊input_handle 311
17.3 input子系統 312
17.4 evdev輸入事件驅動程序分析 313
17.4.1 evdev的初始化 313
17.4.2 打開evdev設備 315
17.5 小結 318
17.6 習題 318
第18章 塊設備驅動程序 319
18.1 塊設備概述 319
18.1.1 塊設備簡介 319
18.1.2 塊設備的結構 320
18.2 塊設備驅動程序架構 322
18.2.1 塊設備的加載過程 322
18.2.2 塊設備的卸載過程 323
18.3 通用塊層 323
18.3.1 通用塊層簡介 323
18.3.2 blk_alloc_disk()函數對應的gendisk結構體 324
18.3.3 塊設備的註冊和註銷 326
18.3.4 請求隊列 327
18.3.5 設置gendisk屬性中的block_device_operations結構體 327
18.4 I/O調度器 328
18.4.1 數據從內存到磁盤的過程 329
18.4.2 塊I/O請求 329
18.4.3 請求結構 331
18.4.4 請求隊列 333
18.4.5 請求隊列、請求結構和bio的關系 334
18.4.6 四種調度算法 335
18.5 編寫塊設備驅動程序 337
18.5.1 宏定義和全局變量 337
18.5.2 加載函數 339
18.5.3 卸載函數 341
18.5.4 自定義請求處理函數 341
18.5.5 驅動測試 342
18.6 小結 345
18.7 習題 345
第19章 USB設備驅動程序 346
19.1 USB概述 346
19.1.1 USB的發展版本 346
19.1.2 USB的特點 347
19.1.3 USB總線拓撲結構 348
19.1.4 USB驅動總體架構 348
19.2 USB設備驅動模型 352
19.2.1 USB設備驅動初探 352
19.2.2 USB設備驅動模型實現原理 355
19.2.3 USB設備驅動結構usb_driver 357
19.3 USB設備驅動程序 362
19.3.1 USB設備驅動程序加載和卸載函數 362
19.3.2 探測函數probe()的參數usb_interface 363
19.3.3 USB協議中的設備 363
19.3.4 端點的傳輸方式 369
19.3.5 設置 370
19.3.6 探測函數storage_probe() 372
19.4 獲得USB設備信息 375
19.4.1 設備關聯函數associate_dev() 375
19.4.2 獲得設備信息函數get_device_info() 377
19.4.3 獲得傳輸協議函數get_transport() 378
19.4.4 獲得協議信息函數get_protocol() 379
19.4.5 獲得管道信息函數get_pipes() 379
19.5 資源初始化 382
19.5.1 storage_probe()函數的調用過程 382
19.5.2 資源獲取函數usb_stor_acquire_resources() 382
19.5.3 USB請求塊 383
19.6 控制子線程 387
19.6.1 控制線程 387
19.6.2 掃描延遲工作函數usb_stor_scan_dwork() 389
19.6.3 獲得LUN函數usb_stor_Bulk_max_lun() 389
19.7 小結 396
19.8 習題 396
Linux驅動開發入門與實戰(第3版)
目錄
·XIV·
·XV·