当前位置:文档之家› 《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》大作业

《设备驱动程序开发技术》大作业WDM驱动程序的开发流程和要点班级:计算机科学与技术1004摘要DWDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。

它源于 Windows NT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、电源管理( PM ,Power Management )、Windows管理诊断( WMI ,Windows Management Instrumentation )和 NT 事件。

它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM将成为主流的驱动模式。

WDM是Windows98和Windows2000使用的新的驱动程序设计规范。

使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。

除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。

关键词: WDM、驱动程序、操作系统1 概述WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。

相对于以前的KDM、VXD来说,它的性能更高、系统之间移植更加方便。

随着Microsoft的操作系统的不断升级,WDM已逐步取代了KDM、VXD,成为了Microsoft系统下驱动程序开发的主流。

WDM是通过一个128位的全局唯一标识符(GUID)实现驱动程序的识别。

应用程序与WDM 驱动程序通信时,应用程序将每个用户请求形成I/O请求包(IRP)发送到驱动程序。

驱动程序识别出IRP请求后指挥硬件执行相应操作。

2 WDM驱动模型WDM模型为存在于Windows 98和Windows 2000操作系统中的设备驱动程序提供了一个参考框架。

尽管对于最终用户来说这两个操作系统非常相似,但它们的内部工作却有很大不同。

Windows 2000概述图1是以我的视点所看到的Windows 2000操作系统,该图着重了驱动程序开发者所关心的特征。

软件要么执行在用户模式中,要么执行在内核模式中。

当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。

Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。

在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile 函数。

然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。

图1 windows2000系统结构我们经常说NtReadFile是I/O管理器的一部分。

“I/O管理器(I/O Manager)”这个术语多少有些误导,系统中并不存在名为“I/O管理器”的单独执行模块。

但当我们讨论围绕在驱动程序周围的操作系统服务“云”时,我们需要使用一个名字来代表,而“I/O管理器”就是我们通常使用的名字。

系统中还有许多与NtReadFile相似的服务例程,它们同样运行在内核模式中,为应用程序请求提供服务,并以某种方式与设备交互。

它们首先检查传递给它们的参数以保护系统安全或防止用户模式程序非法存取数据,然后创建一个称为“I/O请求包(IRP)”的数据结构,并把这个数据结构送到某个驱动程序的入口点。

在刚才的ReadFile调用中,NtReadFile 将创建一个主功能代码为IRP_MJ_READ(DDK头文件中的一个常量)的IRP。

实际的处理细节可能会有不同,但对于NtReadFile例程,可能的结果是,用户模式调用者得到一个返回值,表明该IRP代表的操作还没有完成。

用户模式程序也许会继续其它工作然后等待操作完成,或者立即进入等待状态。

不论哪种方式,设备驱动程序对该IRP的处理都与应用程序无关。

执行IRP的设备驱动程序最后可能会访问硬件。

对于PIO方式的设备,IRP_MJ_READ操作将导致直接读取设备的端口(或者是设备实现的内存寄存器)。

尽管运行在内核模式中的驱动程序可以直接与其硬件会话,但它们通常都使用硬件抽象层(HAL)访问硬件。

读操作最后会调用READ_PORT_UCHAR从某个I/O口读取单字节数据。

HAL例程执行的操作是平台相关的。

在Intelx86计算机上,HAL使用IN指令访问设备端口,在Alpha计算机上,HAL使用内存提取指令访问设备实现的内存寄存器。

驱动程序完成一个I/O操作后,通过调用一个特殊内核模式服务例程来完成该IRP。

完成操作是处理IRP的最后动作,它使等待的应用程序恢复运行。

WINDOWS 98概述图2显示了Windows 98的基本结构。

其操作系统内核称为虚拟机管理器(VMM),因为它的主要工作就是创建“虚拟”机器,这些虚拟机器共享同一个物理机器。

Windows3.0引入虚拟设备驱动程序(VxD)的原始目的就是为了虚化设备,以帮助VMM实现每个虚拟机器都拥有全部硬件的假象。

VMM架构也被引入Windows 98,并能处理新硬件和32位应用程序。

图2 windows 98系统结构Windows 98不能像Windows 2000那样整洁地处理I/O操作。

在处理磁盘操作、通讯口操作、键盘操作,等等方面与Windows 2000有很大不同。

Windows 98以两种完全不同的方式为32位应用程序和16位应用程序提供服务。

见图3。

图3 windows 98中的I/O请求图3的左侧显示了32位应用程序的I/O请求处理过程。

应用程序调用的Win32API(例如ReadFile)是系统DLL(如KERNEL32.DLL)中的服务例程,但应用程序仅能用ReadFile读磁盘文件、通讯口,和有WDM驱动程序的设备。

对于其它种设备,应用程序必须使用基于DeviceIoControl的特殊方式。

并且Windows 98的系统DLL含有与Windows 2000不同的代码。

ReadFile的用户模式部分(如参数检验,Windows 2000在内核中实现)使用某个专用机制到达内核模式驱动程序。

磁盘文件操作使用一种机制,串行口操作使用另一种机制,而WDM设备也有自己专用的机制进入内核。

所有这些机制都利用软件中断30h来实现用户模式到内核模式的转换,但它们之间又完全不同。

图3的中间显示了16位Windows应用程序的I/O请求处理过程,右侧是MS-DOS应用程序的I/O请求处理过程。

在这两种形式中,用户模式应用程序直接或间接地调用了用户模式的驱动程序,原理上,这些用户模式驱动程序可以直接操作机器硬件而不用其它系统部件支持。

例如,Win16程序通过调用名为COMM.DRV的16位DLL间接地执行串行口I/O。

(到Windows 95为止,COMM.DRV仍是一个单独的驱动程序,它挂在IRQ3和IRQ4上,直接向串行口芯片发出IN和OUT指令) 虚拟通信(指虚拟机器之间的沟通)设备(VCD)驱动程序通过截获I/O端口操作来保证两个虚拟机不同时访问相同的端口。

如果以一种神秘的方式思考这个过程,你可以这样认为,用户模式驱动程序使用了一个基于I/O截获操作的“API”,像VCD这样的“虚拟化”驱动程序就是通过冒充硬件操作来实现假API服务的。

Windows 2000的所有内核模式I/O操作都使用一个公用的数据结构(IRP)。

而Windows 98没有达到这样高度统一,其串行口驱动程序要遵从由VCOMM.VXD规定的port驱动程序函数调用规范,而磁盘驱动程序则遵从IOS.VXD实现的包驱动层次架构。

其它设备类驱动程序也有其它的实现方式。

如果要把WDM引入Windows 98,就必须使Windows 98内部架构与Windows 2000非常类似。

Windows 98包含了NTKERN.VXD(VMM32.VXD)系统模块,该模块含有大量Windows NT内核支持函数的Windows实现。

NTKERN.VXD使用与Windows 2000相同的方式创建IRP并发送IRP到WDM驱动程序。

实际上,WDM驱动程序几乎区别不出这两个环境的不同。

Windows 2000系统可以使用多种驱动程序,图4显示了其中几种。

图4Windows2000中的设备驱动程序种类∙虚拟设备驱动程序(VDD)是一个用户模式部件,它可以使DOS应用程序访问x86平台上的硬件。

VDD通过屏蔽I/O权限掩码来捕获端口存取操作,它基本上是模拟硬件操作,这对于那些直接对裸机硬件编程的应用程序特别有用。

尽管这种驱动程序在Windows 98和Windows 2000中共享一个名称并且有相同的功能,但实际上它们完全不同。

我们用VDD缩写代表这种驱动程序,用VxD缩写代表Windows 98中的虚拟设备驱动程序以示区别。

∙内核模式驱动程序的分类包含许多子类。

PnP驱动程序就是一种遵循Windows 2000即插即用协议的内核模式驱动程序。

准确地说,本书涉及的所有内容都是面向PnP驱动程序的。

∙WDM驱动程序是一种PnP驱动程序,它同时还遵循电源管理协议,并能在Windows 98和Windows 2000间实现源代码级兼容。

WDM驱动程序还细分为类驱动程序(class driver)和迷你驱动程序(minidriver),类驱动程序管理属于已定义类的设备,迷你驱动程序向类驱动程序提供厂商专有的支持。

∙显示驱动程序是用于显示和打印设备的内核模式驱动程序。

∙文件系统驱动程序在本地硬盘或网络上实现标准PC文件系统模型(包括多层次目录结构和命名文件概念)。

∙遗留设备驱动程序也是一种内核模式驱动程序,它直接控制一个硬件设备而不用其它驱动程序帮助。

这种驱动程序主要包括Windows NT早期版本的驱动程序,它们可以不做修改地运行在Windows 2000中。

3 WDM驱动程序模型在WDM驱动程序模型中,每个硬件设备至少有两个驱动程序。

其中一个驱动程序我们称为功能(function)驱动程序,通常它就是你认为的那个硬件设备驱动程序。

它了解使硬件工作的所有细节,负责初始化I/O操作,有责任处理I/O操作完成时所带来的中断事件,有责任为用户提供一种设备适合的控制方式。

另一个驱动程序我们称为总线(bus)驱动程序。

它负责管理硬件与计算机的连接。

例如,PCI总线驱动程序检测插入到PCI槽上的设备并确定设备的资源使用情况,它还能控制设备所在PCI槽的电流开关。

相关主题