Linux 设备驱动 Edition 3
By Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman
由 quickwhale 翻译的简体中文版 V0.1.0 2006-6-2
由 ezconnect.cn 制作的 CHM 版本,支持查找! V1.0 2008-6-18
更多精彩,尽在 http://ezconnect.cn
遵循原版的版权声明. 还在完善中. 欢迎任何意见, 请给我邮件. 请发信至
quickwhale 的邮箱 <quickwhale@hotmail.com>
版权 © 2005, 2001, 1998 O’Reilly Media, Inc. All rights reserved.
Printed in the United States of America. Published by O’Reilly Media,
Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly
books may be purchased for educational, business, or sales promotional
use. Online editions are also available for most titles
(safari.oreilly.com). For more information, contact our
corporate/insti-tutional sales department: (800) 998-9938 or
corporate@oreilly.com.
This work is licensed under the Creative Commons
Attribution-NonCommercial-ShareAlike 2.0 License. To view a copy of this
license, visit http://creativecommons.org/licenses/by-sa/2.0/ or send a
letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California
94305, USA.
感谢
感谢本书原版的作者 Jonathan Corbet, Alessandro Rubini 和 Greg
Kroah-Hartman
感谢我的家人 爸爸
2
, 妈妈
2
, PIGY
nuonuo
目录
Linux 设备驱动 Edition 3
By Jonathan Corbet, Alessandro Rubini, and Greg Kroa
h-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. 重定向
控制台消息.............................................................................................10
1
4.2.3. 消息是如何记录的.............................................................................................10
1
4.2.4. 打开和关闭消息.................................................................................................10
2
4.2.5. 速率限制.............................................................................................................10
4
4.2.6. 打印设备编号.....................................................................................................10
5
4.3. 用查询来调试................................................................................................................10
6
4.3.1. 使用 /proc
文件系统.........................................................................................106
4.3.2. ioctl 方法............................................................................................................114
4.5. 调试系统
故障................................................................................................................1
16
4.5.1. oops 消息 ...........................................................................................................116
4.5.2. 系统挂
起.............................................................................................................12
0
4.6. 调试器和相关工具........................................................................................................12
3
4.6.1. 使用 gdb.............................................................................................................12
3
4.6.2. kdb 内核调试器.................................................................................................12
5
4.6.3. kgdb 补丁...........................................................................................................128
4.6.4. 用户模
式
Linux 移植 .......................................................................................128
4.6.5. Linux 追踪工具 .................................................................................................129
4.6.6. 动态探
针.............................................................................................................12
9
第 5 章 并发和竞争情况......................................................................................................13
0
5.1. scull 中的缺陷 ..............................................................................................................13
1
5.2. 并发和它的管理............................................................................................................13
2
5.3. 旗标和互斥体................................................................................................................13
4
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. 自旋锁
和原子上下文.........................................................................................14
4
5.5.3. 自旋锁函数.........................................................................................................14
5
5.5.4. 读者/写者自旋锁................................................................................................14
6
5.6. 锁陷阱............................................................................................................................148
5.6.1. 模糊的
规则.........................................................................................................14
8
5.6.2. 加锁顺序规则.....................................................................................................14
8
5.6.3. 细 -粗- 粒度加锁 ..............................................................................................149
5.7. 加锁的各
种选择............................................................................................................15
1
5.7.1. 不加锁算法.........................................................................................................15
1
5.7.2. 原子变量.............................................................................................................15
2
5.7.3. 位操作.................................................................................................................153
5.7.4. seqlock 锁 ..........................................................................................................155
5.7.5. 读取-拷贝-更新..................................................................................................156
5.8. 快速参考........................................................................................................................159
第 6 章 高级
字符驱动操作..................................................................................................16
4
6.1. ioctl 接口 ......................................................................................................................165
6.1.1. 选择 ioc
t
l 命令..................................................................................................166
6.1.2. 返回值.................................................................................................................169
6.1.3. 预定义
的命令.....................................................................................................16
9
6.1.4. 使用 ioct
l 参数..................................................................................................170
6.1.5. 兼容性和受限操作.............................................................................................17
2
6.1.6. ioctl 命令的实现................................................................................................17
4
6.1.7. 不用 ioct
l 的设备控制......................................................................................176
6.2. 阻塞 I/O ........................................................................................................................17
8
6.2.1. 睡眠的介绍.........................................................................................................17
8
6.2.2. 简单睡眠.............................................................................................................17
9
6.2.3. 阻塞和非阻塞操作.............................................................................................18
1
6.2.4. 一个阻塞
I/O 的例子 .......................................................................................182
6.2.5. 高级睡眠.............................................................................................................18
5
6.2.6. 测试 scul
lpipe 驱动 ..........................................................................................192
6.3. poll 和 select
................................................................................................................194
6.3.1. 与 read 和 write 的交
互..................................................................................197
6.3.2. 底层的数据结构.................................................................................................19
8
6.4. 异步通知........................................................................................................................200
6.4.1. 驱动的
观点.........................................................................................................20
1
6.5. 移位一个设备................................................................................................................20
2
6.5.1. llseek 实现 .........................................................................................................202
6.6. 在一个设
备文件上的存取控制....................................................................................20
4
6.6.1. 单 open 设备.....................................................................................................20
4
6.6.2. 一次对一个用户限制存取.................................................................................20
5
- 1
- 2
前往页