新闻中心

EEPW首页>嵌入式系统>设计应用> Windows 2000内核模式驱动程序设计

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

作者: 时间:2012-05-15 来源:网络 收藏

2000和98中,通过使用总线程序,PnP管理器能够自动检测硬件和分配I/O资源。在WDM程序中PnP管理器使用主功能代码为IRP-MJ-PNP的I/O请求包与设备程序交换信息和请求,完成对硬件设备的检测和配置工作。PnP请求包完成2种功能:指示驱动程序何时又如何配置和取消硬件及驱动程序本身的设置;指导驱动程序完成一系列的状态转换。PnP请求可以包含二十多个次功能代码,部分功能代码(如IRP-READ-CONFIG,IRP-MN-QUERY-RE-SOURCE-REQUIREMENTS等)只能由总线驱动程序处理,功能驱动程序和过滤驱动程序只是将该IRP请求下传到总线驱动程序。对功能驱动程序和过滤驱动程序中比较重要的IRP-MN-START-DEVICE用来通知功能驱动程序其硬件被赋予了什么的I/O资源,以及指导功能驱动程序做任何必要的硬件或软件设置,以便设备能正常工作。IRP-MN-REMOVE-DEVICE告诉功能驱动程序关闭设备并释放与之关联的设备对象。

驱动程序的ISR和DpcForIsr在设备产生中断时共同向设备提供服务。当设备产生中断时,驱动程序的ISR将被调用,ISR通过询问设备硬件收集有关的硬件设备信息,并尽可能地处理,如果不可能完全处理该中断请求,就将中断信息传递给Dpc-ForIsr进行处理。ISR是运行在DIRQL中断请求级的,在运行时,会阻止在同一处理器上的所有设备发出的具有更低的DIRQL的中断,因此在驱动程序的编写时,ISR应尽可能快地返回控制。另外,ISR可以与驱动程序的其它部分共享数据和硬件资源,因此需要注意同步问题的处理。

3WDM驱动程序开发环境及编译

2000下编写驱动程序的环境被称为DDKForMicrosoftWindows2000或Windows2000DDK,DDK是一个命令行下的工作环境。在安装DDK前需要先安装Micro-softVisualC++和Win32SDK(可选)。对驱动程序的编译可以通过设置VC++的项目设置,在VC++中直接编译驱动程序,但改变设置的工作较繁且易出错,因此DDKbuild.exe编译联接器是构造驱动程序的主要工具。它从配置文件Sources中读出待编译的程序的配置,包括源文件、目标文件等,从环境变量Include中得到引用文件的地址,然后调用VisualC++的编译联接器Nmake.exe进行实际的编译联接工作。

另外,build编译联接器还可以通过查看DIRS文件中的伪指令,确定要编译的驱动程序目录列表。日志文件build.log、build.wrn,build.err中分别记录了编译联接中执行的命令行、遇到的错误和警告。编译完成后的文件后缀为.sys。

驱动程序的调试是在原代码级进行的,可以用微软公司提供的WinDbg调试工具,但需要在两台以串口联接的计算机上进行。而NUMEGA公司的SOFTICE比较方便地在一台计算机上进行核心代码的调试。

4ATM信令接口卡的驱动例程分析

我们开发的ATM信令接口卡硬件符合PCI2.1标准,其与应用程序的数据传输为DMA方式。主要部分代码如下。

在该驱动程序入口部分中我们完成了各个分发例程入口的设置工作。

AtmPnp例程中完成对硬件资源的的检测和配置工作,并且初始化请求队列,获得完成DMA传输的DMA适配器对象,挂接中断处理对象等功能。

在AddDevice函数调用IoCreateDevice函数中创建一个设备对象,并通过调用IoAttachDe-viceToDeviceStack把它联接到以PDO为底的设备堆栈中。

在PnP例程中对IRP-MN-START-DEVICE的处理代码如下。

在处理中断资源时给出的IoConnectInterrupt函数挂接了中断处理函数AtmHandlerInter-rupt。

其他函数实现不再一一介绍。在具体实现的数据的传输、工作的设置等功能与所使用的硬件的寄存器的工作有关。在设计的过程中,应该注意每个例程的运行中断级。在处理I/O请求时,应根据硬件的特性和API的要求决定IRP队列的方式及取消IRP的例程的编写。

在编写驱动程序前,应该尽量了解硬件本身。这包括硬件的总线结构、控制寄存器的访问方式、中断行为、数据传输机制和设备内存等。

5小结

驱动程序的编写是较复杂的过程,因驱动程序是操作系统信任的组件,任何细小的错误可能引起操作系统的崩溃,在驱动程序编写过程中,应该反复测试所写的代码,并遵循驱动程序的规则。总之,开发驱动程序的工作与开发Windows应用程序开发是完全不同的,且与驱动程序紧密相连的硬件都有自己的硬件和软件规范,本文从一般驱动程序概念出发,给出了驱动程序的总体描述和组成部分,并以部分例程代码为例给出了驱动程序的基本组成结构和注意问题。要想能够很好掌握驱动程序开发,最根本是阅读DDK文档并实践编写驱动程序。

c++相关文章:c++教程




评论


相关推荐

技术专区

关闭