第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
· · · · · · (
收起)