![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| Windows 2000内核模式驱动程序设计 | |||||
作者:李平,张… 文章来源:重庆邮电学院学报 点击数: 更新时间:2007-2-8 ![]() |
|||||
|
摘 要:介绍了Windows 2000驱动程序模型的基本结构、设计和开发的基本问题。并以PCI接口的ATM信令接口卡开发的驱动程序部分为例,简单介绍了驱动程序开发的方法和步骤.并介绍了驱动程序开发环境的设置及编译方法。这种内核模式驱动程序设计的开发过程得到了简化,并降低了其复杂性。
![]() 一个完整的驱动程序要完成以下工作:初始化;创建与删除设备;处理应用层程序的打开和关闭句柄的请求;处理应用层程序的输入/输出请求;串行化对设备的访问;访问硬件;调用其他驱动程序;取消I/O请求;处理可热插拔设备的加入和删除事件;电源管理和WMI;对能够产生中断的设备进行中断处理。 操作系统使用I/O请求包(IRP)的数据结构与内核模式驱动程序通信。IRP是一个内核对象,它是一个预先定义的数据结构,带有一组对它进行操作的I/O管理器例程。I/O管理器接收一个I/O请求后分配并初始化一个IRP。一个IRP有一个固定的首部和可变数目的IRP堆栈单元块,每个堆栈单元块都对应一个将处理该IRP的驱动程序,因此这些堆栈块至少应与驱动程序堆栈中将要处理这一请求的驱动程序数目一样多。每个I/O请求有一个主功能代码(IRP_MJ_XXX),并可能有次功能代码(IRP_MN_XXX)。主功能代码决定了该I/O请求调用的分发例程的驱动程序入口点。分发例程接收到I/O请求后进行如下处理:确认I/O请求的合法性;尽可能在分发例程中直接完成该I/O请求;如果该请求不能在驱动程序的分发例程中被处理完,驱动程序就把这个请求排进队列,以便以后完成处理。WDM驱动程序提供了2种I/O请求排队的方法:I/O管理器管理的系统排队和驱动程序自己管理的驱动程序排队。 在Windows 2000和Windows 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可以与驱动程序的其它部分共享数据和硬件资源,因此需要注意同步问题的处理。 3 WDM驱动程序开发环境及编译 Windows 2000下编写驱动程序的环境被称为DDK For Microsoft Windows 2000或Windows2000 DDK,DDK是一个命令行下的工作环境。在安装DDK前需要先安装Micro-soft VisualC++和Win32 SDK(可选)。对驱动程序的编译可以通过设置VC++的项目设置,在VC++中直接编译驱动程序,但改变设置的工作较繁且易出错,因此DDKbuild.exe编译联接器是构造驱动程序的主要工具。它从配置文件Sources中读出待编译的程序的配置,包括源文件、目标文件等,从环境变量Include中得到引用文件的地址,然后调用VisualC++的编译联接器Nmake.exe进行实际的编译联接工作。 另外,build编译联接器还可以通过查看DIRS文件中的伪指令,确定要编译的驱动程序目录列表。日志文件build.log、build.wrn,build.err中分别记录了编译联接中执行的命令行、遇到的错误和警告。编译完成后的文件后缀为.sys。 驱动程序的调试是在原代码级进行的,可以用微软公司提供的WinDbg调试工具,但需要在两台以串口联接的计算机上进行。而NUMEGA公司的SOFTICE比较方便地在一台计算机上进行核心代码的调试。 4 ATM信令接口卡的驱动例程分析 我们开发的ATM信令接口卡硬件符合PCI2.1标准,其与应用程序的数据传输为DMA方式。主要部分代码如下。 ![]() ![]() ![]() 在该驱动程序入口部分中我们完成了各个分发例程入口的设置工作。 AtmPnp例程中完成对硬件资源的的检测和配置工作,并且初始化请求队列,获得完成DMA传输的DMA适配器对象,挂接中断处理对象等功能。 ![]() ![]() ![]() ![]() ![]() 在AddDevice函数调用IoCreateDevice函数中创建一个设备对象,并通过调用IoAttachDe-viceToDeviceStack把它联接到以PDO为底的设备堆栈中。 在PnP例程中对IRP-MN-START-DEVICE的处理代码如下。 ![]() ![]()
在处理中断资源时给出的IoConnectInterrupt函数挂接了中断处理函数AtmHandlerInter-rupt。 参考文献 [1] CHRISC.Windows WDM设备驱动程序开发指南[M].北京:机械工业出版社,2000. |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|