Windows 2000XP下IO设备驱动程序的设计.doc_第1页
Windows 2000XP下IO设备驱动程序的设计.doc_第2页
Windows 2000XP下IO设备驱动程序的设计.doc_第3页
Windows 2000XP下IO设备驱动程序的设计.doc_第4页
Windows 2000XP下IO设备驱动程序的设计.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

windows 2000/xp下i/o设备驱动程序的设计摘要:本文介绍了windows 2000/xp下wdm驱动程序的基本设计方法;阐述了i/o设备驱动程序的基本构成,硬件资源的配置和访问的方法;提出了设备驱动程序在实际应用中的层次化结构。关键词:wdm;设备驱动程序;i/o端口;dlldesign of i/o device driver under windows 2000/xpabstract:this paper introduce the primary designing methods of wdm driver under windows 2000/xp. it describe the basic structure of an i/o device driver, and the method of configing and accessing the hardware resources. it also put forward the layered structure of device driver in the real implement. keyword:wdm;device driver; i/o port; dll1 引言在开发微机应用系统的过程中,尤其是在控制系统中,通常会遇到在windows环境下对具有特定功能的硬件设备(如数据采集卡),进行直接访问和控制的问题。因为在windows操作系统下,cpu运行于保护模式,并且统一管理硬件资源,执行于用户态的应用程序不能直接访问硬件,而是通过调用执行于核心态的设备驱动程序提供的各种服务间接地对硬件资源进行访问,这一机制确保了系统的安全。所以,以前在dos和windows 98下可以很容易完成的i/o端口读写,在windows 2000/xp下必须编写驱动程序,才能够实现。由于各种操作系统结构的不同影响了设备驱动程序的兼容性,为此微软公司在1997提出了一种全新的windows驱动程序模型(wdm),并在推出windows 2000操作系统时正式引入了这一技术。wdm以windows nt4.0的内部结构为基础,同时引入了windows 9x的即插即用特性,为存在于windows 9x和windows 2000操作系统中的设备驱动程序提供了一个统一的参考框架1。在windows 98/me,windows 2000和更高版本的操作系统上运行的设备驱动必须是wdm驱动4。2 wdm驱动程序的基本结构可以把一个完整的wdm驱动程序看作一个容器,其中包含了许多子例程,操作系统调用这个容器中的例程来执行针对irp(i/o请求包)的各种操作,图1表示了这一概念。基本驱动程序 i/o控制 分发例程drvierentryadddevicestartioadaptercontroloninterruptdpcforisrdispatchpnpdispatchpowerdispatchwmidispatchreaddispatchwriter 必须的驱动例程 处理排队请求应包括startio 如果设备有中断应包括oninerrupt和dpcforisr 对dma操作应包括adaptercontrol 可选的分发例程图1 wdm驱动程序可执行包中的内容2在每一个驱动程序中,都包括driverentry、adddevice和几种irp分发例程。需要对irp排队的驱动程序一般都有startio例程;执行dma传输的驱动程序应有一个adapercontrol例程;大部分能产生硬件中断的设备,需要有一个中断服务例程(interrupt service routine,isr)和一个延迟过程调用(deferred procedure call,dpc)例程。多数的驱动程序都还有几个支持不同类型irp的分发例程。wdm开发人员的任务之一就是选择自己特定驱动中需要的例程2。3. 设备的创建和初始化驱动程序向操作系统显露名为driverentry的函数,driverentry例程只在驱动程序第一次被装入时执行一次,但是一个驱动程序可以被多个实际设备利用,所以wdm驱动程序有一个特殊的adddevice函数,pnp管理器为每个设备实例调用该函数。创建设备可以在adddevice函数中实现,它的主要任务是为建立和启用的设备,建立一个符号链接名或者注册设备接口,将当前驱动程序添加到设备栈中。4. 硬件的访问pnp管理程序调用的adddevice函数只初始化设备(及设备扩展)对象,并没有接触硬件,硬件资源的保留和配置在接受专门的irp函数(和子函数)代码时执行。当驱动程序接收到pnp子码irp_mn_start_device时,irp堆栈列表内的两个字段allocatedresourcestranslated和allocatedresources,列出分配的资源。用来描述这些资源的结构是cm_partial_resource_list类型,它包括一个cm_partial_resource_descriptor结构的计数数组,如图2所示。versionrevisioncounttypesharedispositionflagutypesharedispositionflagpartialdescriptors0partialdescriptors1u图 2 部分资源列表数据结构2数组中每一个资源描述符都有一个type成员,它表示所代表的资源的类型。主要有4个重要的共同体类型是port(端口)、interrupt(中断),memory(内存),dma(直接内存访问)。在接收到资源列表之后,应该存储资源信息,以便后面的使用。程序实现的部分代码如下:for (i = 0; i count; i+, resource+, resourcetrans+) switch (resource-type) case cmresourcetypeport: deviceinfo-portwasmapped = false; deviceinfo-portbase = (pvoid)resourcetrans-u.port.start.lowpart; /i/o端口地址的基地址 deviceinfo-portcount = resourcetrans-u.port.length; /端口长度 break;case cmresourcetypememory: 得到了设备的i/o地址,就可以对设备进行读取了,在读写端口地址和内存时应该使用标准的内核读取例程,在wdm中应使用hal宏,如:read_port_uchar, write_port_uchar等。这样就可以不用考虑不同操作平台的特性,也可以更好的适应windows 2000多任务,多进程环境的要求。例如如果我们要写端口201h,端口资源的基地址是200h,实现程序可以如下:write_port_uchar( (pushort)(ulong_ptr)pldi-portbase + nport), *(pushort)piobuffer ); /向端口写一个字节数据5. 硬件资源的分配硬件资源是在驱动程序装入时,根据安装文件进行分配的,所以在要使驱动正常工作必须编辑自己的安装文件,安装文件是以inf为扩展名的文件,它包含了wdm设备驱动程序的制造商信息、要复制的文件列表、要创建的注册表项等。笔者编写的驱动用到的硬件资源占用240h243h的端口地址。所以在安装文件中,资源分配节如下:portio_inst.ntcopyfiles=portio.copyfileslogconfig=portio.lc0 ;指向资源分配节portio.lc0 ;资源分配节configpriority=desired ioconfig=240-243inf安装文件向操作系统添加了硬件资源,硬件驱动的安装方法和其他的驱动(如:声卡等)安装方法类似。当驱动程序收到“启动设备”(irp_mj_pnp的irp_ mn_start_device的子码)时,驱动程序获得设备的硬件资源。6. 与应用程序的接口物理设备驱动程序(.sys)动态链接库(.dll)应用程序(.exe)用户态的程序在访问驱动程序时,需要用到一些专用的api函数,由于这些函数参数比较多,所以可以开发一个动态链接库,使用户开发应用程序涉及不到底层驱动设备的操作,和使用普通api函数一样操作硬件。这样整个系统的结构如下:图3 系统软件结构 应用这分层的结构,用户程序可以通过dll读写设备。dll提供给应用程序的接口函数,包括初始化设备,关闭设备,读写端口等。初始化就是创建设备,并得到设备句柄,可以在dll中导出如下函数:extern c _declspec(dllexport) bool initialioport()hndfile = createfile( .iodev, generic_write, file_share_write, null,open_existing, 0, null); 关闭设备,只要关闭返回的句柄,如下:extern c _declspec(dllexport) void closeioport()closehandle(hndfile);写端口函数声明如下,函数调用deviceiocontrol可见msdn:extern c _declspec(dllexport) bool outportb(int address,int value)ioctlresult = deviceiocontrol(hndfile, ioctlcode &inputbuffer ,datalength, null, 0, &returnedlength, null); /写端口命令处理读端口时,与上类似,不再祥述。extern c _declspec(dllimport) unsigned char inportb(int address)这样,在应用程序中加入自己的动态链接库后,就可以像在windows 98中使用函数_inp, _outp一样使用inportb, 和outportb, 来操作端口了。7. 结束语基于wdm驱动模型设计的驱动程序支持即插即用功能,可以稳定地在windows 2000下运行,它是在pc机下进行数据采集的基础。windows操作系统提供了良好的网络和数据库功能,所以在windows下开发的控制系统可以更好的实现分布式的数据监测和控制,而且控制界面更容易设计。笔者应用此驱动程序在开发选路板驱动中得到应用。应用本文提出的方法可以实现接口友好的任意微机端口驱动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论