第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 实现ioctl 30
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 调用ioctl 38
3.5 sysctl 41
3.6 实现sysctl(第1部分) 41
3.7 sysctl上下文管理例程 45
3.8 创建动态的sysctl 45
3.8.1 SYSCTL_STATICC_CHILDREN宏 48
3.8.2 SYSCTL_CHILD-REN宏 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 callout 98
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 ipmi2_pci_attach函数 195
11.2 本章小结 197
第12章 直接内存访问 198
12.1 实现DMA 198
12.1.1 初始化DMA数据传输 200
12.1.2 取消DMA 201
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章 网络驱动程序Ⅰ:数据结构 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,world 297
16.6 mbuf结构 300
16.7 消息驱动中断 300
16.8 实现MSI 301
16.9 MSI管理例程 303
16.10 本章小结 304
第17章 网络驱动程序Ⅱ:包的接收与传输 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