譯者序
序言
前言
致謝
第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函數(shù)8
1.5.2 字符設備開關表8
1.5.3 make_dev函數(shù)和des-troy_dev函數(shù)9
1.6 實例:內存字符設備驅動程序10
1.6.1 echo_write函數(shù)13
1.6.2 echo_read函數(shù)14
1.6.3 echo_modevent函數(shù)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 連續(xù)物理內存管理例程23
2.5 一個簡單的例子24
2.6 本章小結26
第3章設備通信與控制27
3.1 ioctl接口27
3.2 定義ioctl命令29
3.3 實現(xiàn)ioctl30
3.3.1 echo_write函數(shù)34
3.3.2 echo_set_buffer_size函數(shù)35
3.3.3 echo_ioctl函數(shù)36
3.3.4 echo_modevent函數(shù)37
3.3.5 試運行38
3.4 調用ioctl38
3.5 sysctl41
3.6 實現(xiàn)sysctl(第1部分)41
3.7 sysctl上下文管理例程45
3.8 創(chuàng)建動態(tài)的sysctl45
3.8.1 SYSCTL_STATIC_CHILDREN宏48
3.8.2 SYSCTL_CHILDREN宏48
3.9 實現(xiàn)sysctl(第2部分)48
3.9.1 sysctl_set_buffer_size函數(shù)52
3.9.2 試運行53
3.10 本章小結53
第4章線程同步54
4.1 一個簡單的同步問題54
4.2 一個更復雜的同步問題55
4.2.1 race_new函數(shù)59
4.2.2 race_find函數(shù)59
4.2.3 race_destroy函數(shù)60
4.2.4 race_ioctl函數(shù)60
4.2.5 race_modevent函數(shù)61
4.2.6 問題的根源62
4.3 防止競態(tài)條件66
4.4 互斥鎖67
4.4.1 自旋互斥鎖67
4.4.2 休眠互斥鎖67
4.5 互斥鎖管理例程68
4.6 實現(xiàn)互斥鎖70
4.6.1 race_modevent函數(shù)73
4.6.2 試運行74
4.7 共享/獨占鎖75
4.8 共享/獨占鎖管理例程75
4.9 實現(xiàn)共享/獨占鎖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章延遲執(zhí)行86
5.1 主動上下文切換/休眠86
5.2 實現(xiàn)休眠與條件變量88
5.2.1 sleep_modevent函數(shù)92
5.2.2 load函數(shù)92
5.2.3 sleep_thread函數(shù)93
5.2.4 sysctl_debug_sleep_test函數(shù)94
5.2.5 unload函數(shù)95
5.2.6 試運行96
5.3 內核事件處理器96
5.4 callout98
5.5 callout和競態(tài)條件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函數(shù)107
6.2.2 nmdm_clone函數(shù)108
6.2.3 nmdm_alloc函數(shù)110
6.2.4 nmdm_outwakeup函數(shù)111
6.2.5 nmdm_task_tty函數(shù)112
6.2.6 nmdm_inwakeup函數(shù)113
6.2.7 nmdm_modem函數(shù)114
6.2.8 nmdm_param函數(shù)115
6.2.9 nmdm_timeout函數(shù)116
6.2.10 bits_per_char函數(shù)117
6.2.11 試運行118
6.3 本章小結118
第7章Newbus和資源分配119
7.1 自動配置與Newbus驅動程序119
7.1.1 device_foo函數(shù)119
7.1.2 設備方法表121
7.1.3 DRIVER_MO-DULE宏121
7.2 驅動程序示例122
7.2.1 foo_pci_probe函數(shù)125
7.2.2 foo_pci_attach函數(shù)126
7.2.3 d_foo函數(shù)127
7.2.4 foo_pci_detach函數(shù)127
7.2.5 試運行128
7.3 硬件資源管理128
7.4 本章小結130
第8章中斷處理131
8.1 注冊中斷處理程序131
8.2 FreeBSD中的中斷處理程序132
8.3 實現(xiàn)中斷處理程序133
8.3.1 pint_identify函數(shù)138
8.3.2 pint_probe函數(shù)138
8.3.3 pint_attach函數(shù)139
8.3.4 pint_detach函數(shù)140
8.3.5 pint_open函數(shù)140
8.3.6 pint_close函數(shù)142
8.3.7 pint_write函數(shù)142
8.3.8 pint_read函數(shù)143
8.3.9 pint_intr函數(shù)144
8.3.10 試運行144
8.4 生成并口中斷145
8.5 本章小結146
第9章案例研究:并口打印機驅動程序147
9.1 代碼分析147
9.1.1 lpt_identify函數(shù)152
9.1.2 lpt_probe函數(shù)152
9.1.3 lpt_detect函數(shù)152
9.1.4 lpt_port_test函數(shù)153
9.1.5 lpt_attach函數(shù)154
9.1.6 lpt_detach函數(shù)156
9.1.7 lpt_open函數(shù)157
9.1.8 lpt_read函數(shù)159
9.1.9 lpt_write函數(shù)161
9.1.10 lpt_intr函數(shù)163
9.1.11 lpt_timeout函數(shù)164
9.1.12 lpt_push_bytes函數(shù)165
9.1.13 lpt_close函數(shù)166
9.1.14 lpt_ioctl函數(shù)167
9.1.15 lpt_request_ppbus函數(shù)169
9.1.16 lpt_release_ppbus函數(shù)169
9.2 本章小結170
第10章管理與使用資源171
10.1 輸入輸出端口與輸入輸出內存171
10.1.1 從輸入輸出端口和輸入輸出內存讀取數(shù)據(jù)171
10.1.2 向輸入輸出端口和輸入輸出內存寫入數(shù)據(jù)173
10.1.3 流操作175
10.2 內存柵欄178
10.3 讓一切配合起來179
10.3.1 led_identify函數(shù)183
10.3.2 led_probe函數(shù)184
10.3.3 led_attach函數(shù)184
10.3.4 led_detach函數(shù)185
10.3.5 led_open函數(shù)186
10.3.6 led_close函數(shù)186
10.3.7 led_read函數(shù)187
10.3.8 led_write函數(shù)188
10.4 本章小結188
第11章案例研究:智能平臺管理接口驅動189
11.1 代碼分析189
11.1.1 ipmi_pci_probe函數(shù)191
11.1.2 ipmi_pci_match函數(shù)192
11.1.3 ipmi_pci_attach函數(shù)192
11.1.4 ipmi2_pci_probe函數(shù)195
11.1.5 ipmi2_pci_attach函數(shù)195
11.2 本章小結197
第12章直接內存訪問198
12.1 實現(xiàn)DMA198
12.1.1 初始化DMA數(shù)據(jù)傳輸200
12.1.2 取消DMA201
12.2 創(chuàng)建DMA標簽201
12.3 銷毀DMA標簽203
12.4 DMA映射管理例程(第1部分)204
12.5 將(DMA)緩沖區(qū)載入DMA映射204
12.5.1 bus_dma_segment結構205
12.5.2 bus_dmamap_load函數(shù)205
12.5.3 bus_dmamap_load_mbuf函數(shù)206
12.5.4 bus_dmamap_load_mbuf_sg函數(shù)207
12.5.5 bus_dmamap_load_uio函數(shù)207
12.5.6 bus_dmamap_unload函數(shù)207
12.6 DMA映射管理例程(第2部分)207
12.7 一個簡單的例子208
12.8 同步DMA緩沖區(qū)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 驅動程序私有數(shù)據(jù)字段213
13.2 disk結構管理例程214
13.3 塊輸入輸出結構214
13.4 塊輸入輸出隊列216
13.5 讓一切配合起來217
13.5.1 at45d_attach函數(shù)222
13.5.2 at45d_delayed_attach函數(shù)223
13.5.3 at45d_get_info函數(shù)224
13.5.4 at45d_wait_for_device_ready函數(shù)224
13.5.5 at45d_get_status函數(shù)225
13.5.6 at45d_strategy函數(shù)225
13.5.7 at45d_task函數(shù)226
13.6 塊輸入輸出完成例程228
13.7 本章小結228
第14章通用存取方法229
14.1 CAM是如何工作的230
14.2 一個(略為)簡單的例子231
14.2.1 mfip_attach函數(shù)239
14.2.2 mfip_detach函數(shù)240
14.2.3 mfip_action函數(shù)240
14.2.4 mfip_poll函數(shù)243
14.2.5 mfip_start函數(shù)243
14.2.6 mfip_done函數(shù)245
14.3 SIM注冊例程246
14.3.1 cam_simq_alloc函數(shù)247
14.3.2 cam_sim_alloc函數(shù)247
14.3.3 xpt_bus_register函數(shù)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函數(shù)276
15.7.2 ulpt_attach函數(shù)276
15.7.3 ulpt_detach函數(shù)278
15.7.4 ulpt_open函數(shù)279
15.7.5 ulpt_reset函數(shù)279
15.7.6 unlpt_open函數(shù)280
15.7.7 ulpt_close函數(shù)281
15.7.8 ulpt_ioctl函數(shù)282
15.7.9 ulpt_watchdog函數(shù)282
15.7.10 ulpt_start_read函數(shù)282
15.7.11 ulpt_stop_read函數(shù)283
15.7.12 ulpt_start_write函數(shù)283
15.7.13 ulpt_stop_write函數(shù)284
15.7.14 ulpt_write_callback函數(shù)284
15.7.15 ulpt_read_callback函數(shù)285
15.7.16 ulpt_status_callback函數(shù)287
15.8 本章小結288
第16章網絡驅動程序I:數(shù)據(jù)結構289
16.1 網絡接口結構289
16.2 網絡接口結構管理例程292
16.2.1 ether_ifattach函數(shù)293
16.2.2 ether_ifdetach函數(shù)294
16.3 網絡接口媒體結構295
16.4 網絡接口媒體結構管理例程295
16.5 Hello, world297
16.6 mbuf結構300
16.7 消息驅動中斷300
16.8 實現(xiàn)MSI301
16.9 MSI管理例程303
16.10 本章小結304
第17章網絡驅動程序II:包的接收與傳輸305
17.1 數(shù)據(jù)包接收305
17.1.1 em_rxeof函數(shù)305
17.1.2 em_handle_rx函數(shù)309
17.2 數(shù)據(jù)包發(fā)送310
17.2.1 em_start_locked函數(shù)310
17.2.2 em_txeof函數(shù)311
17.3 后數(shù)據(jù)包發(fā)送314
17.4 本章小結315
參考文獻316