linux设备驱动程序(第三版)
Linux 设备驱动 Edition 3
By Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman.................................1
感谢..........................................................................................................................................1
第 1 章第一章设备驱动简介..............................................................................................12
1.1. 驱动程序的角色..............................................................................................................13
1.2. 划分内核..........................................................................................................................15
1.2.1. 可加载模块...........................................................................................................16
1.3. 设备和模块的分类..........................................................................................................18
1.4. 安全问题..........................................................................................................................20
1.5. 版本编号..........................................................................................................................22
1.6. 版权条款..........................................................................................................................24
1.7. 加入内核开发社团..........................................................................................................25
1.8. 本书的内容......................................................................................................................26
第 2 章建立和运行模块........................................................................................................28
2.1. 设置你的测试系统..........................................................................................................28
2.2. Hello World 模块............................................................................................................30
2.3. 内核模块相比于应用程序..............................................................................................32
2.3.1. 用户空间和内核空间...........................................................................................33
2.3.2. 内核的并发...........................................................................................................34
2.3.3. 当前进程...............................................................................................................35
2.3.4. 几个别的细节.......................................................................................................35
2.4. 编译和加载......................................................................................................................37
2.4.1. 编译模块...............................................................................................................37
2.4.2. 加载和卸载模块...................................................................................................39
2.4.3. 版本依赖...............................................................................................................40
2.4.4. 平台依赖性...........................................................................................................41
2.5. 内核符号表......................................................................................................................43
2.6. 预备知识..........................................................................................................................45
2.7. 初始化和关停..................................................................................................................47
2.7.1. 清理函数...............................................................................................................48
2.7.2. 初始化中的错误处理...........................................................................................48
2.7.3. 模块加载竞争.......................................................................................................51
2.8. 模块参数..........................................................................................................................52
2.9. 在用户空间做..................................................................................................................54
2.10. 快速参考........................................................................................................................56
第 3 章字符驱动....................................................................................................................59
3.1. scull 的设计....................................................................................................................60
3.2. 主次编号..........................................................................................................................62
3.2.1. 设备编号的内部表示...........................................................................................62
3.2.2. 分配和释放设备编号...........................................................................................63
3.2.3. 主编号的动态分配...............................................................................................64
3.3. 一些重要数据结构..........................................................................................................68
3.3.1. 文件操作...............................................................................................................68
3.3.2. 文件结构...............................................................................................................72
3.3.3. inode 结构............................................................................................................73
3.4. 字符设备注册..................................................................................................................75
3.4.1. scull 中的设备注册.............................................................................................76
3.4.2. 老方法...................................................................................................................76
3.5. open 和 release...............................................................................................................78
3.5.1. open 方法.............................................................................................................78
3.5.2. release 方法..........................................................................................................79
3.6. scull 的内存使用............................................................................................................81
3.7. 读和写..............................................................................................................................84
3.7.1. read 方法..............................................................................................................86
3.7.2. write 方法............................................................................................................88
3.7.3. readv 和 writev....................................................................................................90
3.8. 使用新设备......................................................................................................................92
3.9. 快速参考..........................................................................................................................93
第 4 章调试技术....................................................................................................................95
4.1. 内核中的调试支持..........................................................................................................95
4.2. 用打印调试......................................................................................................................99
4.2.1. printk .....................................................................................................................99
4.2.2. 重定向控制台消息.............................................................................................101
4.2.3. 消息是如何记录的.............................................................................................101
4.2.4. 打开和关闭消息.................................................................................................102
4.2.5. 速率限制.............................................................................................................104
4.2.6. 打印设备编号.....................................................................................................105
4.3. 用查询来调试................................................................................................................106
4.3.1. 使用 /proc 文件系统.........................................................................................106
4.3.2. ioctl 方法............................................................................................................114
4.5. 调试系统故障................................................................................................................116
4.5.1. oops 消息...........................................................................................................116
4.5.2. 系统挂起.............................................................................................................120
4.6. 调试器和相关工具........................................................................................................123
4.6.1. 使用 gdb.............................................................................................................123
4.6.2. kdb 内核调试器.................................................................................................125
4.6.3. kgdb 补丁...........................................................................................................128
4.6.4. 用户模式 Linux 移植.......................................................................................128
4.6.5. Linux 追踪工具.................................................................................................129
4.6.6. 动态探针.............................................................................................................129
第 5 章并发和竞争情况......................................................................................................130
5.1. scull 中的缺陷..............................................................................................................131
5.2. 并发和它的管理............................................................................................................132
5.3. 旗标和互斥体................................................................................................................134
5.3.1. Linux 旗标实现.................................................................................................135
5.3.2. 在 scull 中使用旗标.........................................................................................136
5.3.3. 读者/写者旗标....................................................................................................138
5.4. Completions 机制.........................................................................................................140
5.5. 自旋锁............................................................................................................................143
5.5.1. 自旋锁 API 简介..............................................................................................143
5.5.2. 自旋锁和原子上下文.........................................................................................144
5.5.3. 自旋锁函数.........................................................................................................145
5.5.4. 读者/写者自旋锁................................................................................................146
5.6. 锁陷阱............................................................................................................................148
5.6.1. 模糊的规则.........................................................................................................148
5.6.2. 加锁顺序规则.....................................................................................................148
5.6.3. 细 -粗- 粒度加锁..............................................................................................149
5.7. 加锁的各种选择............................................................................................................151
5.7.1. 不加锁算法.........................................................................................................151
5.7.2. 原子变量.............................................................................................................152
5.7.3. 位操作.................................................................................................................153
5.7.4. seqlock 锁..........................................................................................................155
5.7.5. 读取-拷贝-更新..................................................................................................156
5.8. 快速参考........................................................................................................................159
第 6 章高级字符驱动操作..................................................................................................164
6.1. ioctl 接口......................................................................................................................165
6.1.1. 选择 ioctl 命令..................................................................................................166
6.1.2. 返回值.................................................................................................................169
6.1.3. 预定义的命令.....................................................................................................169
6.1.4. 使用 ioctl 参数..................................................................................................170
6.1.5. 兼容性和受限操作.............................................................................................172
6.1.6. ioctl 命令的实现................................................................................................174
6.1.7. 不用 ioctl 的设备控制......................................................................................176
6.2. 阻塞 I/O ........................................................................................................................178
6.2.1. 睡眠的介绍.........................................................................................................178
6.2.2. 简单睡眠.............................................................................................................179
6.2.3. 阻塞和非阻塞操作.............................................................................................181
6.2.4. 一个阻塞 I/O 的例子.......................................................................................182
6.2.5. 高级睡眠.............................................................................................................185
6.2.6. 测试 scullpipe 驱动..........................................................................................192
6.3. poll 和 select ................................................................................................................194
6.3.1. 与 read 和 write 的交互..................................................................................197
6.3.2. 底层的数据结构.................................................................................................198
6.4. 异步通知........................................................................................................................200
6.4.1. 驱动的观点.........................................................................................................201
6.5. 移位一个设备................................................................................................................202
6.5.1. llseek 实现.........................................................................................................202
6.6. 在一个设备文件上的存取控制....................................................................................204
6.6.1. 单 open 设备.....................................................................................................204
6.6.2. 一次对一个用户限制存取.................................................................................205
6.6.3. 阻塞 open 作为对 EBUSY 的替代................................................................207
6.6.4. 在 open 时复制设备.........................................................................................208
6.7. 快速参考........................................................................................................................212
第 7 章时间, 延时, 和延后工作........................................................................................216
7.1. 测量时间流失................................................................................................................216
7.1.1. 使用 jiffies 计数器............................................................................................217
7.1.2. 处理器特定的寄存器.........................................................................................219
7.2. 获知当前时间................................................................................................................222
7.3. 延后执行........................................................................................................................225
7.3.1. 长延时.................................................................................................................225
7.3.2. 短延时.................................................................................................................230
7.4. 内核定时器....................................................................................................................232
7.4.1. 定时器 API ........................................................................................................233
7.4.2. 内核定时器的实现.............................................................................................236
7.5. Tasklets 机制.................................................................................................................238
7.6. 工作队列........................................................................................................................241
7.6.1. 共享队列.............................................................................................................243
7.7. 快速参考........................................................................................................................246
7.7.1. 时间管理.............................................................................................................246
7.7.2. 延迟.....................................................................................................................247
7.7.3. 内核定时器.........................................................................................................248
7.7.4. Tasklets 机制......................................................................................................249
7.7.5. 工作队列.............................................................................................................249
第 8 章分配内存..................................................................................................................251
8.1. kmalloc 的真实故事.....................................................................................................251
8.1.1. flags 参数...........................................................................................................251
8.1.2. size 参数..........................................................................................................254
8.2. 后备缓存........................................................................................................................256
8.2.1. 一个基于 Slab 缓存的 scull: scullc.................................................................258
8.2.2. 内存池.................................................................................................................259
8.3. get_free_page 和其友...................................................................................................261
8.3.1. 一个使用整页的 scull: scullp............................................................................262
8.3.2. alloc_pages 接口................................................................................................263
8.3.3. vmalloc 和其友................................................................................................264
8.3.4. 一个使用虚拟地址的 scull : scullv...................................................................266
8.4. 每-CPU 的变量.............................................................................................................268
8.5. 获得大量缓冲................................................................................................................271
8.5.1. 在启动时获得专用的缓冲.................................................................................271
8.6. 快速参考........................................................................................................................273
第 9 章与硬件通讯..............................................................................................................277
9.1. I/O 端口和 I/O 内存...................................................................................................278
9.1.1. I/O 寄存器和常规内存.....................................................................................278
9.2. 使用 I/O 端口 ..............................................................................................................282
9.2.1. I/O 端口分配.....................................................................................................282
9.2.2. 操作 I/O 端口...................................................................................................282
9.2.3. 从用户空间的 I/O 存取...................................................................................283
9.2.4. 字串操作.............................................................................................................284
9.2.5. 暂停 I/O .............................................................................................................285
9.2.6. 平台依赖性.........................................................................................................285
9.3. 一个 I/O 端口例子 ......................................................................................................289
9.3.1. 并口纵览.............................................................................................................289
9.3.2. 一个例子驱动.....................................................................................................290
9.4. 使用 I/O 内存 ..............................................................................................................293
9.4.1. I/O 内存分配和映射.........................................................................................293
9.4.2. 存取 I/O 内存...................................................................................................294
9.4.3. 作为 I/O 内存的端口.......................................................................................296
9.4.4. 重用 short 为 I/O 内存...................................................................................297
9.4.5. 在 1 MB 之下的 ISA 内存.............................................................................297
9.5. 快速参考........................................................................................................................299
第 10 章 中断处理................................................................................................................302
10.1. 准备并口......................................................................................................................303
10.2. 安装一个中断处理......................................................................................................304
10.2.1. /proc 接口........................................................................................................307
10.2.2. 自动检测 IRQ 号............................................................................................308
10.2.3. 快速和慢速处理...............................................................................................313
10.2.4. 实现一个处理...................................................................................................314
10.2.5. 处理者的参数和返回值...................................................................................317
10.2.6. 使能和禁止中断...............................................................................................318
10.3. 前和后半部..................................................................................................................321
10.3.1. Tasklet 实现.....................................................................................................321
10.3.2. 工作队列...........................................................................................................323
10.4. 中断共享......................................................................................................................325
10.4.1. 安装一个共享的处理者...................................................................................325
10.4.2. 运行处理者.......................................................................................................326
10.4.3. /proc 接口和共享中断.....................................................................................327
10.5. 中断驱动 I/O ..............................................................................................................329
10.5.1. 一个写缓存例子...............................................................................................329
10.6. 快速参考......................................................................................................................334
第 11 章 内核中的数据类型................................................................................................336
11.1. 标准 C 类型的使用...................................................................................................336
11.2. 安排一个明确大小给数据项......................................................................................339
11.3. 接口特定的类型..........................................................................................................341
11.4. 其他移植性问题..........................................................................................................343
11.4.1. 时间间隔...........................................................................................................343
11.4.2. 页大小...............................................................................................................343
11.4.3. 字节序...............................................................................................................344
11.4.4. 数据对齐...........................................................................................................344
11.4.5. 指针和错误值...................................................................................................346
11.5. 链表..............................................................................................................................347
11.6. 快速参考......................................................................................................................352
第 12 章 PCI 驱动...............................................................................................................354
12.1. PCI 接口.....................................................................................................................354
12.1.1. PCI 寻址..........................................................................................................355
12.1.2. 启动时间...........................................................................................................358
12.1.3. 配置寄存器和初始化.......................................................................................359
12.1.4. MODULEDEVICETABLE 宏.........................................................................362
12.1.5. 注册一个 PCI 驱动.........................................................................................363
12.1.6. 老式 PCI 探测.................................................................................................365
12.1.7. 使能 PCI 设备.................................................................................................366
12.1.8. 存取配置空间...................................................................................................366
12.1.9. 存取 I/O 和内存空间.....................................................................................368
12.1.10. PCI 中断........................................................................................................369
12.1.11. 硬件抽象.........................................................................................................370
12.2. 回顾: ISA .....................................................................................................................372
12.2.1. 硬件资源...........................................................................................................372
12.2.2. ISA 编程..........................................................................................................373
12.2.3. 即插即用规范...................................................................................................373
12.3. PC/104 和 PC/104+ ...................................................................................................375
12.4. 其他的 PC 总线.........................................................................................................376
12.4.1. MCA 总线........................................................................................................376
12.4.2. EISA 总线........................................................................................................376
12.4.3. VLB 总线.........................................................................................................376
12.5. SBus .............................................................................................................................378
12.6. NuBus 总线.................................................................................................................379
12.7. 外部总线......................................................................................................................380
12.8. 快速参考......................................................................................................................381
第 13 章 USB 驱动..............................................................................................................383
13.1. USB 设备基础知识....................................................................................................385
13.1.1. 端点...................................................................................................................385
13.1.2. 接口...................................................................................................................387
13.1.3. 配置...................................................................................................................388
13.2. USB 和 sysfs..............................................................................................................389
13.3. USB 的 Urbs ..............................................................................................................392
13.3.1. 结构 struct urb..................................................................................................392
13.3.2. 创建和销毁 urb ...............................................................................................399
13.3.3. 提交 urb ...........................................................................................................402
13.3.4. 完成 urb: 完成回调处理者............................................................................403
13.3.5. 取消 urb ...........................................................................................................403
13.4. 编写一个 USB 驱动..................................................................................................405
13.4.1. 驱动支持什么设备...........................................................................................405
13.4.2. 注册一个 USB 驱动.......................................................................................407
13.4.3. 提交和控制一个 urb .......................................................................................414
13.5. 无 urb 的 USB 传送.................................................................................................417
13.5.1. usb_bulk_msg 接口.........................................................................................417
13.5.2. usb_control_msg 接口.....................................................................................418
13.5.3. 使用 USB 数据函数.......................................................................................420
13.6. 快速参考......................................................................................................................422
第 14 章 Linux 设备模型....................................................................................................424
14.1. Kobjects, Ksets 和 Subsystems..................................................................................426
14.1.1. Kobject 基础....................................................................................................427
14.1.2. kobject 层次, kset, 和子系统..........................................................................431
14.2. 低级 sysfs 操作..........................................................................................................435
14.2.1. 缺省属性...........................................................................................................435
14.2.2. 非缺省属性.......................................................................................................437
14.2.3. 二进制属性.......................................................................................................437
14.2.4. 符号连接...........................................................................................................438
14.3. 热插拔事件产生..........................................................................................................440
14.3.1. 热插拔操作.......................................................................................................440
14.4. 总线, 设备, 和驱动....................................................................................................442
14.4.1. 总线...................................................................................................................442
14.4.2. 设备...................................................................................................................446
14.4.3. 设备驱动...........................................................................................................450
14.5. 类.................................................................................................................................454
14.5.1. class_simple 接口............................................................................................454
14.5.2. 完整的类接口...................................................................................................455
14.6. 集成起来......................................................................................................................459
14.6.1. 添加一个设备...................................................................................................459
14.6.2. 去除一个设备...................................................................................................463
14.6.3. 添加一个驱动...................................................................................................463
14.6.4. 去除一个驱动...................................................................................................464
14.7. 热插拔..........................................................................................................................465
14.7.1. 动态设备...........................................................................................................465
14.7.2. /sbin/hotplug 工具............................................................................................466
14.7.3. 使用 /sbin/hotplug............................................................................................470
14.8. 处理固件......................................................................................................................474
14.8.1. 内核固件接口...................................................................................................474
14.8.2. 它如何工作.......................................................................................................475
14.9. 快速参考......................................................................................................................477
14.9.1. Kobjects结构....................................................................................................477
14.9.2. sysfs 操作.........................................................................................................478
14.9.3. 总线, 设备, 和驱动.........................................................................................478
14.9.4. 类.......................................................................................................................479
14.9.5. 固件...................................................................................................................480
第 15 章 内存映射和 DMA ................................................................................................481
15.1. Linux 中的内存管理..................................................................................................482
15.1.1. 地址类型...........................................................................................................482
15.1.2. 物理地址和页...................................................................................................484
15.1.3. 高和低内存.......................................................................................................484
15.1.4. 内存映射和 struct page ...................................................................................485
15.1.5. 页表...................................................................................................................487
15.1.6. 虚拟内存区.......................................................................................................487
15.1.7. 进程内存映射...................................................................................................491
15.2. mmap 设备操作..........................................................................................................492
15.2.1. 使用 remap_pfn_range.....................................................................................494
15.2.2. 一个简单的实现...............................................................................................495
15.2.3. 添加 VMA 的操作..........................................................................................495
15.2.4. 使用 nopage 映射内存...................................................................................496
15.2.5. 重新映射特定 I/O 区.....................................................................................499
15.2.6. 重新映射 RAM................................................................................................500
15.2.7. 重映射内核虚拟地址.......................................................................................504
15.3. 进行直接 I/O ..............................................................................................................506
15.3.1. 异步 I/O ...........................................................................................................508
15.4. 直接内存存取..............................................................................................................513
15.4.1. 一个 DMA 数据传输的概况..........................................................................513
15.4.2. 分配 DMA 缓冲..............................................................................................514
15.4.3. 总线地址...........................................................................................................515
15.4.4. 通用 DMA 层..................................................................................................516
15.4.5. ISA 设备的 DMA...........................................................................................526
15.5. 快速参考......................................................................................................................532
15.5.1. 介绍性材料.......................................................................................................532
15.5.2. 实现 mmap.......................................................................................................533
15.5.3. 实现直接 I/O ...................................................................................................533
15.5.4. 直接内存存取...................................................................................................534
第 16 章 块驱动....................................................................................................................537
16.1. 注册..............................................................................................................................538
16.1.1. 块驱动注册.......................................................................................................538
16.1.2. 磁盘注册...........................................................................................................539
16.1.3. 在 sbull 中的初始化.......................................................................................542
16.1.4. 注意扇区大小...................................................................................................544
16.2. 块设备操作..................................................................................................................545
16.2.1. open 和 release 方法......................................................................................545
16.2.2. 支持可移出的介质...........................................................................................546
16.2.3. ioctl 方法..........................................................................................................547
16.3. 请求处理......................................................................................................................549
16.3.1. 对请求方法的介绍...........................................................................................549
16.3.2. 一个简单的请求方法.......................................................................................550
16.3.3. 请求队列...........................................................................................................552
16.3.4. 请求的分析.......................................................................................................555
16.3.5. 请求完成函数...................................................................................................561
16.4. 一些其他的细节..........................................................................................................567
16.4.1. 命令预准备.......................................................................................................567
16.4.2. 被标识的命令排队...........................................................................................568
16.5. 快速参考......................................................................................................................570
第 17 章 网络驱动................................................................................................................574
17.1. snull 是如何设计的....................................................................................................576
17.1.1. 分配 IP 号 .......................................................................................................576
17.1.2. 报文的物理传送...............................................................................................578
17.2. 连接到内核..................................................................................................................580
17.2.1. 设备注册...........................................................................................................580
17.2.2. 初始化每一个设备...........................................................................................581
17.2.3. 模块卸载...........................................................................................................583
17.3. net_device 结构的详情..............................................................................................585
17.3.1. 全局信息...........................................................................................................585
17.3.2. 硬件信息...........................................................................................................585
17.3.3. 接口信息...........................................................................................................586
17.3.4. 设备方法...........................................................................................................591
17.3.5. 公用成员...........................................................................................................593
17.4. 打开与关闭..................................................................................................................595
17.5. 报文传送......................................................................................................................597
17.5.1. 控制发送并发...................................................................................................598
17.5.2. 传送超时...........................................................................................................599
17.5.3. 发散/汇聚 I/O ..................................................................................................600
17.6. 报文接收......................................................................................................................602
17.7. 中断处理......................................................................................................................605
17.8. 接收中断缓解..............................................................................................................608
17.9. 连接状态的改变..........................................................................................................612
17.10. Socket 缓存...............................................................................................................613
17.10.1. 重要成员变量.................................................................................................613
17.10.2. 作用于 socket 缓存的函数...........................................................................614
17.11. MAC 地址解析.........................................................................................................616
17.11.1. 以太网使用 ARP ...........................................................................................616
17.11.2. 不考虑 ARP...................................................................................................616
17.11.3. 非以太网头部.................................................................................................617
17.12. 定制 ioctl 命令.........................................................................................................619
17.13. 统计信息....................................................................................................................621
17.14. 多播............................................................................................................................623
17.14.1. 多播的内核支持.............................................................................................624
17.14.2. 典型实现.........................................................................................................625
17.15. 几个其他细节............................................................................................................627
17.15.1. 独立于媒介的接口支持.................................................................................627
17.15.2. ethtool 支持....................................................................................................627
17.15.3. netpoll..............................................................................................................628
17.16. 快速参考....................................................................................................................629
第 18 章 TTY 驱动..............................................................................................................633
18.1. 一个小 TTY 驱动......................................................................................................636
18.1.1. 结构 struct termios...........................................................................................638
18.2. tty_driver 函数指针....................................................................................................642
18.2.1. open 和 close...................................................................................................642
18.2.2. 数据流...............................................................................................................644
18.2.3. 其他缓冲函数...................................................................................................647
18.2.4. 无 read 函数? ..................................................................................................647
18.3. TTY 线路设置............................................................................................................649
18.3.1. set_termios 函数..............................................................................................649
18.3.2. tiocmget 和 tiocmset .......................................................................................652
18.4. ioctls 函数...................................................................................................................654
18.5. TTY 设备的 proc 和 sysfs 处理.............................................................................658
18.6. tty_driver 结构的细节................................................................................................660
18.7. tty_operaions 结构的细节..........................................................................................662
18.8. tty_struct 结构的细节.................................................................................................665
18.9. 快速参考......................................................................................................................668
GCC中文使用手册(摘自GNU C编译器的完整文档)
本手册页内容摘自GNU C编译器的完整文档,感觉很好用