譯者序
序言
前言
緻謝
第1章構建並運行模塊1
1.1 設備驅動程序的類型1
1.2 可加載內核模塊2
1.2.1 模塊事件處理程序2
1.2.2 DECLARE_MO-DULE宏3
1.3 Hello, world!5
1.4 編譯與加載6
1.5 字符設備驅動程序7
1.5.1 d_foo函數8
1.5.2 字符設備開關錶8
1.5.3 make_dev函數和des-troy_dev函數9
1.6 實例:內存字符設備驅動程序10
1.6.1 echo_write函數13
1.6.2 echo_read函數14
1.6.3 echo_modevent函數14
1.6.4 DEV_MODULE宏15
1.6.5 試運行16
1.7 塊設備驅動程序消失瞭16
1.8 本章小結17
第2章分配內存18
2.1 內存管理例程18
2.2 malloc_type結構19
2.2.1 MALLOC_DE-FINE宏20
2.2.2 MALLOC_DE-CLARE宏20
2.3 讓一切配閤起來21
2.4 連續物理內存管理例程23
2.5 一個簡單的例子24
2.6 本章小結26
第3章設備通信與控製27
3.1 ioctl接口27
3.2 定義ioctl命令29
3.3 實現ioctl30
3.3.1 echo_write函數34
3.3.2 echo_set_buffer_size函數35
3.3.3 echo_ioctl函數36
3.3.4 echo_modevent函數37
3.3.5 試運行38
3.4 調用ioctl38
3.5 sysctl41
3.6 實現sysctl(第1部分)41
3.7 sysctl上下文管理例程45
3.8 創建動態的sysctl45
3.8.1 SYSCTL_STATIC_CHILDREN宏48
3.8.2 SYSCTL_CHILDREN宏48
3.9 實現sysctl(第2部分)48
3.9.1 sysctl_set_buffer_size函數52
3.9.2 試運行53
3.10 本章小結53
第4章綫程同步54
4.1 一個簡單的同步問題54
4.2 一個更復雜的同步問題55
4.2.1 race_new函數59
4.2.2 race_find函數59
4.2.3 race_destroy函數60
4.2.4 race_ioctl函數60
4.2.5 race_modevent函數61
4.2.6 問題的根源62
4.3 防止競態條件66
4.4 互斥鎖67
4.4.1 自鏇互斥鎖67
4.4.2 休眠互斥鎖67
4.5 互斥鎖管理例程68
4.6 實現互斥鎖70
4.6.1 race_modevent函數73
4.6.2 試運行74
4.7 共享/獨占鎖75
4.8 共享/獨占鎖管理例程75
4.9 實現共享/獨占鎖77
4.10 讀者/寫者鎖81
4.11 讀者/寫者鎖管理例程81
4.12 條件變量83
4.13 條件變量管理例程83
4.14 一般性原則85
4.14.1 避免在獨占鎖上遞歸85
4.14.2 避免長時間占用獨占鎖85
4.15 本章小結85
第5章延遲執行86
5.1 主動上下文切換/休眠86
5.2 實現休眠與條件變量88
5.2.1 sleep_modevent函數92
5.2.2 load函數92
5.2.3 sleep_thread函數93
5.2.4 sysctl_debug_sleep_test函數94
5.2.5 unload函數95
5.2.6 試運行96
5.3 內核事件處理器96
5.4 callout98
5.5 callout和競態條件100
5.6 任務隊列101
5.6.1 全局任務隊列101
5.6.2 任務隊列管理例程102
5.7 本章小結103
第6章案例研究:虛擬空調製解調器104
6.1 前期基礎104
6.2 代碼分析105
6.2.1 nmdm_modevent函數107
6.2.2 nmdm_clone函數108
6.2.3 nmdm_alloc函數110
6.2.4 nmdm_outwakeup函數111
6.2.5 nmdm_task_tty函數112
6.2.6 nmdm_inwakeup函數113
6.2.7 nmdm_modem函數114
6.2.8 nmdm_param函數115
6.2.9 nmdm_timeout函數116
6.2.10 bits_per_char函數117
6.2.11 試運行118
6.3 本章小結118
第7章Newbus和資源分配119
7.1 自動配置與Newbus驅動程序119
7.1.1 device_foo函數119
7.1.2 設備方法錶121
7.1.3 DRIVER_MO-DULE宏121
7.2 驅動程序示例122
7.2.1 foo_pci_probe函數125
7.2.2 foo_pci_attach函數126
7.2.3 d_foo函數127
7.2.4 foo_pci_detach函數127
7.2.5 試運行128
7.3 硬件資源管理128
7.4 本章小結130
第8章中斷處理131
8.1 注冊中斷處理程序131
8.2 FreeBSD中的中斷處理程序132
8.3 實現中斷處理程序133
8.3.1 pint_identify函數138
8.3.2 pint_probe函數138
8.3.3 pint_attach函數139
8.3.4 pint_detach函數140
8.3.5 pint_open函數140
8.3.6 pint_close函數142
8.3.7 pint_write函數142
8.3.8 pint_read函數143
8.3.9 pint_intr函數144
8.3.10 試運行144
8.4 生成並口中斷145
8.5 本章小結146
第9章案例研究:並口打印機驅動程序147
9.1 代碼分析147
9.1.1 lpt_identify函數152
9.1.2 lpt_probe函數152
9.1.3 lpt_detect函數152
9.1.4 lpt_port_test函數153
9.1.5 lpt_attach函數154
9.1.6 lpt_detach函數156
9.1.7 lpt_open函數157
9.1.8 lpt_read函數159
9.1.9 lpt_write函數161
9.1.10 lpt_intr函數163
9.1.11 lpt_timeout函數164
9.1.12 lpt_push_bytes函數165
9.1.13 lpt_close函數166
9.1.14 lpt_ioctl函數167
9.1.15 lpt_request_ppbus函數169
9.1.16 lpt_release_ppbus函數169
9.2 本章小結170
第10章管理與使用資源171
10.1 輸入輸齣端口與輸入輸齣內存171
10.1.1 從輸入輸齣端口和輸入輸齣內存讀取數據171
10.1.2 嚮輸入輸齣端口和輸入輸齣內存寫入數據173
10.1.3 流操作175
10.2 內存柵欄178
10.3 讓一切配閤起來179
10.3.1 led_identify函數183
10.3.2 led_probe函數184
10.3.3 led_attach函數184
10.3.4 led_detach函數185
10.3.5 led_open函數186
10.3.6 led_close函數186
10.3.7 led_read函數187
10.3.8 led_write函數188
10.4 本章小結188
第11章案例研究:智能平颱管理接口驅動189
11.1 代碼分析189
11.1.1 ipmi_pci_probe函數191
11.1.2 ipmi_pci_match函數192
11.1.3 ipmi_pci_attach函數192
11.1.4 ipmi2_pci_probe函數195
11.1.5 ipmi2_pci_attach函數195
11.2 本章小結197
第12章直接內存訪問198
12.1 實現DMA198
12.1.1 初始化DMA數據傳輸200
12.1.2 取消DMA201
12.2 創建DMA標簽201
12.3 銷毀DMA標簽203
12.4 DMA映射管理例程(第1部分)204
12.5 將(DMA)緩衝區載入DMA映射204
12.5.1 bus_dma_segment結構205
12.5.2 bus_dmamap_load函數205
12.5.3 bus_dmamap_load_mbuf函數206
12.5.4 bus_dmamap_load_mbuf_sg函數207
12.5.5 bus_dmamap_load_uio函數207
12.5.6 bus_dmamap_unload函數207
12.6 DMA映射管理例程(第2部分)207
12.7 一個簡單的例子208
12.8 同步DMA緩衝區210
12.9 本章小結210
第13章存儲驅動211
13.1 disk結構211
13.1.1 描述性字段212
13.1.2 存儲設備方法字段212
13.1.3 必需的媒體特性字段213
13.1.4 可選的媒體特性字段213
13.1.5 驅動程序私有數據字段213
13.2 disk結構管理例程214
13.3 塊輸入輸齣結構214
13.4 塊輸入輸齣隊列216
13.5 讓一切配閤起來217
13.5.1 at45d_attach函數222
13.5.2 at45d_delayed_attach函數223
13.5.3 at45d_get_info函數224
13.5.4 at45d_wait_for_device_ready函數224
13.5.5 at45d_get_status函數225
13.5.6 at45d_strategy函數225
13.5.7 at45d_task函數226
13.6 塊輸入輸齣完成例程228
13.7 本章小結228
第14章通用存取方法229
14.1 CAM是如何工作的230
14.2 一個(略為)簡單的例子231
14.2.1 mfip_attach函數239
14.2.2 mfip_detach函數240
14.2.3 mfip_action函數240
14.2.4 mfip_poll函數243
14.2.5 mfip_start函數243
14.2.6 mfip_done函數245
14.3 SIM注冊例程246
14.3.1 cam_simq_alloc函數247
14.3.2 cam_sim_alloc函數247
14.3.3 xpt_bus_register函數248
14.4 動作例程248
14.4.1 XPT_PATH_INQ常量248
14.4.2 XPT_RESET_BUS常量250
14.4.3 XPT_GET_TRAN_SETTINGS常量251
14.4.4 XPT_SET_TRAN_SETTINGS常量254
14.4.5 XPT_SCSI_IO常量255
14.4.6 XPT_RESET_DEV常量260
14.5 本章小結261
第15章USB驅動262
15.1 關於USB設備262
15.2 關於USB設備的更多信息263
15.3 USB配置結構264
15.3.1 必需的字段265
15.3.2 可選的字段265
15.3.3 USB傳送標誌266
15.4 USB傳輸(針對FreeBSD)267
15.5 USB配置結構管理例程269
15.6 USB方法結構270
15.7 讓一切配閤起來271
15.7.1 ulpt_probe函數276
15.7.2 ulpt_attach函數276
15.7.3 ulpt_detach函數278
15.7.4 ulpt_open函數279
15.7.5 ulpt_reset函數279
15.7.6 unlpt_open函數280
15.7.7 ulpt_close函數281
15.7.8 ulpt_ioctl函數282
15.7.9 ulpt_watchdog函數282
15.7.10 ulpt_start_read函數282
15.7.11 ulpt_stop_read函數283
15.7.12 ulpt_start_write函數283
15.7.13 ulpt_stop_write函數284
15.7.14 ulpt_write_callback函數284
15.7.15 ulpt_read_callback函數285
15.7.16 ulpt_status_callback函數287
15.8 本章小結288
第16章網絡驅動程序I:數據結構289
16.1 網絡接口結構289
16.2 網絡接口結構管理例程292
16.2.1 ether_ifattach函數293
16.2.2 ether_ifdetach函數294
16.3 網絡接口媒體結構295
16.4 網絡接口媒體結構管理例程295
16.5 Hello, world297
16.6 mbuf結構300
16.7 消息驅動中斷300
16.8 實現MSI301
16.9 MSI管理例程303
16.10 本章小結304
第17章網絡驅動程序II:包的接收與傳輸305
17.1 數據包接收305
17.1.1 em_rxeof函數305
17.1.2 em_handle_rx函數309
17.2 數據包發送310
17.2.1 em_start_locked函數310
17.2.2 em_txeof函數311
17.3 後數據包發送314
17.4 本章小結315
參考文獻316
· · · · · · (
收起)