OpenSolaris设备驱动原理与开发(网络出版----仅提供Ebook和按需印刷服务)[按需印刷]
内容简介
书籍 计算机书籍
设备的驱动程序通常是了解一个操作系统的重要途径,很多开发工作也是基于此,但目前市场上关于Solaris和设备驱动的书籍,要么偏重于内核原理,要么主要用于应用开发和证书考试,并没有一本针对最新Solaris发布版的兼有原理解释和具体实现讲解的书籍。本书撰写的目的就是为了满足这一市场需求。本书基于OpenSolaris 2009.06,将Solaris在驱动开发方面的技术系统地呈现出来,既有原理的介绍,也有架构实现和使用技巧的分析。本书主要适用于在Solaris上开发驱动程序的软件技术人员和对Solaris驱动程序研究有兴趣的人士。通过本书可以了解到Solaris上设备驱动程序的基本框架,设备驱动的原理及实现,各种重要的内核/驱动接口以及相关用法和知识。书中很多细节的信息对于原理的理解和实际的开发是非常有帮助的。
目录
前言
第1章 概述 1
1.1 Solaris 1
1.2 OpenSolaris 2
1.3 调试工具 14
第2章 Solaris的设备管理 25
2.1 设备的文件操作 25
2.2 设备文件系统(devfs) 25
2.2.1 dv_node 26
2.2.2 通过设备文件系统来配置设备驱动 27
2.3 设备信息结点(dev_info) 29
2.3.1 设备信息结点的属性 31
2.3.2 设备信息结点的生命周期 32
2.4 设备标识 34
2.4.1 devid 34
2.4.2 设备的物理路径 35
2.4.3 设备号(主设备结点,次设备结点) 36
2.5 设备树及其属性 37
2.5.1 Open Firmware简介 37
2.5.2 设备属性 38
2.5.3 总线属性 43
2.6 设备树的管理 43
2.6.1 devfsadm 43
2.6.2 Syseventd 46
2.6.3 驱动配置工具 47
2.7 动态重新配置 47
第3章 Solaris设备驱动程序 50
3.1 设备驱动程序模块 50
3.2 设备驱动程序中的设备管理 52
3.2.1 softstate 52
3.2.2 设备的功能提供 54
3.3 设备驱动程序中的操作 56
3.3.1 设备结点 56
3.3.2 设备的配置 58
3.3.3 设备操作 60
3.4 设备驱动程序中的硬件操作 61
3.4.1 attach() 61
3.4.2 timeout() 65
第4章 Solaris内核多线程与同步 66
4.1 多线程 66
4.1.1 多线程模型 66
4.1.2 线程调度 72
4.1.3 任务队列 77
4.1.4 cyclic子系统 81
4.1.5 callout和timeout 84
4.2 同步机制 87
4.2.1 锁的硬件原理 87
4.2.2 互斥锁 92
4.2.3 条件变量 96
4.2.4 锁的使用 97
第5章 Solaris内核内存 99
5.1 内核内存概述 99
5.1.1 Solaris内核内存虚拟地址空间布局 99
5.1.2 内核堆 103
5.1.3 内核内存分配和管理 103
5.2 slab分配程序 104
5.2.1 概述 104
5.2.2 slab分配程序接口 106
5.2.3 slab分配程序的分层实现 108
5.2.4 slab分配程序缓存统计信息 113
5.3 vmem分配器 115
5.3.1 vmem接口 115
5.3.2 vmem的实现 117
5.4 内核内存的跟踪和调试 119
5.4.1 检查已释放缓冲区:0xdeadbeef 120
5.4.2 使用Redzone进行调试:0xfeedface 120
5.4.3 检测未初始化数据:0xbaddcafe 122
5.4.4 内存分配日志 123
5.4.5 使用高级技巧分析内存 125
5.4.6 使用::kmem_verify找到被破坏
的缓冲区 126
5.4.7 使用分配程序日志功能 127
第6章 PCI 130
6.1 PCI概述 130
6.1.1 I/O总线的发展 130
6.1.2 PCI简介 131
6.2 x86平台PCI设备配置过程 132
6.2.1 PCI资源管理 132
6.2.2 设备枚举 134
6.2.3 设备再编程 139
6.3 PCI空间访问 141
6.3.1 字节序 141
6.3.2 设备访问的数据一致性 146
6.3.3 设备访问机制 147
第7章 Solaris中断 152
7.1 Solaris上的中断简介 152
7.2 MSI和MSI-X 153
7.2.1 MSI 154
7.2.2 MSI-X 155
7.2.3 MSI和MSI-X的异同 157
7.2.4 MSI消息地址和消息数据 157
7.3 x86上的中断机制及Solaris中x86
中断的实现 159
7.3.1 x86体系结构中的中断和异常
处理机制 159
7.3.2 x86系统中的中断控制器 159
7.3.3 Solaris对x86系统中断的支持 162
7.4 SPARC系统上的中断机制及
Solaris中SPARC中断的实现 167
7.4.1 SPARC处理器在硬件实现上对中断
的支持 167
7.4.2 SPARC系统上的中断控制器 169
7.4.3 Solaris对SPARC系统中断的支持 170
7.5 Solaris上软中断的实现 175
7.5.1 x86系统中软中断的实现 175
7.5.2 SPARC系统中软中断的实现 178
7.6 Solaris中和中断相关的DDI/DKI 181
第8章 DMA 186
8.1 DMA概述 186
8.1.1 SG表和DMA控制器 186
8.1.2 DVMA和IOMMU 187
8.1.3 DMA的数据一致性 190
8.2 Solaris的DMA模型 194
8.2.1 DMA的属性 194
8.2.2 DMA模型概述 195
8.2.3 DMA对象 197
8.3 DMA绑定过程 199
8.4 DMA的同步 202
8.5 DMA内存分配机制 203
8.5.1 ddi_dma_mem_alloc()接口定义 203
8.5.2 x86平台DMA内存分配 203
第9章 电源管理 207
9.1 关于电源管理 207
9.2 电源管理的设计与实现 208
9.3 系统的电源管理 210
9.4 设备的电源管理 215
9.4.1 成员 215
9.4.2 属性 216
9.4.3 设备的电源管理过程 216
第10章 FMA(Solaris故障管理) 221
10.1 FMA原理和架构 221
10.1.1 Solaris FMA模型 221
10.1.2 故障边界 223
10.1.3 错误处理、故障诊断和响应 224
10.1.4 资源命名和事件协议 224
10.2 Solaris故障管理的实现 233
10.2.1 故障管理器fmd概述 233
10.2.2 系统拓扑 236
10.2.3 eversholt故障诊断语言 238
10.3 设备驱动程序中的FMA支持 238
10.3.1 FMA资源初始化 239
10.3.2 IO设备内部错误 241
10.3.3 IO访问和DMA错误 246
附录1 设备驱动(testdrv)的Makefile 252
附录2 dummy驱动程序 255
附录3 和中断相关的函数使用举例 258
参考文献 261
前言
Solaris,作为UNIX操作系统的重要衍生版本之一,随着2005年其源代码的开放 (OpenSolaris),不仅用于传统的服务器/工作站上,也逐渐地应用在普通的PC或笔记本上。作为Sun公司(现在是Oracle)的重要软件产品,其具有良好的架构和许多创新的特性,因此越来越多的人和企业开始使用、学习和研究Solaris。
Sun Microsystems中国工程研究院(ERI)Solaris设备驱动研发部是在2003年成立的。自成立之初,就经常会有一些针对新员工的技术培训,使新的技术人员能够快速理解Solaris的特性、框架和各种设备驱动的开发技术等。虽然平时工作任务繁多,但大家仍坚持利用业余时间来从事本书的写作。本书写作过程中,工程师以严谨的工作作风和认真的求实态度,力求专业和准确。
在讲解过程中,本书注重对内部原理进行深入浅出的解释,同时对其设计结构与具体实现加以必要剖析,一些重要接口附以相关的示范用例,而且针对一些开发中的重要问题,会选取一些典型应用对其根源、解决思路等进行深入阐述。力求使读者对Solaris设备驱动的实现原理、整体架构和开发实践有全面的理解,做到不仅知其然,还要知其所以然。
非常感谢张强组织了本书的编写,冯翌坤、张强、刘澎、游湘涛、王秀燕负责了具体章节的写作。第1章由冯翌坤编写,简要描述了Solaris的运行环境、模块结构和调试工具。第2章由张强编写,具体地阐述了Solaris内核是如何组织和管理各种设备,包括设备文件系统、设备结点及相关配置工具等。第3章由冯翌坤编写,以一个伪设备的驱动程序为例,讲解了 Solaris设备驱动的大致结构、各个功能入口以及驱动开发中的重要知识点。第4章由刘澎编写,描述了Solaris内核的多线程模型和调度方案,以及开发中常用锁的原理和使用技巧。第5章由游湘涛编写,讲述了在设备驱动开发中用到的关于内核内存的接口、内部原理和使用技巧。第6章由刘澎编写,介绍了PCI总线、设备枚举和PCI的空间访问。第7章由王秀燕编写,重点描述了Solaris的中断机制,以及在x86和SPARC平台上的实现,同时还介绍了常用到的一些中断的DDI/DKI,并附有代码示例。第8章由刘澎编写,阐述了Solaris上DMA的模型和相关机制(绑定、同步以及内存分配),对于想了解系统和设备之间是如何进行DMA数据传输的读者是很有帮助的。第9章由冯翌坤编写,介绍了电源管理在系统和设备两个方面的设计与实现。第10章由游湘涛编写,介绍了Solaris上故障管理(FMA)。包括其原理、架构、实现,以及在设备驱动开发中如何支持FMA。本书的一些章节会涉及Solaris内核的一些知识,但重点仍是放在与设备驱动相关的方面。如需要更多地了解Solaris内核,可参阅《Solaris Internals》等书籍。
本书在写作过程中得到了很多ERI同事的帮助。Paul Lee、王睿、叶诚、杨勇、徐华卓和各位编者仔细地阅读了各个章节,并提出了宝贵的意见。同时感谢机械工业出版社华章公司的温莉芳女士、陈冀康和李东震编辑的支持。
虽然本书的写作小组付出了很多的努力,但随着技术的飞速发展,加之我们的水平有限,书中难免会有一些疏漏和不足,希望能得到广大读者的意见和建议。
Sun中国工程研究院院长 宋向军
2010年2月3日