热门搜索: 中考 高考 考试 开卷17
服务电话 024-23945002/96192
 

LINUX设备驱动开发(第2版)

编号:
wx1203870559
销售价:
¥146.03
(市场价: ¥169.80)
赠送积分:
146
数量:
   
商品介绍

1.内容全面深入,涵盖Linux设备驱动开发的各个方面,从基础知识到高级主题,包括各种子系统、内存管理、中断处理等,为读者提供系统且全面的知识体系。
2.理论实践结合,不仅有详细的理论讲解,还包含大量源代码示例,帮助读者更好地理解和应用知识。
3.作者经验丰富,作者约翰·马迪厄是嵌入式Linux及内核工程师,具备深厚的专业知识和实践经验,行文兼具工程人的细致与凝练。
4.译者实力雄厚,由陈莉君、谢瑞莲等专业译者翻译,陈莉君在Linux内核领域有多年研究和教学经验。

本书讲解了Linux设备驱动开发的基础知识以及所用到的开发环境。全书分为17章,内容涵盖了各种Linux子系统、内存管理、RTC、IIO和IRQ管理等,还讲解了DMA和部分设备驱动程序的使用方法。在学完本书之后,读者将掌握Linux设备驱动开发过程中涉及的各种概念,并可以从零开始为嵌入式设备编写驱动程序。
阅读本书需要具备基本的C语言编程能力,且熟悉Linux基本命令。

约翰·马迪厄是一位生活在法国巴黎的嵌入式Linux及内核工程师。他的主要工作是为物联网、交通、医疗、能源和军事等领域的企业开发设备驱动和板级支持包。他是LABCSMART公司的创始人兼首席顾问,该公司专注于提供嵌入式Linux和Linux内核工程方面的培训和服务。他还是一位开源和嵌入式系统爱好者,相信通过分享知识才能学到
更多。他对拳击运动充满热情,已经专业练习了 6 年,现在仍通过志愿执教的方式延续着这份热情。

第 1篇 Linux内核开发基础
第 1章 内核开发简介 3
1.1 设置开发环境 3
1.1.1 设置宿主机 4
1.1.2 获取Linux内核源代码 7
1.2 配置和构建Linux内核 10
1.2.1 指定编译选项 10
1.2.2 理解内核配置过程 11
1.2.3 构建Linux内核 15
第 2章 Linux内核模块的基本概念 17
2.1 模块概念的介绍 17
2.2 构建Linux内核模块 21
2.2.1 理解Linux内核构建系统 22
2.2.2 树外构建 25
2.2.3 树内构建 27
2.3 处理模块参数 28
2.4 处理符号导出和模块依赖 30
2.5 学习Linux内核编程技巧 34
2.5.1 错误处理 34
2.5.2 消息打印 38
2.6 总结 40
第3章 处理内核的核心辅助函数 41
3.1 Linux内核加锁机制和共享资源 41
3.1.1 自旋锁 42
3.1.2 互斥锁 46
3.1.3 trylock方法 48
3.2 处理内核等待、睡眠和延迟机制 50
3.2.1 等待队列 50
3.2.2 内核中的简单睡眠 54
3.2.3 内核延迟或忙等待 54
3.3 深入理解Linux内核时间管理 55
3.3.1 时钟源、时钟事件和节拍设备的概念 55
3.3.2 使用标准内核低精度(low-res)定时器 67
3.3.3 高精度定时器(hrtimer) 73
3.4 实现工作延迟机制 77
3.4.1 软中断(softirq) 78
3.4.2 任务微调度(tasklet) 82
3.4.3 工作队列(workqueue) 86
3.4.4 新一代的工作队列 90
3.5 内核中断处理 93
3.6 总结 109
第4章 编写字符设备驱动程序 110
4.1 主设备号和次设备号的概念 110
4.2 字符设备数据结构介绍 111
4.2.1 设备文件操作介绍 112
4.2.2 内核中文件的表示 114
4.3 创建设备节点 115
4.3.1 设备识别 115
4.3.2 字符设备号的注册和分配 115
4.3.3 在系统中初始化和注册字符设备 116
4.4 实现文件操作 119
4.4.1 在内核空间和用户空间之间交换数据 119
4.4.2 实现打开文件操作 120
4.4.3 实现释放文件操作 121
4.4.4 实现写文件操作 122
4.4.5 实现读取文件操作 124
4.4.6 实现llseek文件操作 126
4.5 总结 135
第 2篇 Linux内核平台抽象和设备驱动程序
第5章 理解和利用设备树 139
5.1 设备树机制的基本概念 139
5.1.1 设备树命名约定 140
5.1.2 认识别名、标签、phandle和路径 141
5.1.3 理解节点和属性的覆盖 144
5.1.4 设备树源代码和编译器 145
5.2 如何表示和寻址设备 151
5.2.1 如何处理SPI和I2C设备寻址 152
5.2.2 内存映射设备和设备寻址 153
5.3 处理资源 155
5.3.1 resource结构体 155
5.3.2 提取应用程序的特定数据 158
5.4 总结 162
第6章 设备、驱动程序和平台抽象简介 163
6.1 Linux内核平台抽象和数据结构 163
6.1.1 device结构体 163
6.1.2 device_driver结构体 165
6.1.3 设备/驱动程序匹配和模块(自动)加载 170
6.1.4 设备声明—填充设备 172
6.2 设备与驱动程序匹配机制详解 173
6.3 总结 176
第7章 平台设备和驱动程序的概念 177
7.1 Linux内核中的平台核心抽象 178
7.2 处理平台设备 180
7.2.1 分配和注册平台设备 180
7.2.2 在代码中如何避免分配平台设备 182
7.2.3 使用平台资源 183
7.3 平台驱动程序抽象和架构 188
7.3.1 探测和释放平台设备 188
7.3.2 在驱动程序中对它所支持的设备进行配置 189
7.3.3 驱动程序的初始化和注册 191
7.4 从零开始编写平台驱动程序 193
7.5 总结 198
第8章 编写I2C设备驱动程序 199
8.1 Linux内核中的I2C框架抽象 200
8.1.1 struct i2c_adapter简介 200
8.1.2 I2C客户端和驱动程序数据结构 202
8.1.3 I2C通信接口 204
8.2 I2C设备驱动程序抽象和架构 208
8.2.1 探测I2C设备 208
8.2.2 实现i2c_driver.remove回调函数 209
8.2.3 驱动程序的初始化和注册 210
8.2.4 在驱动程序中配置设备 211
8.2.5 实例化I2C设备 212
8.3 如何避免编写I2C设备驱动程序 213
8.4 总结 216
第9章 编写SPI设备驱动程序 217
9.1 Linux内核中的SPI框架抽象 218
9.1.1 struct spi_controller简介 218
9.1.2 struct spi_device简介 222
9.1.3 struct spi_driver简介 224
9.1.4 消息传输数据结构 224
9.1.5 访问SPI设备 227
9.2 SPI设备驱动程序抽象和架构 231
9.2.1 探测SPI设备 231
9.2.2 在驱动程序中提供设备信息 233
9.2.3 实现spi_driver.remove回调函数 234
9.2.4 驱动程序的初始化和注册 235
9.2.5 实例化SPI设备 236
9.3 如何避免编写SPI设备驱动程序 237
9.4 总结 242
第3篇 充分发挥硬件的潜力
第 10章 深入理解Linux内核内存分配 245
10.1 Linux内核内存相关术语简介 245
10.1.1 32位系统中的内核地址空间布局:低端内存和高端内存的概念 247
10.1.2 低端内存的细节 248
10.1.3 理解高端内存 249
10.2 揭开地址转换和MMU的神秘面纱 255
10.2.1 页查找和TLB 259
10.2.2 TLB如何运作 260
10.3 内存分配机制及其API 261
10.3.1 页分配器 262
10.3.2 Slab分配器 263
10.3.3 kmalloc分配器 267
10.3.4 vmalloc分配器 270
10.3.5 关于进程内存分配的幕后短故事 272
10.4 使用I/O内存与硬件通信 274
10.4.1 PIO设备访问 275
10.4.2 MMIO 设备访问 276
10.5 内存(重)映射 278
10.5.1 了解kmap()的用法 278
10.5.2 将内核内存映射到用户空间 280
10.6 总结 286
第 11章 实现DMA支持 287
11.1 设置DMA映射 288
11.1.1 缓存一致性和DMA的概念 288
11.1.2 DMA的内存映射 288
11.1.3 创建一致性DMA映射 290
11.1.4 创建流DMA映射 290
11.1.5 单缓冲区映射 291
11.1.6 分散/聚集映射 292
11.1.7 流DMA映射的隐式和显式缓存一致性 294
11.2 完成(completion)的概念 295
11.3 DMA引擎API 296
11.3.1 DMA控制器接口简介 297
11.3.2 处理设备DMA寻址能力 302
11.3.3 请求DMA通道 304
11.3.4 配置DMA通道 305
11.3.5 配置DMA传输 307
11.3.6 提交DMA传输 308
11.3.7 发出待处理的DMA请求并等待回调通知 309
11.4 综合实例——单缓冲区的DMA映射 310
11.5 关于循环DMA的说明 317
11.6 了解DMA和设备树绑定 321
11.7 总结 322
第 12章 内存访问抽象化——Regmap API简介:寄存器映射抽象化 323
12.1 初识Regmap 324
12.2 Regmap初始化 329
12.3 使用Regmap寄存器访问函数 330
12.3.1 批量和多寄存器读写函数 331
12.3.2 理解Regmap缓存系统 332
12.4 将所有内容整合在一起—基于Regmap的SPI设备驱动程序示例 334
12.5 从用户空间利用Regmap 337
12.6 总结 340
第 13章 揭秘内核IRQ框架 341
13.1 中断的简要介绍 341
13.2 理解中断控制器和中断多路复用 342
13.3 深入研究高级外设IRQ管理 351
13.3.1 了解IRQ及其传播 353
13.3.2 链式IRQ 354
13.4 揭秘per-CPU中断 355
13.5 总结 359
第 14章 LDM简介 360
14.1 LDM数据结构简介 360
14.1.1 总线 361
14.1.2 驱动程序数据结构 367
14.1.3 设备驱动程序注册 368
14.1.4 设备数据结构 369
14.1.5 设备注册 370
14.2 深入理解LDM 371
14.2.1 了解kobject结构体 371
14.2.2 了解kobj_type 375
14.2.3 了解kset结构体 376
14.2.4 使用非默认属性 377
14.2.5 使用二进制属性 382
14.3 sysfs中的设备模型概述 388
14.3.1 创建设备、驱动程序、总线和类相关属性 389
14.3.2 使sysfs属性poll和select兼容 394
14.4 总结 395
第4篇 嵌入式领域内的多种内核子系统
第 15章 深入了解IIO框架 399
15.1 IIO数据结构简介 401
15.1.1 了解struct iio_dev 401
15.1.2 了解struct iio_info 405
15.1.3 IIO通道的概念 407
15.1.4 区分通道 411
15.1.5 将所有内容整合在一起——编写一个虚拟IIO驱动程序 413
15.2 集成IIO触发缓冲区支持 417
15.2.1 IIO触发器和sysfs(用户空间) 420
15.2.2 IIO缓冲区 424
15.2.3 将所有内容整合在一起 426
15.3 访问IIO数据 432
15.3.1 单次数据采集 432
15.3.2 访问数据缓冲区 433
15.4 内核中的IIO消费者接口 436
15.5 编写用户空间的IIO应用程序 439
15.5.1 扫描和创建IIO上下文 441
15.5.2 遍历和管理IIO设备 445
15.5.3 遍历和管理IIO通道 445
15.5.4 使用触发器进行工作 447
15.5.5 创建缓冲区并读取数据样本 448
15.6 遍历用户空间IIO工具 455
15.7 总结 455
第 16章 充分利用引脚控制器和GPIO子系统 456
16.1 硬件术语介绍 456
16.2 引脚控制子系统介绍 458
16.3 利用GPIO控制器接口 464
16.3.1 编写GPIO控制器驱动程序 468
16.3.2 在GPIO控制器中启用IRQ芯片 470
16.3.3 在GPIO芯片中添加IRQ芯片支持 474
16.3.4 GPIO控制器绑定方式 477
16.4 充分利用GPIO子系统 482
16.4.1 基于整数的GPIO接口(现已弃用) 483
16.4.2 基于描述符的GPIO接口(推荐方式) 486
16.5 学习如何避免编写GPIO客户端驱动程序 494
16.5.1 告别旧的sysfs接口 494
16.5.2 欢迎使用GPIO库libgpiod 495
16.5.3 GPIO聚合器 504
16.6 总结 509
第 17章 利用Linux内核输入子系统 510
17.1 Linux内核输入子系统简介 510
17.2 分配和注册输入设备 513
17.3 使用轮询输入设备 514
17.4 生成和报告输入事件 518
17.5 处理来自用户空间的输入设备 520
17.6 总结 524

商品参数
基本信息
出版社 人民邮电出版社
ISBN 9787115663856
条码 9787115663856
编者 [法]约翰·马迪厄(John Madieu) 著 陈莉君 谢瑞莲 译
译者 陈莉君,谢瑞莲
出版年月 2025-10-01 00:00:00.0
开本 16开
装帧 平装
页数 524
字数
版次 1
印次 1
纸张 一般胶版纸
商品评论

暂无商品评论信息 [发表商品评论]

商品咨询

暂无商品咨询信息 [发表商品咨询]