为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > Windows2000设备驱动程序

Windows2000设备驱动程序

2019-07-18 6页 doc 14KB 179阅读

用户头像

is_769254

暂无简介

举报
Windows2000设备驱动程序Windows2000设备驱动程序引言:因为工作关系,我经常涉及PC机与外围设备接口的工作,从PC机这方面要做的工作看来,主要是通过接口处理外围设备的中断,通过I/O端口或内存地址与外设互相传递数据。从计算机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢?当前国内流行的PC操作系统有三种:DOSWin95/98系列,WindowsNTDOS是单用户、单任务操作系统,因为PC机硬件处理速度持续提升,基于单用户、单任务的操作系统越来越不能充分发挥硬件的功能,现在只应用于一些老式PC及其它个别场合,有逐渐被淘汰的...
Windows2000设备驱动程序
Windows2000设备驱动程序引言:因为工作关系,我经常涉及PC机与外围设备接口的工作,从PC机这方面要做的工作看来,主要是通过接口处理外围设备的中断,通过I/O端口或内存地址与外设互相传递数据。从计算机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢?当前国内流行的PC操作系统有三种:DOSWin95/98系列,WindowsNTDOS是单用户、单任务操作系统,因为PC机硬件处理速度持续提升,基于单用户、单任务的操作系统越来越不能充分发挥硬件的功能,现在只应用于一些老式PC及其它个别场合,有逐渐被淘汰的趋势;Win95/98系列和WindowsNT属于多任务操作系统,不论从其原理还是界面上看,这两种操作系统都比DOS有着无可比拟的优越性,这两种操作系统虽然在界面和操作上及其相似,但其内部实现的诸多方面有很多区别,有些区别是本质上的。Win95/98目标是针对一般家庭用户,安全性及可靠性存有很多薄弱环节,就可靠性来说,Win95/98系列不能很好的防止多任务环境中某个进程的非法操作导致系统中其它程序甚至整个系统的崩溃,而WindowsNT在这方面及其它诸多方面设计的相当严谨。这两种操作系统是Microsoft公司同一时期的产品,但针对不同的使用群,所以在一些重要场合及生产实践中应该选择WindowsNT作为计算机的操作系统,此外,从发展趋势来看,WindowsNT已经成为定型产品,具有相对稳定性。在不同操作系统下编写驱动程序是有很大区别的,在DOS平台上,应用程序和设备驱动程序之间没有标准的接口,它们在外部表现为一个扩展名为EXE的文件,驱动程序的作用被柔和在应用程序中,这样,应用程序为了使用不同厂商的同一类设备,必须了解这些设备在接口上具体的硬件实现,同时,对于一个特定型号的硬件产品,所有支持它的应用软件中对于控制整个设备动作的这部分代码,可能被多次重写。这种情况不适合硬件及应用软件的飞速发展。Windows系统在这方面,实行了根本性改进,把控制设备动作的这部分代码独立出来,提出了设备驱动程序的概念,驱动程序是应用程序和硬件设备之间的一个桥梁,应用程序与驱动程序之间有明确的接口,应用程序通过与驱动程序交换信息,达到控制外设的目的。接口定义的操作是面向设备的,这就是说,在应用程序的设计中,并不用关心对外设操作的具体硬件实现,仅仅对驱动程序发出一系列指令既可;驱动程序接受来自上层应用程序的指示,具体操纵实际硬件,完成用户功能。具体实现上,Win95/98系列与WindowsNT又有所区别,WindowsNT是严格按照上述思路设计的;而Win95/98系列不那么严格,其支持上述思路,但同时应用程序也能够绕过驱动程序直接访问实际物理I/O,这样做,增加程序设计的灵活性,但同时,对系统可靠性造成一定隐患。这也正是Win95/98系列可靠性低于WinNT的原因之一。WindowsNT设备驱动程序的组成原理WindowsNT操作系统结构分为用户模式和内核模式,用户模式下的编程为应用程序的设计,而开发设备驱动程序,则属于内核模式下的编程,内核模式组件包括NTExecutive(ExXxx),内核(KeXxx),硬件抽象层(HalXxx)。其层次如图2-1所示,其中NTExecutive包括几个独立的软件组件,它们是系统服务接口(ZwXxx),对象管理器(ObXxx),配置管理器,进程管理器(PsXxx),安全监视器(SeXxx),虚拟空间管理器(MemXxx),本地进程调用,I/O管理器(IoXxx)。内核模式的系统服务并不是全部公开的,而是提供了一系列开发设备驱动程序需要的函数(上文括号内为函数形式,函数手册参见2Kernel-ModeDrivers-Reference章节),换言之,这些函数功能是所有内核模式的系统服务功能的子集。驱动程序由一系列相对独立的函数组成,由I/O管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成:DriverEntry()运行于PASSIVE_LEVEL驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。XxUnload()运行于PASSIVE_LEVEL用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。XxIsr()运行于DIRQL中断服务程序。XxDpcForIsr()运行于DISPATCH_LEVEL中断服务程序后处理程序,以排队方执行不太关键代码的执行,因为排队机制及优先级,不会造成代码拥塞从而提升中断服务程序的响应并且提升系统总体I/O吞吐率。XxOpen()运行于PASSIVE_LEVEL处理应用程序Win32函数CreateFile()请求。XxClose()运行于PASSIVE_LEVEL处理应用程序Win32函数CloseHandle()请求。XxDispatch()运行于PASSIVE_LEVEL处理应用程序Win32函数DeviceIoControl()请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。WindowsNT使用一个抽象化的CPU优先级,IRQL代表中断请求级,任一时刻CPU总处在某一级上,这个数越大,表示当前的任务重要性越大,如表2-1所示,从上至下IRQL越来越小。所有上述驱动程序的函数及内核模式函数都必须运行于各自的IRQL级上,如果违反这个调用规定,会造成系统崩溃。例如,中断服务程序(XxIsr)运行于DIRQL及上,那幺在编写中断服务程序时,只能调用允许在这个级运行的内核模式函数(并不是所有内核模式函数都能运行于DIRQL级)。至于每个内核模式函数运行级别的说明,详见2Kernel-ModeDrivers-Reference章节。WindowsNT是一多任务系统,很多设备的驱动程序同时存有系统中,这样各个设备所占用的资源(中断,1/0及RAM地址空间)很有可能冲突,如果设备驱动程序在运行之前不实行‘探测'而使用自己硬件设备的资源,有可能和系统内其它设备占用的资源冲突,后果不堪设想。WindowsNT通过注册表管理硬件资源的占用信息,作为内核模式信任的组件,驱动程序使用硬件资源之前必须遵循‘查询-申请-使用-释放'的原则WindowsNT设备驱动程序的编写步骤与实例现以一实际例子简要说明设备驱动程序的开发步骤,本例以CINRAD天气雷达测试卡实际应用为原型,加以简化、抽象。第一步,了解被控设备的接口情况。本例为一ISA卡,占用PC机9号中断,I/O地址360H及RAM地址D0228H分别一个字空间。第二步,确定驱动程序的功能。驱动程序每当9号中断达到时,检查运行标志变量RunFlag(为一BOO变量),如果等于TRUE中断累积计数器counter(为一unsignedshort变量)增一,把这个值写入RAM地址D0228H再从这个地址读出,如果读出值等于写入值,把这个值写入I/O地址360H,这个地址的会驱动板卡上的LED显示,把写入值显示出来;如果读出值不等于写入值,设置运行标志变量FALSE如果运行标志变量等于FALSE什幺也不做,返回。第三步,定义驱动程序与应用程序的软件接口。本例定义两个接口命令:IOCTL_IOCardA_STAR:T应用程序设置驱动程序内部的运行标志变量等于TRUE。IOCTL_IOCardA_REA:D应用程序查询驱动程序内部的中断累积计数器的值。第四步,画流程图。这里列举本例实现的几个主要流程图,(图略)。系统传给驱动程序入口函数系统定义的‘设备驱动对象’DrObj,通过初始化这个对象的一些成员变量,把驱动程序其它函数与这个对象联系起来。ISA卡为非即插即用设备,事先把资源占用信息手工添加注册表如下:parameters"IRQ"=dword:00000009"IOSPAN"=dword:00000004"IOAdd"=dword:00000360"RAMAdd"=dword:000d0228"RAMSPAN"=dwor:d00000002其中IOCardA以下各子键及其值为自定义,设备驱动程序利用相对应函数检索出这些值。(3)每个设备驱动程序能够创建若干系统定义的‘设备对象',本例根据需要只创建了一个‘设备对象’Dev。‘设备对象’其中一个成员变量为指向一非分页的物理内存块DeviceExtension,这块内存大小及内容为用户自定义,因为Dev或DeviceExtension对象会被系统传给驱动程序的其它函数,这样驱动程序各函数通过访问这块内存区,实际上达到互相传递信息的功能。本例在这里存储设备硬件资源信息及RunFlag和中断计数器counter,这些数值在DriverEntry()初始化后,供驱动程序的其它函数使用。图3-2为中断服务程序IOCardAIsr()流程图。操作系统接受中断,连同DeviceExtension等参数传给中断服务程序,中断服务程序利用这些参数,实现要求功能。图3-3为IOCardADispatch()流程图,这个函数用于处理来自上层应用程序的命令。上层应用程序通过以下程序段设置驱动程序中RunFlag值为TRUE从而启动中断服务程序开始计数。BOOLcmd=TRUE;hTest=CreateFile(...);//打开设备DeviceIoControl(hTest,//设备句柄IOCTL_IOCardA_START,〃命令&cmd,sizeof(BOOL),//输入缓冲区地址及大小NULL,0,&c,NULL);CloseHandle(hTest);//关闭设备上层应用程序通过以下程序段查询当前的中断计数器的值并存于变量w中。unsignedshortw;hTest=CreateFile(...);DeviceIoControl(hTest,IOCTL_IOCardA_READ,〃命令NULL,0,&w,sizeof(unsignedshort),//输出缓冲区地址及大小&c,NULL);CloseHandle(hTest);其中DeviceIoControl()执行后,操作系统调用IOCardADispatch()函数,如流程图所示,这个函数内部通过一个开关语句,根据命令执行相对应的分支。驱动程序与应用程序通过此函数接口交换数据时,操作系统提供4种可选数据缓冲方式,本例因为数据I/O量比较小,故选用‘缓冲I/O'(METHOD_BUFFERE过程是,I/O管理器首先分配一个非分页池,它的大小为调用者输入缓冲区和输出缓冲区的较大者,第一段程序为sizeof(BOOL),第二段程序为sizeof(unsignedshort),它的地址存到IRP(I/O请求包)的AssociatedIrp.SystemBuffer域中,然后把输入数据拷贝到这个池中,在第一段程序中cmd的值TRUE被拷贝到池中,这样驱动程序通过RtlCopyBytes()函数再把池中的值拷贝到驱动程序的RunFlag中。IOCardADispatch()函数执行完,I/O管理器把池中的内容拷贝到调用者的输出缓冲区,在第二段程序中,驱动程序通过RtlCopyBytes()函数把counter的值拷贝到池中,从而最终传递到应用程序变量w中。第五步,编程。在编写设备驱动程序的同时,要编写一个简单的应用程序用于测试设备驱动程序的一些功能。第六步,驱动程序的载入。驱动程序C语言源程序经过编译、连接生成扩展名为SYS的文件,本例为IOCardA.sys,把这个文件拷贝到系统目录下,同时手工添加如下信息到注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA"ErrorControl"=dword:00000001"Start"=dword:00000003"Type"=dword:00000001要保证lOCardA子键名与驱动程序文件名一致,其中Type=1表示此驱动程序为内核模式驱动程序,Start=3表示此驱动程序手动载入,ErrorControl=1表示当驱动程序发生错误时,日志错误并显示一个消息框。这样当Windows重新启动后,通过使用控制面板中的Device小应用程序,从列表中找到lOCardA设备名,按Start按钮,于是,设备驱动程序就驻留内存并在底层开始工作了。第七,调试。设备驱动程序没有界面,完全在系统底层运行,为了观察驱动程序的运行状态,WindowsNTDD提供windbj.exe程序用于设备驱动程序的调试,调试设备驱动程序需要两台CPU体系结构完全相同的计算机,一台为‘宿主机',运行windbj.exe程序,另一台为‘目标机',运行设备驱动程序,两台计算机用串口线连好,实行一系列软件设置(参见1第17章),就能够开始调试了,从‘宿主机'能够控制及观察‘目标机'上驱动程序的运行情况。最常用的调试手段是在驱动程序中必要的位置加入DbgPrint()函数,这个函数能够把指定信息输出到‘宿主机'windbg.exe窗口中,通过度析这些信息,能够了解驱动程序当前的运行情况。结束语WindowsNT是一个复杂而严密的系统,驱动程序的开发不可避免的涉及现代操作系统理论及其它很多计算机理论,内涵相当广泛,本文围绕着开发实践从一定深度探讨了WindowsNT设备驱动程序开发最基本的知识及一般,希望对读者有所协助,对于复杂,特殊应用的实现及编程技巧,有待于读者在各自实际应用中持续探索。参考文献《WindowsNT设备驱动程序设计指南》ArtBaker著机械工业出版社MicrosoftCo.WindowsNT4.0DeviceDriverKidWindows2000设备驱动程序
/
本文档为【Windows2000设备驱动程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索