《精通Linux 设备驱动程序开发》

图书作者:华清远见 丛书名称: 图灵程序设计丛书 操作系统 出版日期:2010年6月

编辑推荐理由

推荐评分:5.0分

多年嵌入式人才培养及项目研发经验总结

数百家企业嵌入式研发岗位人才需求汇总

数十所嵌入式专业大学院校教学现状调研

侧重实践及案例分析并辅以代码加以讲解

图书简介

本书是Linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如PCMCIA、I2C和USB等外部总线以及视频、音频、无线连网和闪存等驱动程序的开发,并讲解了相关的内核源码文件,给出了完整的开发实例。 本书适合中高级Linux开发人员阅读。

图书目录

  • ※第1章 引言 1

  • 1.1 演进 1
  • 1.2 GNU Copyleft 2
  • 1.3 kernel.org 2
  • 1.4 邮件列表和论坛 3
  • 1.5 Linux发行版 3
  • 1.6 查看源代码 4
  • 1.7 编译内核 7
  • 1.8 可加载的模块 8
  • 1.9 整装待发 9
  • ※第2章 内核 11

  • 2.1 启动过程 11
  • 2.1.1 BIOS-provided physical RAM map 12
  • 2.1.2 758MB LOWMEM available 14
  • 2.1.3 Kernel command line: ro
  • root=/dev/hda1 14
  • 2.1.4 Calibrating delay...1197.46
  • BogoMIPS (lpj=2394935) 15
  • 2.1.5 Checking HLT instruction 16
  • 2.1.6 NET: Registered protocol family 2 17
  • 2.1.7 Freeing initrd memory: 387k freed 17
  • 2.1.8 io scheduler anticipatory
  • registered (default) 18
  • 2.1.9 Setting up standard PCI resources 18
  • 2.1.10 EXT3-fs: mounted filesystem 19
  • 2.1.11 INIT: version 2.85 booting 19
  • 2.2 内核模式和用户模式 20
  • 2.3 进程上下文和中断上下文 20
  • 2.4 内核定时器 21
  • 2.4.1 HZ和Jiffies 21
  • 2.4.2 长延时 22
  • 2.4.3 短延时 24
  • 2.4.4 Pentium时间戳计数器 24
  • 2.4.5 实时钟 25
  • 2.5 内核中的并发 26
  • 2.5.1 自旋锁和互斥体 26
  • 2.5.2 原子操作 30
  • 2.5.3 读—写锁 31
  • 2.5.4 调试 32
  • 2.6 proc文件系统 32
  • 2.7 内存分配 33
  • 2.8 查看源代码 34
  • ※第3章 内核组件 37

  • 3.1 内核线程 37
  • 3.1.1 创建内核线程 37
  • 3.1.2 进程状态和等待队列 41
  • 3.1.3 用户模式辅助程序 42
  • 3.2 辅助接口 43
  • 3.2.1 链表 44
  • 3.2.2 散列链表 49
  • 3.2.3 工作队列 49
  • 3.2.4 通知链 51
  • 3.2.5 完成接口 54
  • 3.2.6 kthread辅助接口 56
  • 3.2.7 错误处理助手 57
  • 3.3 查看源代码 58
  • ※第4章 基本概念 61

  • 4.1 设备和驱动程序介绍 61
  • 4.2 中断处理 63
  • 4.2.1 中断上下文 63
  • 4.2.2 分配IRQ号 64
  • 4.2.3 设备实例:导航杆 65
  • 4.2.4 softirq和tasklet 68
  • 4.3 Linux设备模型 71
  • 4.3.1 udev 71
  • 4.3.2 sysfs、kobject和设备类 73
  • 4.3.3 热插拔和冷插拔 76
  • 4.3.4 微码下载 76
  • 4.3.5 模块自动加载 77
  • 4.4 内存屏障 78
  • 4.5 电源管理 79
  • 4.6 查看源代码 79
  • ※第5章 字符设备驱动程序 81

  • 5.1 字符设备驱动程序基础 81
  • 5.2 设备实例:系统CMOS 82
  • 5.2.1 驱动程序初始化 83
  • 5.2.2 打开与释放 86
  • 5.2.3 数据交换 88
  • 5.2.4 查找 92
  • 5.2.5 控制 94
  • 5.3 检测数据可用性 95
  • 5.3.1 轮询 95
  • 5.3.2 Fasync 98
  • 5.4 和并行端口交互 99
  • 5.5 RTC子系统 108
  • 5.6 伪字符驱动程序 109
  • 5.7 混杂驱动程序 110
  • 5.8 字符设备驱动程序注意事项 115
  • 5.9 查看源代码 115
  • ※第6章 串行设备驱动程序 118

  • 6.1 层次架构 119
  • 6.2 UART驱动程序 121
  • 6.2.1 设备实例:手机 122
  • 6.2.2 RS-485 132
  • 6.3 TTY驱动程序 132
  • 6.4 线路规程 134
  • 6.5 查看源代码 141
  • ※第7章 输入设备驱动程序 143

  • 7.1 输入事件驱动程序 144
  • 7.2 输入设备驱动程序 150
  • 7.2.1 serio 150
  • 7.2.2 键盘 150
  • 7.2.3 鼠标 152
  • 7.2.4 触摸控制器 157
  • 7.2.5 加速度传感器 158
  • 7.2.6 输出事件 158
  • 7.3 调试 159
  • 7.4 查看源代码 160
  • ※第8章 I2C协议 161

  • 8.1 I2C/SMBus是什么 161
  • 8.2 I2C核心 162
  • 8.3 总线事务 164
  • 8.4 设备实例:EEPROM 164
  • 8.4.1 初始化 165
  • 8.4.2 探测设备 167
  • 8.4.3 检查适配器的功能 169
  • 8.4.4 访问设备 169
  • 8.4.5 其他函数 170
  • 8.5 设备实例:实时时钟 171
  • 8.6 i2c-dev 174
  • 8.7 使用LM-Sensors监控硬件 174
  • 8.8 SPI总线 174
  • 8.9 1-Wire总线 176
  • 8.10 调试 176
  • 8.11 查看源代码 176
  • ※第9章 PCMCIA和CF 179

  • 9.1 PCMCIA/CF是什么 179
  • 9.2 Linux-PCMCIA子系统 181
  • 9.3 主机控制器驱动程序 183
  • 9.4 PCMCIA核心 183
  • 9.5 驱动程序服务 183
  • 9.6 客户驱动程序 183
  • 9.6.1 数据结构 184
  • 9.6.2 设备实例:PCMCIA卡 185
  • 9.7 将零件组装在一起 188
  • 9.8 PCMCIA存储 189
  • 9.9 串行PCMCIA 189
  • 9.10 调试 191
  • 9.11 查看源代码 191
  • ※第10章 PCI 193

  • 10.1 PCI系列 193
  • 10.2 寻址和识别 195
  • 10.3 访问PCI 198
  • 10.3.1 配置区 198
  • 10.3.2 I/O和内存 199
  • 10.4 DMA 200
  • 10.5 设备实例:以太网—调制解调器卡 203
  • 10.5.1 初始化和探测 203
  • 10.5.2 数据传输 209
  • 10.6 调试 214
  • 10.7 查看源代码 214
  • ※第11章 USB 216

  • 11.1 USB体系架构 216
  • 11.1.1 总线速度 218
  • 11.1.2 主机控制器 218
  • 11.1.3 传输模式 219
  • 11.1.4 寻址 219
  • 11.2 Linux-USB子系统 220
  • 11.3 驱动程序的数据结构 221
  • 11.3.1 usb_device结构体 221
  • 11.3.2 URB 222
  • 11.3.3 管道 223
  • 11.3.4 描述符结构 223
  • 11.4 枚举 225
  • 11.5 设备实例:遥测卡 225
  • 11.5.1 初始化和探测过程 226
  • 11.5.2 卡寄存器的访问 230
  • 11.5.3 数据传输 233
  • 11.6 类驱动程序 236
  • 11.6.1 大容量存储设备 236
  • 11.6.2 USB-串行端口转换器 241
  • 11.6.3 人机接口设备 243
  • 11.6.4 蓝牙 243
  • 11.7 gadget驱动程序 243
  • 11.8 调试 244
  • 11.9 查看源代码 245
  • ※第12章 视频驱动程序 247

  • 12.1 显示架构 247
  • 12.2 Linux视频子系统 249
  • 12.3 显示参数 251
  • 12.4 帧缓冲API 252
  • 12.5 帧缓冲驱动程序 254
  • 12.6 控制台驱动程序 265
  • 12.6.1 设备实例:手机 266
  • 12.6.2 启动logo 270
  • 12.7 调试 270
  • 12.8 查看源代码 271
  • ※第13章 音频驱动程序 273

  • 13.1 音频架构 273
  • 13.2 Linux声音子系统 275
  • 13.3 设备实例:MP3播放器 277
  • 13.3.1 驱动程序函数和结构体 278
  • 13.3.2 ALSA编程 287
  • 13.4 调试 288
  • 13.5 查看源代码 289
  • ※第14章 块设备驱动程序 291

  • 14.1 存储技术 291
  • 14.2 Linux块I/O层 295
  • 14.3 I/O调度器 295
  • 14.4 块驱动程序数据结构和方法 296
  • 14.5 设备实例:简单存储控制器 298
  • 14.5.1 初始化 299
  • 14.5.2 块设备操作 301
  • 14.5.3 磁盘访问 302
  • 14.6 高级主题 304
  • 14.7 调试 306
  • 14.8 查看源代码 306
  • ※第15章 网络接口卡 308

  • 15.1 驱动程序数据结构 308
  • 15.1.1 套接字缓冲区 309
  • 15.1.2 网络设备接口 310
  • 15.1.3 激活 311
  • 15.1.4 数据传输 311
  • 15.1.5 看门狗 311
  • 15.1.6 统计 312
  • 15.1.7 配置 313
  • 15.1.8 总线相关内容 314
  • 15.2 与协议层会话 314
  • 15.2.1 接收路径 314
  • 15.2.2 发送路径 315
  • 15.2.3 流量控制 315
  • 15.3 缓冲区管理和并发控制 315
  • 15.4 设备实例:以太网NIC 316
  • 15.5 ISA网络驱动程序 321
  • 15.6 ATM 321
  • 15.7 网络吞吐量 322
  • 15.7.1 驱动程序性能 322
  • 15.7.2 协议性能 323
  • 15.8 查看源代码 324
  • ※第16章 Linux无线设备驱动 326

  • 16.1 蓝牙 327
  • 16.1.1 BlueZ 328
  • 16.1.2 设备实例:CF卡 329
  • 16.1.3 设备实例:USB适配器 330
  • 16.1.4 RFCOMM 331
  • 16.1.5 网络 332
  • 16.1.6 HID 334
  • 16.1.7 音频 334
  • 16.1.8 调试 334
  • 16.1.9 关于源代码 334
  • 16.2 红外 335
  • 16.2.1 Linux-IrDA 335
  • 16.2.2 设备实例:超级I/O芯片 337
  • 16.2.3 设备实例:IR Dongle 338
  • 16.2.4 IrCOMM 340
  • 16.2.5 联网 340
  • 16.2.6 IrDA套接字 341
  • 16.2.7 LIRC 341
  • 16.2.8 查看源代码 342
  • 16.3 WiFi 343
  • 16.3.1 配置 343
  • 16.3.2 设备驱动程序 346
  • 16.3.3 查看源代码 347
  • 16.4 蜂窝网络 347
  • 16.4.1 GPRS 347
  • 16.4.2 CDMA 349
  • 16.5 当前趋势 350
  • ※第17章 存储技术设备 352

  • 17.1 什么是闪存 352
  • 17.2 Linux-MTD子系统 353
  • 17.3 映射驱动程序 353
  • 17.4 NOR芯片驱动程序 358
  • 17.5 NAND芯片驱动程序 359
  • 17.6 用户模块 361
  • 17.6.1 块设备模拟 361
  • 17.6.2 字符设备模拟 361
  • 17.6.3 JFFS2 362
  • 17.6.4 YAFFS2 363
  • 17.7 MTD工具 363
  • 17.8 配置MTD 363
  • 17.9 XIP 364
  • 17.10 FWH 364
  • 17.11 调试 367
  • 17.12 查看源代码 367
  • ※第18章 嵌入式Linux 369

  • 18.1 挑战 369
  • 18.2 元器件选择 370
  • 18.3 工具链 371
  • 18.4 Bootloader 372
  • 18.5 内存布局 374
  • 18.6 内核移植 375
  • 18.7 嵌入式驱动程序 376
  • 18.7.1 闪存 377
  • 18.7.2 UART 377
  • 18.7.3 按钮和滚轮 378
  • 18.7.4 PCMCIA/CF 378
  • 18.7.5 SD/MMC 378
  • 18.7.6 USB 378
  • 18.7.7 RTC 378
  • 18.7.8 音频 378
  • 18.7.9 触摸屏 379
  • 18.7.10 视频 379
  • 18.7.11 CPLD/FPGA 379
  • 18.7.12 连接性 379
  • 18.7.13 专用领域电子器件 380
  • 18.7.14 更多驱动程序 380
  • 18.8 根文件系统 380
  • 18.8.1 NFS挂载的根文件系统 381
  • 18.8.2 紧凑型中间件 382
  • 18.9 测试基础设施 383
  • 18.10 调试 383
  • 18.10.1 电路板返工 384
  • 18.10.2 调试器 385
  • ※第19章 用户空间的驱动程序 386

  • 19.1 进程调度和响应时间 387
  • 19.1.1 原先的调度器 387
  • 19.1.2 O(1)调度器 387
  • 19.1.3 CFS 388
  • 19.1.4 响应时间 388
  • 19.2 访问I/O区域 390
  • 19.3 访问内存区域 393
  • 19.4 用户模式SCSI 395
  • 19.5 用户模式USB 397
  • 19.6 用户模式I2C 400
  • 19.7 UIO 401
  • 19.8 查看源代码 402
  • ※第20章 其他设备和驱动程序 403

  • 20.1 ECC报告 403
  • 20.2 频率调整 407
  • 20.3 嵌入式控制器 408
  • 20.4 ACPI 408
  • 20.5 ISA与MCA 410
  • 20.6 火线 410
  • 20.7 智能输入/输出 411
  • 20.8 业余无线电 411
  • 20.9 VoIP 411
  • 20.10 高速互联 412
  • 20.10.1 InfiniBand 413
  • 20.10.2 RapidIO 413
  • 20.10.3 光纤通道 413
  • 20.10.4 iSCSI 413
  • ※第21章 调试设备驱动程序 414

  • 21.1 kdb 414
  • 21.1.1 进入调试器 415
  • 21.1.2 kdb 415
  • 21.1.3 kgdb 417
  • 21.1.4 gdb 420
  • 21.1.5 JTAG调试器 421
  • 21.1.6 下载 423
  • 21.2 内核探测器 423
  • 21.2.1 kprobe 423
  • 21.2.2 jprobe 427
  • 21.2.3 返回探针 429
  • 21.2.4 局限性 431
  • 21.2.5 查看源代码 431
  • 21.3 kexec与kdump 431
  • 21.3.1 kexec 432
  • 21.3.2 kdump与kexec协同工作 432
  • 21.3.3 kdump 433
  • 21.3.4 查看源代码 437
  • 21.4 性能剖析 437
  • 21.4.1 利用OProfile剖析内核性能 438
  • 21.4.2 利用gprof剖析应用程序性能 440
  • 21.5 跟踪 441
  • 21.6 LTP 444
  • 21.7 UML 444
  • 21.8 诊断工具 444
  • 21.9 内核修改配置选项 444
  • 21.10 测试设备 445
  • ※第22章 维护与发布 446

  • 22.1 代码风格 446
  • 22.2 修改标记 446
  • 22.3 版本控制 447
  • 22.4 一致性检查 447
  • 22.5 构建脚本 448
  • 22.6 可移植代码 450
  • ※第23章 结束语 451
  • 23.1 流程一览表 451
  • 23.2 下一步该做什么 452
  • 附录A Linux汇编 453
  • 附录B Linux与BIOS 457
  • 附录C seq文件 461