
驱动开发相关入门课.doc
26页驱动开发相关入门课驱动开发相关入门课驱动开发相关入门课 目前,由于需要支持新的业务和新的 PC 外部设备类型对驱动程序开发造成了新的挑战新型总线增加了设备的数量和对设备驱动程序的需求设备上各种功能的不断增加使驱动程序的开发变得越来越复杂同时,快速反应的交互式应用程序要求将软件和硬件紧密的结合在一起1997 年,在用于 Windows 95 和 Windows NT 的统一的Win32 驱动程序模型(WDM)有了进一步的发展,将这些因素全部考虑在内WDM 允许使用一个单一的驱动程序源(x86 二进制)来同时在 Windows 95 和 Windows NT 中实现对新的总线和新设备的支持 WDM 的关键目标是通过提供一种灵活的方式来简化驱动程序的开发,使在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性WDM 还必须为即插即用和设备的电源管理提供一个通用的框架结构WDM 是实现对新型设备的简便支持和方便使用的关键组件 为了实现这些目标,WDM 只能以 Windows NT I/O 子系统提供的一组通用服务为基础WDM 改进了由一组核心扩展构成的功能实现对即插即用、设备电源管理、和快速反应 I/O 流的支持。
除了通用的平台服务和扩展外,WDM 还实现了一个模块化的、分层次类型的微型驱动程序结构类型驱动程序实现了支持通用总线、协议、或设备类所需的功能性接口类驱动程序的一般特性是为逻辑设备的命令设置、协议、和代码重用所需的总线接口实现标准化提供必要的条件WDM 对标准类接口的支持减少了 Windows 95 和 Windows NT 所需的设备驱动程序的数量和复杂性 微型驱动程序允许通用类驱动程序的扩展实现对特定设备协议或物理编程接口的支持例如,一个微型驱动程序可以被用于实现对IEEE 1394 总线类驱动程序的扩展,用于对特定主机控制器编程接口的支持微型驱动程序非常易于开发,因为它们可以通过简单的扩展通用的类驱动程序接口功能来实现尽管微型驱动程序设计简便,但是重复使用微型驱动程序模块所带来的优点也可以通过对标准设备编程接口的支持来实现USB 主机控制器接口(OpenHCI 或UHCI)就是这方面的一个例子 模块化的 WDM 体系结构灵活统一的接口使操作系统可以动态的配置不同的设备驱动程序模块来支持特定的设备模块化的 WDM 体系结构灵活统一的接口使操作系统可以动态的配置不同的驱动程序模块来支持特定的设备。
一个典型的驱动程序堆栈由通用设备、协议、和用特定协议和特定总线的微型驱动程序联接的总线类驱动程序构成例如,操作系统可以配置一个驱动程序堆栈来支持这样一个照相机,它的命令是用图象类定义的,并且它是根据来自 IEEE 1394总线类的功能控制协议(FCP)类而发表的这种灵活性还使其可以很容易的支持一个多功能设备,仅需简单的实现一个微型驱动程序将多功能硬件与几个设备类的接口相连接动态构造 WDM 驱动程序堆栈是实现即插即用设备支持的关键 WDM 服务使实现一个用于 Windows NT 和 Windows 95 快速反应的模型成为可能WDM 提供了多个执行优先级包括核心态和非核心态线程、IRQ 级别、和被延缓的程序调用(DPC) 所有的 WDM 类和微型驱动程序都作为核心态(第 0 层)的特权级线程(不会被 CPU 调度程序中断)执行32 个 IRQ 级可以被用于区分硬件中断服务的优先级对于每个中断,DPC 被排入队列等到被启用中断的 IRQ 服务例程完成后再执行DPCs 通过有效的减少中断被禁止的时间,使系统对中断的响应获得了很大的提高对于使用多处理器的基于 x86 的PC 系统,在 Windows NT 下对中断的支持是以 Intel 的多处理器规范 1.4 版本为基础的。
对于需要活动的多媒体的应用程序,WDM 在核心态提供了快速反应的接口来处理 I/O 流WDM 的流接口是通过标准的 WDM 类接口提供出的对于 WDM,一个多媒体流完全可以用一个或多个软件过滤器和设备驱动程序来处理为了加速对 I/O 流的处理,WDM 流可以直接对硬件进行访问,避免了由于进行非核心态和核心态之间的转换而造成的延迟,并且还省取了对中间 I/O 缓冲区的需要 要充分利用 WDM 提供的优点,建议你使用即插即用兼容的电源管理输入、声音、图形、和使用 USB 和 IEEE 1394 的存储外围设备 WDM 驱动程序设计之基础知识篇WDM(Win32 Driver Model) ,即 Win32 驱动程序模型,是Microsoft 力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性除了通用的平台服务和扩展外,WDM 还实现了一个模块化的、分层次类型的微型驱动程序结构(见图 1) 类型驱动程序实现了支持通用总线、协议或设备类所需的功能性接口类型驱动程序的一般特性是为逻辑设备的命令设置、协议和代码重用所需的总线接口实现标准化提供必要的条件。
WDM 对标准类接口的支持减少了 Windows 95 和 Windows NT 所需的设备驱动程序的数量和复杂性Windows 2000 也引入了 WDM 驱动程序构架虽然 WDM图 1目前实际应用还不多,但是相信在不久的将来,在 Windows 平台上,WDM 将成为 21 世纪主流的驱动模式1)Windows 操作系统Windows 98 不像 Windows 2000 那样非常有规律的处理 I/O 操作(见图 2) 应用程序调用 Win32 API,而且仅当读硬盘文件、通信端口和有 WDM 驱动程序的设备时才调用相应的 Win32 API,对其它设备必须使用特定的机制全部 Windows 2000 的内核模式 I/O 操作都使用一个共同的数据结构(IRP) ,Windows 98 不具备这一特点,应用程序请求更达不到内核模式不过,当谈到 WDM 驱动程序的时候,Windows 98 内部的体系结构与 Windows 2000 是非常相似的系统模块(NTKERN.VxD)包括大量 Windows NT 内核支持函数,它完成请求包 IRPs 的创建,把它们发送给 WDM 驱动程序,从这一点考虑,两个环境之间不存在差异。
图 2(2)WDM 特性模块化的 WDM 体系结构中灵活统一的接口,使操作系统可以动态地配置不同的驱动程序模块来支持特定的设备一个典型的驱动程序堆栈由通用设备、协议及特定协议和特定总线的微型驱动程序联接的总线类驱动程序构成动态构造 WDM 驱动程序堆栈是实现即插即用设备支持的关键WDM 服务使实现一个用于 Windows NT 和 Windows 95 快速反应的模型成为可能WDM 提供了多个执行优先级,包括核心态和非核心态线程、IRQ 级别和被延缓的程序调用(DPC) 所有的 WDM 类和微型驱动程序都作为核心态(第 0 层)的特权级线程(不会被 CPU 调度程序中断)执行32 个 IRQ 级可以被用于区分硬件中断服务的优先级对于每个中断,DPC 被排入队列等到被启用中断的 IRQ 服务例程完成后再执行DPCs 通过有效的减少中断被禁止的时间,使系统对中断的响应获得了很大的提高对于使用多处理器的基于 x86 的PC 系统,在 Windows NT 下对中断的支持是以 Intel 的多处理器规范 1.4 版本为基础的对于流媒体应用程序,WDM 在核心态提供了快速反应的接口来处理I/O 流。
WDM 的流接口是通过标准的 WDM 类接口提供出的3)WDM 工作原理WDM 支持 USB、IEEE 1394、ACPI 等全新的硬件标准而且以往在两个平台上同时运行时需要编写两个截然不同的驱动程序,现在只需要编写一个 WDM 驱动程序就可以了WDM 驱动程序也是分层的,即不同层上的驱动程序有着不同的优先级,而 Windows 9x 下的 VxD 则没有此结构另外,WDM 还引入了功能设备对象 FDO(FuncTIonal Device Object)与物理设备对象 PDO(Physical Device Object)两个新类来描述硬件,一个 PDO 对应一个真实硬件另外值得注意的是,一个硬件只允许有一个 PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的 PDO 与 FDO在Ring-3 与 Ring-0 通讯方面,系统为每一个用户请求打包形成一个IRP 结构,将其发送至驱动程序,并通过识别 IRP 中的 PDO 来区别是发送给哪一个设备的另外,在驱动程序的加载方面,WDM 不通过驱动程序名称识别,而是通过一个 128 位的 GUID 来实现驱动程序的识别4)WDM 与其它驱动程序的比较写 WDM 和其它模式驱动程序基本上是相同的,代码中的主要区别在于如何创建设备。
在 WDM 驱动程序中,即插即用(PnP)管理器告知何时向系统添加一个设备,或者从系统删除设备PnP 管理器使用安装的 INF 文件查找新设备的正确驱动程序;而其它模式驱动程序必须发现它自己的设备,使用专门的安装程序安装另外在细节上也存在很多区别,其它模式驱动程序参数一般由注册表提供,在 DriverEntry 里调用读注册表的函数,然后根据注册表再调用 CreateDevice,但是 WDM 一般不是这样,这是由于 Windows 2000 下支持 PnP,在加载的时候会发 PnP 消息给 Driver,所以一般不需要在 DriverEntry 里调用 CreateDevice,而是在 AddDevice 里创建,或者在 PnP 消息里创建一般在 DriverEntry 里创建的是一个与设备或者对象毫无关系的虚拟设备,用于管理与 Win32 的通讯如果不想对该设备做什么特别的处理,或者设备不复杂,AddDevice可以简单返回 Nt_Success,不用调用 CreateDevice另外整个设备驱动树也发生了改变,从而使安装程序发生了很大的改变WDM 驱动程序设计:基础知识篇、环境构造篇、设计开发篇、编译安装篇。
WDM 驱动程序设计之环境构造篇要想开发 WDM 驱动程序,我们必须首先安装 DDK(设备驱动程序开发包) ,WDM 开发环境的设置相对比较麻烦,大多数开发人员偏爱用Visual Studio 进行开发,而 VC++有一些非常有用的工具安装 DDK下面笔者将详细介绍在 Windows 98、Windows NT 和 Windows 95 下DDK 的安装方法1.Windows 98 DDK 的安装这一部分描述安装 Windows 98 DDK 的方法约定%98DDK%为安装的Windows 98 DDK 的根目录;%MSTOOLS%为微软 SDK 平台的根目录;%VCPPDEV%为安装的 VC++的根目录开发环境使用 DDK 的软件平台通常为 Windows 98 操作系统和 VC++ 4.2 or 5.0版本,若要编译视频捕获则需要 VC++ 5.0 版本在安装 Windows 98 DDK 之前,必须先安装 VC++编译器/开发环境,否则运行时,Windows 98 DDK 的 Setenv.bat 批处理文件将不能建立正确的环境安装 DDK 资料需要 IE 4.01 或以上版本,如果是从光盘或测试驱动程序则需要光驱,16MB 内存是不可少的,完整安装需要 82MB 硬盘容量。
包括 Windows 98 DDK 在内的所有例子驱动程序都不需要在安装的SDK 平台下构造不过,如果你开始开发自己的驱动程序,可能需要的不是 Windows 98 DDK 中的头文件,而是 SDK 平台中的头文件,因此可以考虑两种方法:拷贝所需的头文件或 SDK 平台的文件到在%98DDK%和%VCPPDEV%下适当的 Include 目录中;也可以直接安装 SDK平。
