深入Linux裝置驅動程式核心機制
基本資料
- 作者: 陳學松
- 出版社:電子工業出版社
- ISBN:9787121150524
- 上架時間:2012-2-6
- 出版日期:2012 年1月
http://product.china-pub.com/198916
內容簡介 這是一本系統闡述linux裝置驅動程式技術內幕的專業書籍,它的側重點不是討論如何在linux系統下編寫裝置驅動程式,而是要告訴讀者隱藏在這些裝置驅動程式背後的那些核心機制及原理。作者通過對linux核心源碼抽絲剝繭般的解讀,再輔之以精心設計的大量圖片,使讀者在閱讀完本書後對驅動程式前台所展現出來的那些行為特點變得豁然開朗。
《深入linux裝置驅動程式核心機制》涵蓋了編寫裝置驅動程式所需要的幾乎所有的核心設施,比如核心模組、中斷處理、互斥與同步、記憶體配置、延遲操作、時間管理,以及新裝置驅動模型等內容。為了避免讀者迷失在某一技術細節的討論當中,本書在一個比較高的層面上進行展開,以一種先架構再細節的結構安排極大地簡化了讀者的閱讀與學習。
《深入linux裝置驅動程式核心機制》不僅適合那些在linux系統下從事裝置驅動程式開發的專業技術人員閱讀,也同樣適合有志於從事linux裝置驅動程式開發或對linux裝置驅動程式及linux核心感興趣的在校學生等閱讀。對於沒有任何linux裝置驅動程式開發經驗的初學者,建議先閱讀那些討論“如何”在linux系統下編寫裝置驅動程式的入門書籍,然後再閱讀本書來理解“為什麼”要以這樣或者那樣的方式來編寫裝置驅動程式。
目錄《深入linux裝置驅動程式核心機制》
第1章 核心模組 1
1.1 核心模組的檔案格式 2
1.2 export_symbol的核心實現 5
1.3 模組的載入過程 8
1.3.1 sys_init_module(第一部分) 9
1.3.2 struct module 9
1.3.3 load_module 13
1.3.4 sys_init_module(第二部分) 49
1.3.5 模組的卸載 54
1.4 本章小結 55
第2章 字元裝置驅動程式 57
2.1 應用程式與裝置驅動程式互動執行個體 58
2.2 struct file_operations 62
2.3 字元裝置的核心抽象 63
2.4 裝置號的構成與分配 65
2.4.1 裝置號的構成 65
2.4.2 裝置號的分配與管理 66
2.5 字元裝置的註冊 71
2.6 裝置檔案節點的產生 74 .2.7 字元裝置檔案的開啟操作 77
2.8 本章小結 85
第3章 分配記憶體 87
3.1 實體記憶體的管理 87
3.1.1 記憶體節點node 87
3.1.2 記憶體地區zone 88
3.1.3 記憶體頁 89
3.2 頁面分配器(page allocator) 90
3.2.1 gfp_mask 91
3.2.2 alloc_pages 95
3.2.3 __get_free_pages 96
3.2.4 get_zeroed_page 97
3.2.5 __get_dma_pages 97
3.3 slab分配器(slab allocator) 98
3.3.1 管理slab的資料結構 99
3.3.2 kmalloc與kzalloc 105
3.3.3 kmem_cache_create與kmem_cache_alloc 108
3.4 記憶體池(mempool) 110
3.5 虛擬記憶體的管理 111
3.5.1 核心虛擬位址空間構成 111
3.5.2 vmalloc與vfree 112
3.5.3 ioremap 115
3.6 per-cpu變數 115
3.6.1 靜態per-cpu變數的聲明與定義 116
3.6.2 靜態per-cpu變數的連結指令碼 117
3.6.3 setup_per_cpu_areas函數 118
3.6.4 使用per-cpu變數 121
3.7 本章小結 125
第4章 互斥與同步 127
4.1 並發的來源 127
4.2 local_irq_enable與local_irq_disable 128
4.3 自旋鎖 129
4.3.1 spin_lock 130
4.3.2 spin_lock的變體 133
4.3.3 單一處理器上的spin_lock函數 136
4.3.4 讀取者與寫入者自旋鎖rwlock 137
4.4 訊號量(semaphore) 141
4.4.1 訊號量的定義與初始化 141
4.4.2 down操作 142
4.4.3 up操作 145
4.4.4 讀取者與寫入者訊號量rwsem 146
4.5 互斥鎖mutex 148
4.5.1 互斥鎖的定義與初始化 148
4.5.2 互斥鎖的down操作 149
4.5.3 互斥鎖的up操作 150
4.6 順序鎖seqlock 152
4.7 rcu 155
4.7.1 讀取者的rcu臨界區 156
4.7.2 寫入者的rcu操作 156
4.7.3 rcu使用的特點 157
4.8 原子變數與位操作 159
4.9 等待隊列 162
4.9.1 等待隊列頭wait_queue_head_t 162
4.9.2 等待隊列的節點 163
4.9.3 等待隊列的應用 164
4.10 完成介面completion 164
4.11 本章小結 168
第5章 中斷處理 169
5.1 中斷的硬體架構 169
5.2 pic與軟體中斷號 170
5.3 通用的中斷處理函數 171
5.4 do_irq函數 172
5.5 struct irq_chip 178
5.6 struct irqaction 179
5.7 irq_set_handler 180
5.8 handle_irq_event 184
5.9 request_irq 186
5.10 中斷處理的irq_thread機制 190
5.11 free_irq 191
5.12 softirq 192
5.13 irq的自動探測 196
5.14 中斷處理常式 200
5.15 中斷共用 201
5.16 本章小結 202
第6章 延遲操作 203
6.1 tasklet 203
6.1.1 tasklet機制初始化 204
6.1.2 提交一個tasklet 205
6.1.3 tasklet_action 209
6.1.4 tasklet的其他動作 212
6.2 工作隊列work queue 214
6.2.1 資料結構 214
6.2.2 create_singlethread_workqueue和create_workqueue 216
6.2.3 工人線程worker_thread 219
6.2.4 destroy_workqueue 221
6.2.5 提交工作節點queue_work 224
6.2.6 核心建立的工作隊列 229
6.3 本章小結 230
第7章 裝置檔案的進階操作 231
7.1 ioctl檔案操作 231
7.1.1 ioctl的系統調用 231
7.1.2 ioctl的命令編碼 235
7.1.3 copy_from_user和copy_to_user 238
7.2 字元裝置的i/o模型 243
7.3 同步阻塞型i/o 244
7.3.1 wait_event_interruptible 244
7.3.2 wake_up_interruptible 246
7.4 同步非阻塞型i/o 250
7.5 非同步阻塞型i/o 251
7.6 非同步非阻塞型i/o 258
7.7 驅動程式的fsync常式 259
7.8 fasync常式 260
7.9 llseek常式 269
7.10 訪問權能 272
7.11 本章小結 273
第8章 時間管理 274
8.1 jiffies 274
8.1.1 時間比較 277
8.1.2 時間轉換 278
8.2 延時操作 279
8.2.1 長延時 280
8.2.2 短延時 285
8.3 核心定時器 286
8.3.1 init_timer 289
8.3.2 add_timer 289
8.3.3 del_timer和del_timer_sync 293
8.4 本章小結 293
第9章 linux裝置驅動模型 295
9.1 sysfs檔案系統 295
9.2 kobject和kset 298
9.2.1 kobject 298
9.2.2 kobject的類型屬性 305
9.2.3 kset 308
9.2.4 熱插拔中的uevent和call_usermodehelper 311
9.2.5 執行個體源碼 320
9.3 匯流排、裝置與驅動 328
9.3.1 匯流排及其註冊 328
9.3.2 匯流排的屬性 335
9.3.3 裝置與驅動的綁定 338
9.3.4 裝置 339
9.3.5 驅動 348
9.4 class 351
9.5 本章小結 355
第10章 記憶體映射與dma 356
10.1 裝置緩衝與裝置記憶體 356
10.2 mmap 356
10.2.1 struct vm_area_struct 357
10.2.2 使用者空間虛擬位址布局 358
10.2.3 mmap系統調用過程 362
10.2.4 驅動程式中mmap方法的實現 368
10.2.5 mmap使用範例 373
10.2.6 munmap 383
10.3 dma 384
10.3.1 核心中的dma層 384
10.3.2 物理地址與匯流排地址 386
10.3.3 dma_set_mask 387
10.3.4 dma映射 388
10.3.5 回彈緩衝區(bounce buffer) 401
10.3.6 dma池 401
10.4 本章小結 405
第11章 塊裝置驅動程式 407
11.1 塊子系統初始化 408
11.2 ramdisk源碼執行個體 410
11.2.1 make_request版本的ram disk源碼 411
11.2.2 request版本的ram disk源碼 416
11.2.3 ramdisk的使用 420
11.3 塊裝置號的註冊與管理 422
11.4 block_device 424
11.5 struct gendisk 425
11.6 struct hd_struct 428
11.7 用alloc_disk分配gendisk對象 428
11.8 向系統添加一個塊裝置add_disk 430
11.9 block_device_operations 439
11.10 塊裝置檔案的開啟 440
11.11 blk_init_queue 448
11.12 blk_queue_make_request 459
11.13 向隊列提交請求 460
11.14 塊裝置的請求處理函數 466
11.15 bio結構 467
11.16 本章小結 472
第12章 網路裝置驅動程式 473
12.1 net_device 475
12.2 網路裝置的註冊 488
12.3 裝置方法 492
12.3.1 裝置初始化 494
12.3.2 裝置介面的開啟與停止 495
12.3.3 資料包的發送 495
12.3.4 網路資料包發送過程中的流控機制 500
12.3.5 傳輸逾時(watchdog timeout) 503
12.3.6 資料包的接收 506
12.4 通訊端緩衝區 510
12.5 中斷處理 518
12.6 napi 520
12.7 本章小結 522