微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Windows 2000内核模式驱动程序设计

Windows 2000内核模式驱动程序设计

时间:05-15 来源:互联网 点击:

摘要:介绍了Windows2000驱动程序模型的基本结构、设计和开发的基本问题。并以PCI接口的ATM信令接口卡开发的驱动程序部分为例,简单介绍了驱动程序开发的方法和步骤.并介绍了驱动程序开发环境的设置及编译方法。这种内核模式驱动程序设计的开发过程得到了简化,并降低了其复杂性。

关键词:Windows2000;驱动程序模型;ATM信令接口

0引言

设备驱动程序是直接同硬件打交道的软件模块。在Windows2000中,微软公司在WindowsNT4.0的驱动程序结构基础上,同时引入了Windows9X的即插即入特性,推出了新的驱动程序结构模式(WDM)。WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。在Windows2000中的驱动程序可以分为2大类:用户模式驱动程序和内核模式的驱动程序。用户模式驱动程序是与子系统特定相关的,它包含了Win32多媒体驱动程序、支持MS-DOS应用程序的虚拟设备驱动程序VDD(VirtualDeviceDriver)。内核模式驱动程序有3种基本类型,每一种都有稍微不同的结构和完全不同的功能,即最高层驱动程序(如文件系统驱动程序(FSD))、中间层驱动程序(例如虚拟磁盘、镜像或设备类型特定的外围设备)、底层驱动程序(例如PnP硬件总线驱动程序)。在Windows2000操作系统下的驱动程序开发分为3个主要的领域:WDM驱动程序、文件系统驱动程序和小端口驱动程序,见图1。其中小端口驱动程序针对的是显示设备、SCSI和网络设备等特定领域;文件系统驱动程序针对的是存储设备;WDM驱动程序针对的则是计算机应用系统开发所面对的大多数情况。本文我们讨论了WDM内核模式的驱动程序设计的一般问题,虽然其他类型驱动程序与WDM内核模式驱动程序开发有所不同,但只要掌握了WDM内核模式驱动程序开发的基础,结合2种基本类型的本身特点,就能够很快掌握设计方法。

1WDM的基本原理

WDM是一个模块化的、分层次类型的微型驱动程序结构,层次结构如图2所示,其中左边是一个设备对象堆栈,右边为驱动程序的分层结构。在WDM驱动程序模型中,每个硬件至少要包含功能驱动程序和总线驱动程序2个层。总线驱动程序为总线上发现的每个设备创建物理设备对象PDO,每个功能设备驱动程序创建自己的功能设备对象FDO。在驱动程序中不是直接操作硬件,而是操作相应的PDO与FDO。来自用户模式API的I/O请求包(IRP)送到设备堆栈的最上层驱动程序,然后逐渐过滤到下层的驱动程序。每一层驱动程序都可以决定如何处理IRP。内核模式的WDM驱动程序有着可移植性、可配置性、基于对象、包驱动等共有的属性。

用户态程序和内核通过设备对象访问设备驱动程序的设备。WDM驱动程序有2种方法提供

Win32程序可用的名称,旧的方法是在驱动程序的设备创建时,通过函数IoCreate-SymbolicLink创建一个符号链接名,新的方法是使用128位的设备接口标识(GUID)。在驱动程序编写中,该GUID可以通过Windows提供的guidgen.exe工具生成。

2WDM驱动程序的结构及设计

内核模式的驱动程序不同于常规的应用程序,可以把一个完整的驱动程序看作是一个容器,它包含许多例程,当操作系统遇到一个IRP时,它就调用这个容器中的例程来执行该IRP的各种操作。图3表示了这一概念。在每一个WDM驱动程序中,都必须拥有DriverEntry、AddDevice、DispatchPnP、DispatchPower和DispatchWmi这5个例程,其他的例程则是可选的。需要对IRP排队的驱动程序一般都有一个StartIo例程,执行DMA传输的驱动程序应有一个AdapterControl例程。大部分能生成硬件中断的设备,其驱动程序都有一个中断服务例程(ISR)和一个延迟过程调用(DpcForIsr)例程。驱动程序一般都有几个支持不同类型IRP的分发例程。WDM驱动程序开发者的主要任务就是为如图3所示的容器选择,并完成所需要的例程。

当I/O管理器装入驱动程序时,它调用每个驱动程序必须有的DriverEntry例程,以用来初始化驱动程序范围的数据结构和资源。一般来说,在DriverEntry例程中通常完成以下功能:①找到所要控制的硬件;②在驱动程序对象中设置驱动程序的Dispatch-,AddDevice,Startio(如果有)和UN-LOAD(如果有)等分发例程的程序的入口点;③建立所有驱动程序对象或其他系统资源;④返回的NTSTATUS表明驱动程序是否成功装入,并能接收和处理来自PnP管理器的配置、增加(AddDevice)及启动其设备的请求。对于功能驱动程序,AddDevice函数的基本职责是创建一个设备对象并把它联接到以PDO为底的设备堆栈中。分发(Dispatch)例程是

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top