注重体验与质量的电子书资源下载网站
分类于: 计算机基础 职场办公
简介
深入理解FreeBSD设备驱动程序开发 豆 0.0分
资源最后更新于 2020-09-10 15:15:47
作者:Joseph Kong
译者:陈毅东
出版社:机械工业出版社华章公司
出版日期:2013-01
ISBN:9787111411574
文件格式: pdf
标签: FreeBSD 驱动 黑客 设备驱动 计算机科学 计算机 程序设计 软件开发
简介· · · · · ·
本书是FreeBSD设备驱动开发领域的经典著作,由具有20余年从业经验的资深FreeBSD设备驱动编程专家撰写,FreeBSD内核开发专家鼎力推荐!本书从宏观上讲解了FreeBSD设备驱动程序的框架结构,从微观上讲解了FreeBSD与驱动程序相关的各个接口和模块的作用及工作原理,而且还从源码实现的角度分析了设备驱动程序的内核机制。本书面向的读者是驱动开发程序员,更注重实践而非理论,通过真实的驱动开发案例为编写健壮高效的驱动程序提供优秀指导。
本书共17章:第1章介绍了设备驱动程序的类型、可加载内核模块的编译与加载;第2章介绍了内核的分配与管理;第3章讲解了在用户空间下如何控制设备驱动程序并与之通信;第4章讨论了与多线程编程和并发执行有关的问题和解决方案;第5章解析了延迟代码执行和异步代码执行等机制并解释了这些机制的深层原因;第6章介绍了虚拟空调制解调...
目录
译者序
序言
前言
致谢
第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
序言
前言
致谢
第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