[Full]
完整版
[Rss]
订阅
[Xml]
无图版
[Xhtml]
无图版
Rss
& SiteMap
曙海教育集团论坛
http://www.bjzhda.cn
曙海教育集团论坛
◎
曙海教育集团论坛
→
Windows驱动开发
→
Windows2000设备驱动程序的研制开发
共1 条记录, 每页显示 10 条, 页签:
[1]
[浏览完整版]
标题:Windows2000设备驱动程序的研制开发
1楼
wangxinxin
发表于:2010-12-17 14:51:49
以下内容含脚本,或可能导致页面不正常的代码
由于工作关系,我经常涉及<font face="Times New="New" Roman">PC</font>机与外围设备接口的工作,从<font face="Times New="New" Roman">PC</font>机这方面要做的工作看来,主要是通过接口处理外围设备的中断,通过<font face="Times New="New" Roman">I/O</font>端口或内存地址与外设互相传递数据。从<font face="Times New="New" Roman"></font>计算<font face="Times New="New" Roman"></font>机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢? 目前<font face="Times New="New" Roman"></font>国内流行的<font face="Times New="New" Roman">PC</font>操作系统有三种:<font face="Times New="New" Roman">DOS</font>,<font face="Times New="New" Roman">Win95/98</font>系列,<font face="Times New="New" Roman">WindowsNT</font>。<font face="Times New="New" Roman">DOS</font>是单用户、单任务操作系统,由于<font face="Times New="New" Roman">PC</font>机硬件处理速度不断提高,基于单用户、单任务的操作系统越来越不能充分发挥硬件的功能,现在只<font face="Times New="New" Roman"></font>应用<font face="Times New="New" Roman"></font>于一些老式<font face="Times New="New" Roman">PC</font>及其它个别场合,有逐渐被淘汰的趋势;<font face="Times New="New" Roman">Win95/98</font>系列和<font face="Times New="New" Roman">WindowsNT</font>属于多任务操作系统,不论从其原理还是界面上看,这两种操作系统都比<font face="Times New="New" Roman">DOS</font>有着无可比拟的优越性,这两种操作系统虽然在界面和操作上及其相似,但其内部实现的诸多方面有许多区别,有些区别是本质上的。<font face="Times New="New" Roman">Win95/98</font>设计目标是针对一般家庭用户,安全性及可靠性存在许多薄弱环节,就可靠性而言,<font face="Times New="New" Roman">Win95/98</font>系列不能很好的防止多任务环境中某个进程的非法操作导致系统中其它程序甚至整个系统的崩溃,而<font face="Times New="New" Roman">WindowsNT</font>在这方面及其它诸多方面设计的相当严谨。这两种操作系统是<font face="Times New="New" Roman">Microsoft</font>公司同一时期的产品,但针对不同的使用群,所以在一些重要场合及生产实践中应该选择<font face="Times New="New" Roman">WindowsNT</font>作为<a title="计算机类相关论文" href="http://www.lwlm.com/search.aspx?Where=title&cid=0&Keyword=%BC%C6%CB%E3%BB%FA&x=36&y=10"><font color="#000000">计算机</font></a>的操作系统,此外,从<font face="Times New="New" Roman"></font>发展<font face="Times New="New" Roman"></font>趋势来看,<font face="Times New="New" Roman">WindowsNT</font>已经成为定型产品,具有相对稳定性。 在不同操作系统下编写驱动程序是有很大区别的,在<font face="Times New="New" Roman">DOS</font>平台上,应用程序和设备驱动程序之间没有标准的接口,它们在外部表现为一个扩展名为<font face="Times New="New" Roman">EXE</font>的文件,驱动程序的作用被柔和在应用程序中,这样,应用程序为了使用不同厂商的同一类设备,必须了解这些设备在接口上具体的硬件实现,同时,对于一个特定型号的硬件产品,所有支持它的应用软件中对于控制整个设备动作的这部分代码,可能被多次重写。这种情况不适应硬件及应用软件的飞速发展。<font face="Times New="New" Roman">Windows</font>系统在这方面,进行了根本性改进,把控制设备动作的这部分代码独立出来,提出了设备驱动程序的概念<font face="Times New="New" Roman">,</font>驱动程序是应用程序和硬件设备之间的一个桥梁,应用程序与驱动程序之间有明确的接口,应用程序通过与驱动程序交换信息,达到控制外设的目的。接口定义的操作是面向设备的,这就是说,在应用程序的设计中,并不用关心对外设操作的具体硬件实现,只是对驱动程序发出一系列指令既可;驱动程序接受来自上层应用程序的指示,具体操纵实际硬件,完成用户功能。具体实现上,<font face="Times New="New" Roman">Win95/98</font>系列与<font face="Times New="New" Roman">WindowsNT</font>又有所区别,<font face="Times New="New" Roman">WindowsNT</font>是严格按照上述思路设计的;而<font face="Times New="New" Roman">Win95/98</font>系列不那么严格,其支持上述思路,但同时应用程序也可以绕过驱动程序直接访问实际物理<font face="Times New="New" Roman">I/O</font>,这样做,增加程序设计的灵活性,但同时,对系统可靠性造成一定隐患。这也正是<font face="Times New="New" Roman">Win95/98</font>系列可靠性低于<font face="Times New="New" Roman">WinNT</font>的原因之一。 表<font face="Times New="New" Roman">1-1</font>三种操作系统下访问接口比较 <table cellspacing="0" cellpadding="0" width="100%" border="1"> <tbody> <tr> <td width="33%"> 操作系统 </td> <td width="33%"> 应用程序访问接口方式 </td> <td width="34%"> 访问权限 </td></tr> <tr> <td width="33%"> <font face="Times New="New" Roman">DOS</font> </td> <td width="33%"> 直接访问 </td> <td width="34%"> 所有<font face="Times New="New" Roman">[</font>注<font face="Times New="New" Roman">]</font> </td></tr> <tr> <td width="33%" rowspan="2"> <font face="Times New="New" Roman">Windows95/98</font> </td> <td width="33%"> 通过设备驱动程序<font face="Times New="New" Roman">*.VXD</font> </td> <td width="34%"> 所有<font face="Times New="New" Roman">[</font>注<font face="Times New="New" Roman">]</font> </td></tr> <tr> <td width="33%"> 直接访问 </td> <td width="34%"> 仅<font face="Times New="New" Roman">I/O</font>端口 </td></tr> <tr> <td width="33%"> <font face="Times New="New" Roman">WindowsNT</font> </td> <td width="33%"> 通过设备驱动程序<font face="Times New="New" Roman">*.SYS</font> </td> <td width="34%"> 所有<font face="Times New="New" Roman">[</font>注<font face="Times New="New" Roman">]</font> </td></tr></tbody></table> <font face="Times New="New" Roman">[</font>注<font face="Times New="New" Roman">]‘</font>所有<font face="Times New="New" Roman">’</font>指<font face="Times New="New" Roman">I/O</font>端口,<font face="Times New="New" Roman">RAM</font>总线,中断,<font face="Times New="New" Roman">DMA</font>。 <font face="Times New="New" Roman">WindowsNT</font>设备驱动程序的组成原理 <font face="Times New="New" Roman">WindowsNT</font>操作系统结构分为用户模式和内核模式,用户模式下的<a href="javascript:;" target="_self"><u><strong>编程</strong></u></a>为应用程序的设计,而开发设备驱动程序,则属于内核模式下的编程,内核模式组件包括<font face="Times New="New" Roman">NT Executive(ExXxx),</font>内核<font face="Times New="New" Roman">(KeXxx),</font>硬件抽象层<font face="Times New="New" Roman">(HalXxx)</font>。其层次如图<font face="Times New="New" Roman">2-1</font>所示,其中<font face="Times New="New" Roman">NT Executive</font>包括几个独立的软件组件,它们是系统服务接口<font face="Times New="New" Roman">(ZwXxx)</font>,对象<a title="管理类相关论文" href="http://www.lwlm.com/search.aspx?Where=title&cid=0&Keyword=%B9%DC%C0%ED%A1%A1&x=35&y=9"><font color="#000000">管理</font></a>器<font face="Times New="New" Roman">(ObXxx)</font>,配置管理器,进程管理器<font face="Times New="New" Roman">(PsXxx)</font>,安全监视器<font face="Times New="New" Roman">(SeXxx)</font>,虚拟空间管理器<font face="Times New="New" Roman">(MemXxx)</font>,本地进程调用,<font face="Times New="New" Roman">I/O</font>管理器<font face="Times New="New" Roman">(IoXxx)</font>。内核模式的系统服务并不是全部公开的,而是提供了一系列开发设备驱动程序需要的函数<font face="Times New="New" Roman">(</font>上文括号内为函数形式,函数手册参见<font face="Times New="New" Roman">[2]Kernel-Mode Drivers-Reference</font>章节<font face="Times New="New" Roman">)</font>,换言之,这些函数功能是所有内核模式的系统服务功能的子集。 驱动程序由一系列相对独立的函数组成,由<font face="Times New="New" Roman">I/O</font><a title="管理类相关论文" href="http://www.lwlm.com/search.aspx?Where=title&cid=0&Keyword=%B9%DC%C0%ED%A1%A1&x=35&y=9"><font color="#000000">管理</font></a>器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成: <font face="Times New="New" Roman">1.DriverEntry()</font>运行于<font face="Times New="New" Roman">PASSIVE_LEVEL </font>驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。 <font face="Times New="New" Roman">2.XxUnload()</font>运行于<font face="Times New="New" Roman">PASSIVE_LEVEL </font>用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。 <font face="Times New="New" Roman">3.XxIsr()</font>运行于<font face="Times New="New" Roman">DIRQL </font>中断服务程序。 <font face="Times New="New" Roman">4.XxDpcForIsr()</font>运行于<font face="Times New="New" Roman">DISPATCH_LEVEL </font>中断服务程序后处理程序,以排队方执行不太关键代码的执行,由于排队机制及优先级,不会造成代码拥塞从而提高中断服务程序的响应并且提高系统总体<font face="Times New="New" Roman">I/O</font>吞吐率。 <font face="Times New="New" Roman">5.XxOpen()</font>运行于<font face="Times New="New" Roman">PASSIVE_LEVEL </font>处理应用程序<font face="Times New="New" Roman">Win32</font>函数<font face="Times New="New" Roman">CreateFile()</font>请求。 <font face="Times New="New" Roman">6.XxClose()</font>运行于<font face="Times New="New" Roman">PASSIVE_LEVEL </font>处理应用程序<font face="Times New="New" Roman">Win32</font>函数<font face="Times New="New" Roman">CloseHandle()</font>请求。 <font face="Times New="New" Roman">7.XxDispatch()</font>运行于<font face="Times New="New" Roman">PASSIVE_LEVEL </font>处理应用程序<font face="Times New="New" Roman">Win32</font>函数<font face="Times New="New" Roman">DeviceIoControl()</font>请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。 <font face="Times New="New" Roman">WindowsNT</font>使用一个抽象化的<font face="Times New="New" Roman">CPU</font>优先级方案,<font face="Times New="New" Roman">IRQL</font>代表中断请求级,任一时刻<font face="Times New="New" Roman">CPU</font>总处在某一级上,这个数越大,表示当前的任务重要性越大,如表<font face="Times New="New" Roman">2-1</font>所示,从上至下<font face="Times New="New" Roman">IRQL</font>越来越小。所有上述驱动程序的函数及内核模式函数都必须运行于各自的<font face="Times New="New" Roman">IRQL</font>级上,如果违反这一调用规定,会造成系统崩溃。例如,中断服务程序<font face="Times New="New" Roman">(XxIsr)</font>运行于<font face="Times New="New" Roman">DIRQL</font>及上,那幺在编写中断服务程序时,只能调用允许在这一级运行的内核模式函数<font face="Times New="New" Roman">(</font>并不是所有内核模式函数都能运行于<font face="Times New="New" Roman">DIRQL</font>级<font face="Times New="New" Roman">)</font>。至于每个内核模式函数运行级别的说明,详见<font face="Times New="New" Roman">[2]Kernel-Mode Drivers-Reference</font>章节。 <font face="Times New="New" Roman">WindowsNT</font>是一多任务系统,许多设备的驱动程序同时存在系统中,这样各个设备所占用的资源<font face="Times New="New" Roman">(</font>中断,<font face="Times New="New" Roman">I/O</font>及<font face="Times New="New" Roman">RAM</font>地址空间<font face="Times New="New" Roman">)</font>很有可能冲突,如果设备驱动程序在运行之前不进行<font face="Times New="New" Roman">‘</font>探测<font face="Times New="New" Roman">’</font>而使用自己硬件设备的资源,有可能和系统内其它设备占用的资源冲突,后果不堪设想。<font face="Times New="New" Roman">WindowsNT</font>通过注册表<a title="管理类相关论文" href="http://www.lwlm.com/search.aspx?Where=title&cid=0&Keyword=%B9%DC%C0%ED%A1%A1&x=35&y=9"><font color="#000000">管理</font></a>硬件资源的占用信息,作为内核模式信任的组件,驱动程序使用硬件资源之前必须遵循<font face="Times New="New" Roman">‘</font>查询<font face="Times New="New" Roman">-</font>申请<font face="Times New="New" Roman">-</font>使用<font face="Times New="New" Roman">-</font>释放<font face="Times New="New" Roman">’</font>的原则<font face="Times New="New" Roman">(</font>如图<font face="Times New="New" Roman">2-2</font>所示<font face="Times New="New" Roman">)</font>。 表<font face="Times New="New" Roman">2-1</font> <table cellspacing="0" cellpadding="0" width="100%" border="1"> <tbody> <tr> <td width="50%"> 来源 </td> <td width="50%"> <font face="Times New="New" Roman">IRQL</font> </td></tr> <tr> <td width="50%" rowspan="7"> 硬件 </td> <td width="50%"> <font face="Times New="New" Roman">HIGHEST_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">POWER_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">IPI_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">CLOCK2_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">CLOCK1_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">PROFILE_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">DIRQLs(I/O</font>设备中断平台相关的级数<font face="Times New="New" Roman">)</font> </td></tr> <tr> <td width="50%" rowspan="3"> 软件 </td> <td width="50%"> <font face="Times New="New" Roman">DISPATCH_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">APC_LEVEL</font> </td></tr> <tr> <td width="50%"> <font face="Times New="New" Roman">PASSIVE_LEVEL</font> </td></tr></tbody></table> <font face="Times New="New" Roman">WindowsNT</font>设备驱动程序的编写步骤与实例<font face="Times New="New" Roman"> </font>现以一实际例子简要说明设备驱动程序的开发步骤,本例以<font face="Times New="New" Roman">CINRAD</font>天气雷达测试卡实际应用为原型,加以简化、抽象。
说明:
上面显示的是代码内容。您可以先检查过代码没问题,或修改之后再运行.
共1 条记录, 每页显示 10 条, 页签:
[1]
Copyright © 2000 - 2009
曙海
教育集团
Powered By
曙海教育集团
Version 2.2
Processed in .01563 s, 2 queries.
[Full]
完整版
[Rss]
订阅
[Xml]
无图版
[Xhtml]
无图版