描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121313592丛书名: 高等院校嵌入式人才培养规划教材
第2章 内核模块 6
2.1 个内核模块程序 7
2.2 内核模块的相关工具 10
2.3 内核模块一般的形式 11
2.4 将多个源文件编译生成一个内核模块 13
2.5 内核模块参数 15
2.6 内核模块依赖 17
2.7 关于内核模块的进一步讨论 20
2.8 习题 21
第3章 字符设备驱动 23
3.1 字符设备驱动基础 24
3.2 字符设备驱动框架 30
3.3 虚拟串口设备 35
3.4 虚拟串口设备驱动 35
3.5 一个驱动支持多个设备 39
3.6 习题 45
第4章 高级I/O操作 46
4.1 ioctl设备操作 47
4.2 proc文件操作 56
4.3 非阻塞型I/O 58
4.4 阻塞型I/O 60
4.5 I/O多路复用 65
4.6 异步I/O 69
4.7 几种I/O模型总结 73
4.8 异步通知 74
4.9 mmap设备文件操作 83
4.10 定位操作 88
4.11 习题 90
第5章 中断和时间管理 92
5.1 中断进入过程 93
5.2 驱动中的中断处理 98
5.3 中断下半部 101
5.3.1 软中断 102
5.3.2 tasklet 104
5.3.3 工作队列 106
5.4 延时控制 108
5.5 定时操作 109
5.5.1 低分辨率定时器 109
5.5.2 高分辨率定时器 112
5.6 习题 114
第6章 互斥和同步 116
6.1 一种典型的竞态 117
6.2 内核中的并发 117
6.3 中断屏蔽 118
6.4 原子变量 119
6.5 自旋锁 120
6.6 读写锁 122
6.7 顺序锁 123
6.8 信号量 125
6.9 读写信号量 127
6.10 互斥量 127
6.11 RCU机制 128
6.12 虚拟串口驱动加入互斥 130
6.13 完成量 134
6.14 习题 135
第7章 内存和DMA 137
7.1 内存组织 138
7.2 按页分配内存 139
7.3 slab分配器 142
7.4 不连续内存页分配 144
7.5 per-CPU变量 145
7.6 动态内存实例 146
7.7 I/O内存 147
7.8 DMA原理及映射 155
7.8.1 DMA工作原理 155
7.8.2 DMA映射 157
7.9 DMA统一编程接口 160
7.10 习题 164
第8章 Linux设备模型 166
8.1 设备模型基础 167
8.2 总线、设备和驱动 171
8.3 平台设备及其驱动 176
8.3.1 平台设备 176
8.3.2 平台驱动 178
8.3.3 平台驱动简单实例 179
8.3.4 电源管理 182
8.3.5 udev和驱动的自动加载 183
8.3.6 使用平台设备的LED驱动 184
8.3.7 自动创建设备节点 190
8.4 Linux设备树 193
8.4.1 Linux设备树的由来 193
8.4.2 Linux设备树的目的 194
8.4.3 Linux设备树的使用 195
8.4.4 使用设备树的LED驱动 202
8.5 习题 204
第9章 字符设备驱动实例 205
9.1 LED驱动 206
9.2 基于中断的简单按键驱动 209
9.3 基于输入子系统的按键驱动 213
9.4 ADC驱动 222
9.5 PWM驱动 231
9.6 RTC驱动 239
第10章 总线类设备驱动 243
10.1 I2C设备驱动 244
10.1.1 I2C协议简介 244
10.1.2 Linux I2C驱动 246
10.1.3 I2C设备驱动实例 251
10.2 SPI设备驱动 258
10.2.1 SPI协议简介 258
10.2.2 Linux SPI驱动 259
10.2.3 SPI设备驱动范例 264
10.3 USB设备驱动 268
10.3.1 USB协议简介 268
10.3.2 Linux USB驱动 271
10.3.3 USB设备驱动实例 274
10.4 PCI设备驱动 283
10.4.1 PCI协议简介 283
10.4.2 Linux PCI驱动 287
10.4.3 PCI设备驱动实例 288
10.5 习题 296
第11章 块设备驱动 298
11.1 磁盘结构 299
11.2 块设备内核组件 300
11.3 块设备驱动核心数据结构和函数 301
11.4 块设备驱动实例 308
11.5 习题 316
第12章 网络设备驱动 317
12.1 网络层次结构 318
12.2 网络设备驱动核心数据结构和函数 319
12.3 网络设备驱动实例 327
12.4 DM9000网络设备驱动代码分析 333
12.5 NAPI 340
12.6 习题 343
第13章 内核调试技术 344
13.1 内核调试方法 345
13.1.1 内核调试概述 345
13.1.2 学会分析内核源程序 346
13.1.3 调试方法介绍 346
13.2 内核打印函数 350
13.2.1 内核镜像解压前的串口输出函数 350
13.2.2 内核镜像解压后的串口输出函数 352
13.2.3 内核打印函数 353
13.3 获取内核信息 357
13.3.1 系统请求键 357
13.3.2 通过/proc接口 358
13.3.3 通过/sys接口 359
13.4 处理出错信息 362
13.4.1 oops信息 362
13.4.2 panic 364
13.4.3 通过ioctl方法 366
13.5 内核源码调试 367
13.6 习题 369
第14章 搭建开发环境 370
14.1 准备Linux开发主机 371
14.2 安装串口相关软件 375
14.2.1 安装串口驱动 375
14.2.2 安装串口终端软件PuTTY 376
14.2.3 安装串口终端软件minicom 377
14.3 安装TFTP和NFS服务器 379
14.4 准备Linux内核源码 381
14.5 在目标板上运行Linux系统 382
14.6 源码浏览及编辑器环境 386
习题答案 388
参考文献 389
前言
随着嵌入式及物联网技术地快速发展,ARM处理器已经广泛地应用到了工业控制、智能仪表、汽车电子、医疗电子、军工电子、网络设备、消费类电子、智能终端等领域。而较新的ARM Cortex-A9架构的四核处理器更是由于其优越的性能被广泛应用到了中高端的电子产品市场。比如基于ARM Cortex-A9的三星Exynos4412处理器就被应用在了三星GALAXY Note II智能手机上。
另外,Linux内核由于其高度的稳定性和可裁剪性等特点,被广泛地应用到了嵌入式系统,Android系统就是一个典型的例子。这样,ARM处理器就和Linux操作系统紧密地联系在了一起。所以,基于ARM和Linux的嵌入式系统就得到了快速的发展。
嵌入式系统是一个定制的系统,所以千变万化、形形色色的硬件都必须要有对应的驱动才能使其正常工作,为这些硬件设备编写驱动就是不可避免的了。虽然有很多内核开发人员已经为很多常见的硬件开发了驱动,但是驱动的升级一般都跟不上新硬件的升级。笔者就多次遇到过内核的驱动和同一系列的升级版本芯片不匹配的情况,这时就要改写驱动程序。所以内核层次的底层开发几乎都要和驱动打交道。另外,了解驱动(或者说内核)的一些底层工作原理,也有助于我们写出更稳定、更高效的应用层代码。
为了能够实现这一目标,并促进嵌入式技术的推广,华清远见研发中心自主研发了一套基于Exynos4412处理器的开发板FS4412,并组织编写了本书。本书注重实践、实用,没有用长篇大论来反复强调一些旁枝末节的内容,但是对于会影响理解的部分又非常详细地分析了内核源码,并给出了大量的图示。书中的各个实例虽然为了突出相关的知识重点而简化了对某些问题的讨论,不能称得上工程上严格意义的好驱动,但是确实也具备了对应的设备驱动开发所必需的各方面。实例按照工程上驱动开发的增量式方式来进行,即先有主体再逐渐完善,循序渐进。读者按照实例能够迅速掌握对应驱动的开发精要,对整个驱动的实现也就有了一个清晰的思路。
本书共14章,循序渐进地讲解了嵌入式Linux设备驱动开发所涉及的理论基础和大量API说明,并配有大量驱动实例。全书主要分为五部分:部分是Linux设备驱动开发的概述,包含第1章;第二部分是模块及字符设备驱动的理论,包含第2~8章;第三部分是字符设备驱动实例,包含第9章和第10章;第四部分是Linux块设备驱动和网络设备驱动,包含第11章和第12章;后一部分是Linux内核的调试和开发环境的搭建,包含第13章和第14章。各章节的主要内容如下。
第1章概述了需要了解Linux驱动程序的人群、Linux驱动开发的特点和本书其他各章节的核心内容。
第2章对Linux内核的模块进行了介绍,现在的驱动几乎都以Linux内核模块的形式来实现,所以这是后续的基础。
第3章讲解Linux字符设备驱动的主体框架,并以一个假想的串口来实现驱动。这是Linux设备驱动入门的关键,所以分析了大量的内核源码。当然,这个驱动是不完善的,需要在后面的各章节逐步添加功能。
第4章在上一章的基础上探讨了字符设备的高级I/O操作,包括ioctl、阻塞、I/O多路复用、异步通知、mmap、定位等,还特别介绍了proc相关的接口。
第5章讲解中断和时间管理,为便于理解,特别加入了中断进入的内核源码分析。时间管理则包含了延时和定时两部分,在定时部分还讨论了新内核中的高分辨率定时器。
第6章讲解了互斥和同步,为了让读者明白互斥对驱动开发的重要性,特别从ARM汇编的层次来讨论了竞态。除了对传统的互斥(自旋锁、信号量等)进行讨论外,还特别说明了RCU机制和使用的范例。
第7章讲解了内核中内存的各种分配方式,还特别谈到了per-CPU变量的使用。后,对DMA的讨论则专注于新内核引入的dmaengine子系统,并用一个实例进行了具体的展现。
第8章讲解了Linux设备模型,这部分内容比较抽象。为了能帮助读者理解这部分内容,专门实现了设备、总线、驱动三个简单的实例,从而使读者完全掌握三者之间的关系。这一章的后半部分有大量实用技术的展现,包括电源管理、驱动的自动加载、设备节点的自动创建等。后还讲解了较新的内核引入的ARM体系结构的设备树。
第9章在前面的理论基础上实现了大量外设的驱动。这些驱动并不都是通过字符设备框架来实现的,目的就是想告诉读者,如果我们能够简化驱动的编写,就尽量简化驱动的编写,多使用内核中已经实现的机制。
第10章讲解了总线类设备驱动的开发,对流行的I2C总线、SPI总线、USB总线和PCI总线都进行了讨论。这些总线都有一个共同的特性,就是都有主机控制器和连接在总线上的设备,我们只讨论了在主机控制器驱动之上的设备驱动,不讨论主机控制器驱动及设备自身的固件或驱动,因为设备驱动是常开发的驱动。
第11章讲解了块设备驱动,为了便于读者对这部分知识进行理解,特别介绍了磁盘的内部结构,然后用内存虚拟了一个磁盘,用两种方式实现了该虚拟磁盘的块设备驱动。
第12章讲解了网络设备驱动,用一个虚拟的环回以太网卡的驱动展现了网络设备驱动的主体框架,还分析了DM9000网卡驱动的主体框架部分,并和前面的虚拟网卡驱动进行了对比。
第13章介绍了内核的一些调试技术。内核的调试相对来说比较麻烦,但只要能熟练使用这些调试技术,还是能较快找出问题所在的。
第14章是嵌入式Linux设备驱动开发环境的搭建,包含了主机系统的准备和各个软件的安装。尤其是用vim搭建了一个适合于驱动开发的类似于IDE的编辑环境,能够大大提高代码的编写效率。
本书由华清远见成都中心的姜先刚编写,北京中心的刘洪涛承担全书的统稿及审校工作,是贾燕枫、杨曼、袁祖刚、关晓强、谭翠君、李媛媛、张丹、张志华、曹忠明、苗德行、冯利美、卢闫进、蔡蒙等老师心血的结晶,也是他们多年教学成果的积累。他们认真阅读了书稿,提出了大量的建议,并纠正了书稿中的很多错误,在此特表示感谢。
由于作者水平有限,书中不妥之处在所难免,恳请读者批评指正。对于本书的批评和建议,可以发表到www.farsight.com.cn技术论坛。
编 者
2017年3月
评论
还没有评论。