首页 > 文章中心 > 驱动程序设计

驱动程序设计范文精选

驱动程序设计

驱动程序设计范文第1篇

论文关键词:设备驱动程序异步I/OVirtualDeviceDriver(VxD)WindowsDriverModel(WDM)

论文摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,希望能够给设备驱动程序的设计者提供一些帮助。

为了保证操作系统的安全性和稳定性以及应用程序的可移植性,Windows操作系统不允许应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,如果应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。它们之间的通信包括两个方面:一方面是应用程序传送给设备驱动程序的数据;另一方面是设备驱动程序发送给应用程序的消息。前者的实现较容易,通过CreateFile()函数获取设备驱动程序的句柄后,就可以使用Win32函数,如DeviceIoControl()、ReadFile()或WriteFile()等实现应用程序与设备驱动程序之间的通信。后者的实现远比前者复杂,同时介绍这方面情况的文章较少。这不等于说它不重要,相反,它在有些应用场合发挥着重要的作用。设备驱动程序完成数据的采集工作后,需要马上通知应用程序,以便应用程序能够及时将数据取走并进行处理。诸如此类情况,不一而足。

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法:异步过程调用(APC)、事件方式(VxD)、消息方式、异步I/O方式和事件方式(WDM)。下面分别说明这几种方式的原理,并给出实现的部分源代码。

1异步过程调用(APC)

Win32应用程序使用CreateFile()函数动态加载设备驱动程序,然后定义一个回调函数backFunc(),并且将回调函数的地址&backFunc()作为参数,通过DeviceIoControl()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用Get_Cur_Thread_Handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_VWIN32_QueueUserApc()函数,向Win32应用程序发送消息。这个函数带有三个参数:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。Win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。

2事件方式(VxD)

首先,Win32应用程序创建一个事件的句柄,称其为Ring3句柄。由于虚拟设备驱动程序使用事件的Ring0句柄,因此,需要创建Ring0句柄。用LoadLibrary()函数加载未公开的动态链接库Kernel32.dll,获得动态链接库的句柄。然后,调用GetProcAddress(),找到函数OpenVxDHandle()在动态链接库中的位置。接着,用OpenVxDHandle()函数将Ring3事件句柄转化为Ring0事件句柄。Win32应用程序用CreateFile()函数加载设备驱动程序。如果加载成功,则调用DeviceIoControl()函数将Ring0事件句柄传给VxD;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,VxD置Ring0事件为有信号状态(调用_VWIN32_SetWin32Event()函数),这马上触发对应的Ring3事件为有信号状态。一旦Ring3事件句柄为有信号状态,Win32应用程序的辅助线程就对这个消息进行相应的处理。

3消息方式

Win32应用程序调用CreateFile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用DeviceIoControl()函数将窗体句柄传送给VxD,VxD利用这个句柄向窗体发消息。当条件满足时,VxD调用SHELL_PostMessage()函数向Win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用ON_MESSAGE()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。SHELL_PostMessage()函数的第一个参数为Win32窗体句柄,第二个参数为消息ID号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。Win32应用程序收到消息后,对消息进行处理。

4异步I/O方式

Win32应用程序首先调用CreateFile()函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,表示以后可以对文件进行重叠I/O操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为OVERLAPPED的数据结构(如Overlapped)。然后,将Overlapped作为一个参数,传给DeviceIoControl()函数。设备驱动程序把这个I/O请求包(IRP)设置为挂起状态,并且设置一个取消例程。如果当前IRP队列为空,则将这个IRP传送给StartIo()例程;否则,将它放到IRP队列中。设备驱动程序做完这些工作后,结束这个DeviceIoControl()的处理,于是Win32应用程序可能不等待IRP处理完,就从DeviceIoControl()的调用中返回。通过判断返回值,得到IRP的处理情况。如果当前IRP处于挂起状态,则主程序先做一些其它的工作,然后调用WaitForSingleObject()或WaitForMultipleObject()函数等待Overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的IRP,处理完成后,调用IoCompleteRequest()函数。该函数将Overlapped中的事件设置为有信号状态。Win32应用程序对这个事件马上进行响应,退出等待状态,并且将事件复位为无信号状态,然后调用GetOverlappedResult()

函数获取IRP的处理结果。

5事件方式(WDM)

Win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其它事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。当条件具备后,设备驱动程序将事件设置为有信号状态,这样应用程序的辅助线程马上知道这个消息,于是进行相应的处理。当设备驱动程序不再使用这个事件时,应该解除该事件的指针。

驱动程序设计范文第2篇

关键字组件重用操作系统OSKit

1引言

当前,操作系统的功能不断扩展,操作系统的类型呈现出多样化的趋势。一个小规模的开发小组已经不可能完全从头开始实现一个实用的操作系统,而一般情况下,研究人员只对操作系统的一些特定领域感兴趣,而对于另外一些元素,如启动加载代码、核心启动代码、设备驱动程序和内存分配代码等往往不感兴趣,但是一个可运行的原型系统又必须包含这些内容。编写这些基础结构延缓了操作系统研究项目的进度,同时也增加了进行操作系统研究的代价。为了解决这一问题,犹他大学的FLUX研究小组开发了OSKit,它提供了一个框架和一组模块化的、具有简单接口的库以及一组清晰的、可重用的OS组件。OSKit可以用来构建操作系统内核、外层服务和其他核心OS功能模块。OSKit提供了各种功能模块,诸如简单自举,一个可用于内核的最小化POSIX环境、与物理内存和其约束一致的内存管理、广泛的调试支持,以及高层子系统如协议栈和文件系统。开发者可以根据自己的研究兴趣或所要考虑的性能来使用这些模块,或用他们自己的模块来替代标准的OSKit模块。

OSKit公开了它内部的实现细节,允许用户从成熟的操作系统中不加修改地提取代码,然后通过一小部分经过仔细设计的粘接代码将它们合并到一起,隔离它们的依赖性,并输出良好定义的接口。OSKit使用这一技术整合了许多稳定而成熟的源代码,包括设备驱动、文件系统、网络协议等等。实践表明,使用组件软件架构和重用技术会给操作系统实现领域带来大的影响。

2组件技术简介

组件技术是一种较新的软件开发技术。到目前为止,还难以确定组件技术的明确定义。比如,对组件技术的常见说法有以下这些:“二进制软件单元”、“任意场合可部署的软件”、“特别适合第三方开发”和“规范定义的接口”等等。大致上可以这样理解:所谓组件,其实就是一种可部署软件的代码包,其中包括某些可执行模块。组件单独开发并作为软件单元使用,它具有明确的接口,软件就是通过这些接口调用组件所能提供的服务,多种组件可以联合起来构成更大型的组件乃至直接建立整个系统。组件的实现必须支持一种或者多种其用户所希望获得的接口。实现组件并不一定需要采用面向对象语言。为了构造新应用程序,软件开发人员找出适当的组件,将这些组件加入到正在开发中的应用程序,同时对应用程序进行测试并保证应用程序的组装工作按照预定的规划正常进行。采用组件技术能降低开发、测试和维护成本,提高可靠性和稳定性。

3Oskit组件综述

OSKIT的组件库提供了一般情况下更高层的功能,它通常只对外开放一些相关的公用调用接口。目标系统通过OSKit的面向对象的COM接口来与这些组件进行交互。以下几节概述了OSKit所提供的组件。

3.1引导程序

大多数操作系统多有自身的启动加载机制,彼此互不兼容。这种加载机制的多样性并不是由于每个OS所要求的自举服务不同而引起,而是由于构建启动加载器的特定方式造成的。因为从操作系统研究的立场来看,启动加载器是一个令人不敢兴趣的领域,因此OS开发者通常进行一个最小化、快捷的设计。由于设计理念和要求的轻微差别,每个启动加载器都不适用于下一个OS。为了解决这个问题,OSKit直接支持多启动标准,这一标准是由几个OS项目的成员共同设计的,它的目的是提供一个简单而通用的启动加载器与OS内核间的接口,从而允许一个启动加载器加载任何兼容的OS。

在进行操作系统研究时,多启动标准非常有用,这其中的主要原因是启动加载器在加载内核自身的同时还具有加载附加文件或者启动模块的能力。这里的一个启动模块只是一个普通文件,启动加载器不以任何方式解释它,而仅仅把它随同内核映像一起加载到保留物理内存块中。在启动内核时,启动加载器提供给内核以下内容:物理地址的列表、所有已加载的启动模块的大小,以及与每个模块相联系的由用户定义的字符串。这些启动模块和与它们相联系的用户定义的字符串由内核解释。这样做的目的是为了通过提供内核启动时需要的数据,诸如初始化程序、设备驱动和文件系统服务器,来减轻内核启动的负担。

3.2核心支持库

OSKit核心支持库的主要用途是让客户OS更容易访问硬件设施。它包含了一个较大的实用函数和符号定义的集合,该集合对于管理模式代码是非常具体的。与此相对应,OSKit的大多数其他库在用户模式代码中通常很有用。和OSKit的其余部分所不同的是,多数核心支持代码必须是针对特定系统结构的,而这些特定机器的细节对客户OS也是有用的。例如,在x86机器上,核心支持库包含一些函数,用来创建和操纵x86页表和段寄存器。其他OSKit组件通常提供建立在这些低层机制上的与体系结构无关的设施,但是为了提供最大的灵活性,与特定结构相关的接口始终可以被访问。

OSKit核心支持库在x86体系结构上尤为重要,因为该体系结构的OS级编程环境特别复杂和模糊。核心支持库仔细地设置了一个基本的32位执行环境(为了与MS-DOS兼容,x86处理器通常以16位模式开始),初始化段和页转换表,安装一个中断向量表,并提供缺省的陷阱和中断处理程序。当然,客户OS能够修改或重载这些行为。然而,在缺省情况下,核心支持库自动地做所有必要的工作,以便使处理器进入一个方便的执行环境,此时中断、陷阱、调试以及其他标准设施已经如预期的那样开始工作。该库在缺省情况下自动地定位所有随内核加载的启动模块,并保留它们所在的物理内存。接下来,应用程序可以很容易使用它们。客户OS只需以标准C语言风格提供一个main()函数。一切都设置好以后,内核支持库将用所有参数和由启动加载器传递过来的环境变量来调用它。

3.3内存管理库

如同在一个标准C语言库中实现的malloc()一样,内存管理代码典型地用于用户空间。通常并不适用于内核。设备驱动常常需要分配特定类型的内存,并伴随具体的调整属性。例如,对于内建的DMA控制器只能访问最初的16M物理内存。为解决这些内存管理问题,OSKit包含了两个简单而灵活的内存管理库:(1)基于队列的内存管理器(或称LMM),它提供了功能强大且高效的原语来进行分配管理,并支持在一个池中管理多种类型的内存。(2)地址映射管理器(或称AMM)被设计用来管理不必直接映射到物理内存或虚拟内存的地址空间,它对OS的其他方面提供了类似的支持,诸如进程地址空间、分页、空闲块或IPC名字空间的管理。尽管这些库可以很容易地应用在用户空间,但实际上它们是被特别设计用来满足OS内核的需求。超级秘书网

3.4最小C语言库

成熟的OS内核一般都包含着相当数量的仅仅用来重新实现基本的C语言库函数如printf()和malloc()的代码。与此形成对比的是,OSKit提供了一个最小化C语言函数库,它围绕着最小化依赖性而不是最大化函数性和性能的原则来设计。

3.5调试支持

OSKit的一个最实用的好处是:给定一个适当的硬件设置,它立刻就能提供给OS开发者一个完全源代码级的内核调试环境。OSKit内核支持库包括一个可用于GNU调试器(GDB)的串行存根模块,它在客户OS环境中处理陷阱,并使用GDB的标准远程调试协议通过一个串行程序与运行在另一台机器上的GDB通信。甚至当客户机OS执行自己的陷阱处理时,OSKit的GDB存根模块也是可用的。如果客户OS提供适当的钩子,它甚至支持多线程调试。除了基本的调试器支持,OSKit也提供了一个内存分配调试库,它可以跟踪内存分配并检测一般的错误,如缓冲区溢出和释放已释放的内存。这个库提供了与许多普通应用程序调试器相似的功能性,所不同的是它运行在由OSKit提供的最小内核环境中

3.6设备驱动支持

在OS开发和维护中最艰巨的一个任务是支持多种多样的I/O硬件。这些复杂的设备常会含有潜在的错误,而新硬件的又常常伴随着不兼容的软件接口。由于这些原因,OSKit采用了为现有内核开发的稳定的、经过充分测试的驱动程序。OSKit使用了一种封装技术,将现有的驱动程序代码基本上未加修改地合并到OSKit中。这些现有的驱动程序被一个OSKit粘结代码层所包装,从而使得这些驱动程序可以在与开发它们的环境完全不同的环境中工作。目前,来自Linux的大多数以太网卡、SCSI和IDE磁盘的设备驱动程序被包括进来,总数超过了五十种。用同样的方式,来自FreeBSD的八个字符设备驱动程序也被包含了进来,它们支持标准PC控制台和串口及不同的多串口板。由于OSKit把这些驱动仔细地进行了包装,FreeBSD驱动程序可以与Linux驱动程序一起工作。

3.7协议栈

OSKit提供了一个完整的TCP/IP网络协议栈。如同驱动程序一样,有关网络的代码也可以通过封装机制被合并进来。OSKit当前可以从Linux中获取网络设备驱动程序,它们是PC平台可获得的最大的免费资源。OSKit的网络组件继承于FreeBSD4.4,它通常被认为具有更多成熟的网络协议。这显示了使用封装机制将现有软件包装成灵活的组件的第二个优点:即从不同的资源中获取最好的组件,并让它们一起被使用。

3.8文件系统

通过使用封装技术,OSKit吸收了NetBSD的基于磁盘的文件系统代码。NetBSD之所以被选择为首要资源库,是因为在可用的系统中,它的文件系统代码被最清晰地分离了出来,而FreeBSD和Linux的文件系统与它们的虚拟内存系统结合的更紧密。当前,OSKit也把Linux文件系统合并了进来,以便能够支持多种类型的文件系统格式,如Windows95、OS/2和SystemV的文件系统格式等等。

OSKit文件系统输出的COM接口类似于许多Unix文件系统所使用的内部VFS接口。这些接口具有很好的粒度,使我们可以不必接触OSKit文件系统的内部。例如,OSKit接口只接受简单的路径名组件,允许安全封装的代码执行适当的访问许可检查。

4OSKit的现状

自从在1996年6月了OSKit的第一个公开发行版以来,OSKit已经更新了多次,每次更新都增加了一些算法,并修正了一些错误。最新的发行版是2002年3月的版本。由此可见,OSKit一直处于操作系统开发平台的前沿,其自身也在不断完善和发展。

5结论

作为一个操作系统研究与开发的平台,OSKit大大减轻了操作系统研究与开发者的负担。它可以让开发人员避开复杂的底层,而把兴趣集中与他们所感兴趣的领域。开发者可以用自己编写的组件来取代OSKit中的部分组件,以满足自己特定的需要,从而丰富了操作系统的应用层。总之,OSKit满足了实际客户系统的需求,有助于操作系统的研究与开发。

驱动程序设计范文第3篇

关键词:任务驱动高职计算机网络技术课程体系

目前高职课程中虽然规划了包括理论与实习在内的专业科目,希望学生能够理论与实务兼备。但在实际教学上,理论课程的教学大多仍采取照本宣科的模式;实习课则多停留在模仿学习阶段,即由教师示范操作过程,学生再按图施工如法炮制一番;其教学目的仅在提高学生操作设备、仪器之机械熟练度,而在逻辑思考及问题解决能力的训练上,大多被忽略。

1当前高职计算机网络技术课程教学的现状

在教学方式上,为使学生能融入问题解决的活动,深入探究问题,进而解决问题,任务活动为一种值得尝试的教学方式。任务驱动教学是以一种以学生为中心的教学策略,不但可以培养学生的主动性,同时因为实作的对象是现实世界中的真实任务,对大部份学生的学习而言,更可以引其学习动机。大部份老师上课时都是先透过教学广播系统进行指令的介绍和说明,再配合课本上范例程序的讲解与示范,然后由学生实际上机操作、执行并验证结果。在整个教学过程中,教学内容实际上包含了程序语言介绍及程序逻辑推演等二个主题,而教学方式则包括了老师讲解及学生上机实作二部份[1]。程序语言必需学会繁复的指令后,才能组合成小小的程序,但往往因为打字时的疏忽,或是指令的误用,使得编译或执行时错误,造成学生很深的挫折感。许多学生对程序设计课程兴趣缺乏,听课时总是应付了事,不求甚解,即使是在上机实作时,也只在老师所举范例中,寻找可能的答案,老师提问,学生则报以不知所云、彷徨不安的神情。最后使老师也丧失了对教学的信心,即使准备再充份,往往也无法得到相对的响应。造成此种现象的原因一方面来自程序设计本身的复杂度:设计一个程序,除了必须熟悉所使用的程序语言外,对程序背后的算法也要十分清楚才行。易言之,学生在学习程序设计时是同时在学种东西,既要了解指令,又要弄清楚程序的逻辑,这对大多数学生是件极大的挑战。另一方面,不当的教学方式则又加深了学习的困难。以往的程序教学,多数老师和学生把学习重点放在指令语法上,结果使得学生面对问题时不知如何下手。上课时大都是教师讲、学生听,虽然方便达到授业的目的,但易养成学生不愿思考的被动式学习态度,以致在解惑上就鲜有成效。

2基于任务驱动的高职计算机网络技术课程体系的构建

和低级语言比较起来,高级语言是一种较抽象、与硬件较不相关、较易于使用、又较具可移植性的语言,它采取较为接近人类的语法和数据型态,使用更为简便的流程控制,并且提供更方便的输入/输出的处理及强大的函数。高级语言大大简化了复杂的程序设计过程,程序设计师不需要再去管缓存器、内存寻址及堆栈呼叫等问题,只需专心处理变量、阵及算术或逻辑上的运算即可。和汇编语言一样,高级语言的程序亦需要经过编译。程序设计者不必了解对象内部的结构及实际运作的方式,只要利用该对象的属性和方法便可改变或存取该对象。透过封装,我们可以将实作与界面分开,一方面可以达到资料保密的目的,另一方面当需要更新对象的程序时,只要维持对象的接口不变,便可以确保使用该对象的外部程序,不需要改写,一样可以执行。任务活动强调以日常生活的问题,经由教师的引导与协助,开发学生解决问题的能力,达到做中学的境界。在任务活动的过程中,可以增进学生的创造力。在设计程序时,程序设计师首先必需仔细分析问题的内容及背景,研究相关资料找出解决问题的方法,然后再透过特定的程序语言来描述此方法的每一个步骤,最后交由计算机执行以产生结果。因此用来设计程序的程序语言和用来解决问题的算法[2]。程序语言或程式设计课程的重点不在于指令功能和格式语法的解释与说明,而是要让学生能用运用所学程序语言来设计程序解决问题,程序语言是本身应只是一种工具而非学习的目标[3]。所占用的计算机记忆空间小、同时执行的效率高,一般多用来撰写硬件的驱动程序或作自动控制之用。由于汇编语言和计算机硬件关系密切,因此程序设计师必需对计算机整个硬件架构、中央处理器运作、内存模式以及2进位数字系统非常熟悉才有办法撰写程序[4]。另一方面,汇编语言只提供了最低阶、最基本的指令,在设计程序时除了要构思解决问题的方法外,还需要考虑到对应的指令组合、缓存器设定、数据寻址方式等细节,往往使程序设计师无法专心于问题的解决上[5]。

3结论

总之,在高职计算机网络技术课程教学中实施任务驱动教学法,能够有效地提高学生的学习兴趣,从任务完成情况着手为学生的学习效果提供一定的参考与借鉴。

参考文献:

[1]王杨.浅析高职"数据通信与计算机网络"课程建设[J].电子制作,2015,(16):126-127.

[2]倪卫东,王欣,肖颖.高职计算机网络技术专业课程对接国际通用职业资格证书的探索与实践[J].机械职业教育,2015,(11):229-232.

[3]张明真,李海胜,付宗见.高职高专院校计算机专业学生上网状况研究[J].济源职业技术学院学报,2015,(3):377-380.

[4]刘烨.中高职计算机网络技术专业人才规格和职业生涯路径[J].无线互联科技,2014,(11):63-64.

驱动程序设计范文第4篇

随着各种超级VGA的出现,同时具有高分辨率和丰富色彩的图形用户界面已经成为程序员和用户共同追求的目标。然而由于各制造商提供的VGA产品之间的差异,使得高分辨率256色图形界面的兼容性受到影响,常常会出现这样的情况:在一个显示系统下运行良好的程序,在另一种显示系统下变得面目全非,甚至根本不显示。这表明程序员对程序的可移植性重视不够,或对各种显示设备缺乏足够的了解。

软件的可移植性是指软件产品从一个硬件/软件环境转移到另一个硬件/软件环境的难易与繁简程度。它从软件对新环境的适应性这一方面,反映了软件的质量。为了提高软件的可移植性,应尽量使软件与具体的设备无关,即提高软件的设备独立性。对于256色图形界面而言,就是要使程序不依赖于某种特定的显示器。例如,程序员没有任何理由假定用户使用的是TVGA。为此,程序员必须提供显示卡的常规检测例程,并能根据检测的结果决定图形算法的具体实现。

提高软件设备独立性的方法有很多,表格驱动就是其中一种。所谓表格,就是根据需要设计的数据结构。表格中的数据由检测例程填写。表格中包含哪些栏目,应在对各制造商提供的SuperVGA产品足够了解的基础上取舍,栏目应体现各产品之间的差异。

一、SuperVGA编程综述

SuperVGA产品在体系结构上和标准的IBMVGA有所不同。但编程思想基本上是一样的,这些编程方法已有许多文章介绍,这里不再重复。

影响256色图形界面可移植性的主要障碍来自各制造商提供的VGA产品的下面几点差异。

1.显示模式的定义不同。如5DH对TVGA而言,代表640×480

×256色模式,对PVGA而言却代

表1024×768×16色模式。因此,直接用这种模式号初始化显示系统是不可取的。和显示模式密切相关的是水平分辨率和垂直分辨率。尽管各VGA的256色显示模式定义迥异,但大都支持如下几种流行的分辨率,现用统一的模式号定义见附表。

@@10A06500.GIF;附表@@

不同分辨率之间的区别,体现在编程上就是同一屏幕坐标映射到显存的地址不同,但映射机理却是一样的。具体地说,坐标(x,y)对应显存的偏移地址(相对于A000)为Addr=-vga-width*y+x

2.分页机制不同。SuperVGA使用256K、512K或1M

的显示存储器结构。为了使处理器可通过一个64K主窗口来存取这样大的显示存储器,SuperVGA有一个存储器分页机制,使得只将显示存储器的一部分映射到处理器的地址空间。值得注意的是,不同的VGA产品,其页的大小不同,页起始地址的粒度也是可变的。具体的页选择算法请查阅制造商提供的资料。

不同的显示模式,显示一屏图像所需的页数是不同的。

除了可移植性外,效率也是一个不可忽视的因素。图形系统的核心部分应使用汇编语言编程。这不仅是因为汇编语言的效率高,而且还因为汇编语言子程序的可再用性和可协用性也很好。核心部分应十分重视下面几点:(1)减少不必要的页边界检查次数;(2)只有在必要时才进行页选择;(3)选择高效的机器指令。现举例说明。程序1是图像显示系统中常用的函数,其功能是将解包后的图像数据送到显存。为便于阅读同时给出了C语言调用原型。程序在传送每一行数据时,提前预测是否会遇到页边界,如果没有,直接传送;如果有,则将数据分成两部分,分别传送,中间插入页选择。所有的传送均用字操作代替字节操作。页边界检查只有一次,分页操作只有在必要时才发生,图像的显示用最高效的指令REPMOVSW。

程度1:

;原型:voidLineDump(intx,inty,intnum,charfar*ptr)

;参数:

;x,y-屏幕坐标

;num-本行的像素个数

;ptr-指向像素数据的远指针

LineDumpprocfar

pushbp

movbp,sp

subsp,2;WORDReservedforlocalvar.

pushds

pushes

pushsi

pushdi

reservedequ[bp-2];Localvar.saveseg(DGROUP)

xequ[bp+6];LargeModel

yequ[bp+8]

numequ[bp+10]

offsequ[bp+12]

psegequ[bp+14]

movreserved,ds

movds,pseg

movsi,offs;DS:SI图像数据所在源地址

movax,0a000h;显存段址

moves,ax;ES:DI显存目的地址

movax,y

pushds

movds,reserved

mulwordptrDGROUP:-vga-width

popds

addax,x

adcdx,0

movdi,ax;DI=-vga-width*y+x

movah,dl;进位部分(DL)=页号

calldwordptrcs:-PageSelect

movcx,num;本行要传送字节数

movbx,cx

addbx,di;检测传送是否在一个页内

jncDump-In-One-Page

subcx,bx;CX=本页字节数,BX=下页字节数

shrcx,1;CX/2=字数

repmovsw;本页内的传送

adccx,0

repmovsb;处理可能的奇数字节数

incah;调整页号

calldwordptrcs:-PageSelect

movcx,bx;新页内要写的字节数

jcxzDump-Done

Dump-In-One-Page:

shrcx,1;CX/2=字数

repmovsw;图像传送

adccx,0

repmovsb;处理可能的奇数字节数

Dump-Done:

popdi

popsi

popes

popds

movsp,bp

popbp

ret

LineDumpendp

二、表格驱动的基本思想

根据上面的分析,用以驱动显示系统的表格,至少应当包含下列项目:

(1)实际显示模式:vga-mode

(2)水平分辨率:vga-width

(3)垂直分辨率:vga-depth

(4)页选择例程的入口地址:PageSelect

(5)当前显示方式所使用的最大页号:vga-pages

这个表格由图形初始化例程来填写。图形初始化例程接收的显示模式是统一的模式号,这样可以撇开具体的设备,如InitVGA(TVGA800×600)。该例程调用显示设备检测程序DetectVGA来判断显示器的类型,从而填写表格中的各栏目,并初始化图形系统为所需的图形方式。所有图形算法都要查此表。

除了用上述方法来实现兼容外,视频电子学标准协会(VESA)为我们提供了另一种方法。

VESA

提供了一组附加的BIOS功能,这组功能以标准的方式访问SuperVGA扩充的模式。VESA的附加功能都是通过BIOS中断10H的4FH功能来实现的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分页例程的地址。

因此,程序员可以按照VESA的标准来编写图形系统,这样的程序可以在所有支持VESA的显示器上运行。由于VESA包括了世界上的主要VGA供应商,写出来的程序可移植性是很好的。但是,其效率却可能是最低的。所以最好采用一种折衷的办法,对于熟悉的产品,可以不用VESA的功能,对于不熟悉(资料不全)或检测不出来的显示器尝试用VESA提供的手段来编程,当然要检测显示设备是否支持VESA。

有时出于某种考虑,不希望支持所有显示设备的代码集中在一个程序中,可以为每个显示设备分别提供驱动模块,主程序根据检测的结果选择一个合适的模块加载。Borland的C++就是这样,它有一套BGI驱动程序,各驱动程序提供统一的图形函数接口。笔者在实际工作中,为每一种显示设备编写了一个256色的BGI格式的驱动程序,这样,在编写图形系统时,再也没有必要考虑用户的实际显示设备了。

三、范例

本文附有两个图形显示的例子。ShowGif能显示16/256色GIF格式图像,能以任何256色模式启动,支持多种显示器。图像可以漫游,并可随时通过按键切换显示方式。Main则是一个BGI驱动的鼠标/键盘控制的256色汉字图形菜单。它自己会挑选一个合适的BGI,也可以从命令行指定一个BGI(比如指定VESA256给TVGA显示器)。

限于篇幅,这里仅给出有关的数据结构和部分函数的说明(程序2)。然后给出一个初始化显

示系统的C语言片断(程序3)。

程序2(TVGA256.H):

/*统一的模式集*/

enumTVGA-MODE

TVGA320x200=0,

TVGA640x400=1,

TVGA640x480=2,

TVGA800x600=3,

TVGA1024x768=4,

;

voidTVGA256-driver(void);

voidPVGA256-driver(void);

voidAVGA256-driver(void);

...

voidVESA256-driver(void);

externintfar-CdeclTVGA256-driver-far[];

externintfar-CdeclPVGA256-driver-far[];

externintfar-CdeclAVGA256-driver-far[];

...

externintfar-CdeclVESA256-driver-far[];

/*支持的VGA集合*/

enumVGAs{

UnKnownVGA,

TridentVGA,

ParadiseVGA,

AheadVGA,

...

VesaVGA

};

/*对应的BGI驱动程序名*/

unsignedchar*Drivers[]={

"TVGA256",

"TVGA256",

"AVGA256",

...

"VESA256",

};

externintDetectVGA(void);

/*功能:检测显示卡的型号

返回值:0-Unknowm1-TridentVGA2-ParadiseVGA

...

x-不能检测出的VGA,但支持VESA

返回值同时写入全局变量vga-type*/

externintVesaFound(void);

/*功能:检测VESABIOS的存在性

返回:0-不支持VESA;

其它-VESA版本号(0x0102即1.02版);

返回值同时写入全程变量vesa-found.*/

externvoidInitVesa(void);

/*功能:初始化VESA.根据-vga-mode模式号换算成VESA的标准模式号填写页粒度(WinGranularity),页大小(WinSize),

和分页例程的入口地址(WinFuncPtr)

VESA的标准模式解释如下:

100h-640x400256

101h-640x480256

102h-800x60016

103h-800x600256

104h-1024x76816

105h-1024x768256etc.

InitVesa供给InitVGA调用*/

externvoidInitVGA(intmode);

/*功能:初始化显示系统(自动调用DetectVGA检测显示卡)

参数:mode=TVGA320x200(0)

TVGA640x400(1)

TVGA640x480(2)

TVGA800x600(3)

TVGA1024x768(4)

返回:InitVGA没有显式的返回值,但它初始化下列全程变量:

vga-mode,vga-width,vga-depth,vga-pages,PageSelect

必要时自动调用InitVesa

*/

externintvga-type;

externintvga-mode;

externintvga-width;

externintvga-depth;

externintvga-pages;

externintvga-pages;

externcharpage-number;

externintvesa-found;

...

程序3(初始化显示系统的程序片断):

...

intGraphDriver,GraphMode;

unsignedchar*bgiDriver="PVGA256";

bgiDriver=Drivers[DetectVGA()];

GraphDriver=installuserdriver(bgiDriver,NULL);

GraphMode=TVGA800x600;

initgraph(&GraphDriver,&GraphMode,"");...

参考文献

驱动程序设计范文第5篇

随着多媒体技术的飞速发展,各种各样的多媒体演示系统在信息领域中发挥着越来越大的作用。其丰富的表现力、生动的视觉及声响效果,大大增强了所演示信息的吸引力。但是,多媒体作品的创作是一项费时费力的工作,不仅涉及到美术、传播、教育、心理等多方面创作因素,而且更需一种能方便地将图、文、声、像等多媒体信息按某种特定要求编合在一起进行表现的方法。为节省多媒体作品的创作时间,需要一种相对简单、集成、高效的创作工具来辅助多媒体作品的创作开发与演播。

本文简要分析了目前流行的多媒体创作工具的特点,提出了一种多媒体创作工具的功能结构、设计方法及实现技术,最后给出一个用VisualBasic语言编写的播放多媒体信息的程序例程。

一、现有多媒体创作工具的类型

目前,最流行的多媒体创作工具主要分为以下三类。

1.描述性语言式

该类工具开发作品的思想是,按书的结构方式将每个标题的开发过程视为一本"书"的组合,每一屏被指定为一页,在每页内可有多级的对象,设定好各页与各页中内容及其之间的动作,然后使用指定的编排设计语言进行作品设计。这类工具中,比较有代表性的是美国Asymetrix公司的MultimediaToolBook工具,其编排设计语言为OPENSCRIPT。这类工具的最大优点是开发时的弹性较好,面向稍懂编程的用户,另外价格较低,易于接受;缺点是整体运行速度慢,虽入门较易,但要掌握其机理需费一番苦功,特别是对多媒体资源的访问,OPENSCRIPT主要通过MCI函数调用,必须在脚本里显式地写出有关调用,且语法和序列并非全直观,又缺少提示,这点足以使非程序员怯步。

2.交互性图标式

这类工具主要是让用户直接在画面上安排所需的元件,定义出元件本身的动作以及元件和元件之间的关系。其工作方式是采用一种形象化的方法在微机上制作多媒体作品,通过选择精简的形象化图标,构成应用程序结构的流程图,然后再往结构中添加内容,流程图定义了多媒体元素的流动过程。这类工具很适合没有程序设计经验的用户,因此在短时间内就可开发出一套交互式的多媒体系统。这类工具中,著名的有美国authorware公司开发的AuthorwareProfessional及美国AimTech公司的IconAuthor。其主要用于开发事件驱动的、需要高交互性的教育、训练模拟以及导览系统。这类工具不足之处是价格一般很贵,灵活性方面受现有系统的限制。

3.时间流程式

该类工具较适合于开发简报系统,它在多媒体显示上具有较强的时间前后顺序,以图形、文字信息为主。比较著名的有ACTION工具、PowerPoint、HarvardGraphic工具等。该类工具对多媒体信息的支持基本上是通过OLE外部方式进行的,因此,演播多媒体时磁盘I/O动作频繁,系统开销大,运行效率低。

上述三类多媒体创作工具开发的运行环境是基于Windows3.X,可处理的音频文件格式为wav、mid;静态图像文件格式为pcx、bmp、gif、tga、jpg、tif、wmf、dib等;动态图像格式为avi、fli、flc等。

二、多媒体创作系统的功能及设计方法通过以上分析,可看出多媒体创作系统一般具有如下特点。

1.易于入门,无需专业级程序员的编程经验,但熟练掌握不易。对某些特定的简单要求,往往要通过熟练掌握后所得到的使用技巧来实现。另外,对时效要求高、常修改的内容,修改也不甚方便。

2.支持许多硬设备和许多文件格式,可生成含有图形、图像、文本、声音、动画、视频元素的复杂产品。

3.具有流程控制能力,可为上述元素提供导引框架。

4.虽包含了图形编辑、动态编辑、数字式动画、视频编辑等多项工具,但多媒体数据的制作能力不如专用软件功能强、精美。

当前,处理多媒体信息的专用软件资源比较丰富,文字方面有WordforWindows、WPS等;图形图像方面有PhotoStyler、Photoshop、CorelDraw等;动画方面有Animator、3DS等;视频方面有VideoforWind

ows、AdobePremiere、QuicktimeforWindows等;声音方面有SoundSystem、WaveEdit等。

对用户而言,已掌握了多媒体处理专用软件,还得学习创作系统中的功能较弱的媒体处理工具,是某种意义上的重复。用户要求在媒体素材设计上精雕细凿,媒体作品演播时灵敏高效。因此,我们的设计原则是,利用现有功能强大的多媒体处理工具,采用系统集成与软件编程相结合的方法,缩短开发周期以创造最佳的软件。既兼顾一般要求,又满足用户演播的特定要求。在方法上综合描述性语言及图标式创作工具的优点,以及软件编程开发在系统弹性和扩充上灵活、应用范围广、用户具体要求明确、软件资源节约的特点,克服现有创作工具灵活

性弱、受现有系统限制的不足。

所设计的多媒体创作系统各模块主要功能如下。

·文本编辑:这是一个文本编辑器,它将所要演播的文字底稿逐行输入,形成文本文件。

·剧本编辑整合:提供一种方便、高效、直观的图、文、声、像数据集成的编辑手段,按用户的设计要求,对各种媒体数据进行编辑整合,制成各媒体对象的进出入效果(如闪烁、飞行、旋转、淡入淡出、大小、定位等等),最后形成一个剧本文件供演播时调用。

·图形图像处理:图形图像部分挂接PhotoShop或PhotoStyler软件,处理多种位图文件,包括wmf、tif、bmp、pcx、tag、gif、dib、jpg等等格式;统计图形方面提供制作各种二维、三维统计图形的手段。

·剧本演播:将剧本编辑整合处理形成的剧本文件直接调入演播,可按自动播放方式或导引、单步控制播放方式进行播出。对动态图像播放可控制暂停、继续。

·二维动画处理:挂接Animator二维动画处理软件,处理并形成fli、flc格式动画文件。

·三维动画处理:挂接3DS三维动画处理软件,制作并形成flc、fli格式的动画文件。

·视频处理:挂接Videoforwindows、QuickTimeforWindows、AdobePremiere软件。对质量要求一般的视频影像,经电视、VCR或影碟机播出,通过视频捕捉卡,处理形成avi、mov格式的视频文件。而对质量要求高、需全屏显示的视频影像,则使用专用数字视频采样压缩工具生成mpeg、dat影像文件存于CD-ROM中,播放时,使用MPEG视频解压卡,将影像文件从光盘中调出,实时解压缩,满足全屏幕、全运动、全彩色的视觉要求。

·声音处理:主要挂接Soundsystem或WaveEdit,处理mid、wav格式的语音文件,并能使用CD-AUDIO音碟资源。

·地图标绘与动画处理:主要处理点阵、矢量地图的标绘及基于地图的简单动画,如箭头、飞机、舰船、车辆等运动目标沿轨迹运动、闪烁、变化过程等,并形成ate自定义格式文件,供演播时调用。

·外接演播工具:主要外挂其它各种多媒体创作工具的演播软件来播放其制作的作品文件。如挂接PowerPoint的PPTVIEW程序,挂接Authorware的RUNAPW程序。

三、多媒体创作系统设计技术的实现

我们在静态图形、图像处理上,使用WindowsAPI编程技术,结合OLE方法;在多媒体数据处理方面,充分使用MCI接口,将各种媒体的编演融合一体。

编程语言采用VisualBasic及VisualC++语言,同时充分利用第三方厂家提供的这两种语言的用户控制对象来解决图、文、声、像等多媒体演播时可能存在的效果限制问题。

1.图、文、声、像的编辑整合功能

具有高效方便的图、文、声、像等多媒体数据编辑整合功能是多媒体创作工具的特点。我们提出了以下这种基于表格方式,以页操作为主的多媒体数据编辑整合的实现方法。

表格形式如表1。

首先将文字底稿调入并自动填入到上述表格中,然后,用清屏方式来定义属于同一页的文字,并定义好该页的背景色、字体、前景色以及该页正文出页方式,根据需要还可定义出该页正文所在行的操作方式、条件及其位置。系统还提供缺省的版面布局供用户使用。

表1

定义好一页的文字以后,就可定义与该页有关的多媒体信息之间的有机关系,可选择声音文件、动画文件、视频文件、统计图、地图标绘动画数据,并定义这些媒体的播放位置、触发条件及进出场效果等。

另外,还可嵌入播放其它著作工具的作品并融合到播出中。这种编辑方法使整个格本形成一个前后一贯的大表格,前、后、左、右滚动可直观方便地浏览全部剧本,操作非常简便,整体性好,每页随时可进行修改,并可随时察看每页效果。

2.多媒体数据访问的实现

(1)采用WindowsAPI处理多媒体数据

我们使用BITBLT函数实现图形图像的变化,MCI接口处理音频、视频、动画、CD-AUDIO数据的播放。

Windows3.1中的MMSYSTEM.DLL动态连接程序库提供了大约一百多个具有多媒体处理能力的API函数,其MCI函数提供了与设备无关的程序接口,应用程序可以通过MCI命令访问符合MCI控制标准的多媒体设备,MCI接口覆盖了多媒体的主要领域,因此可以满足大多数应用系统的开发需要。由于MCI的设备无关性,更换设备时只需更换MCI驱动程序,无需了解每种多媒体产品的细节,系统升级十分方便,提高了应用系统的开发效率及灵活性。

在系统开发中,主要用到的MCI多媒体设备类型及驱动程序如表2。

表2

其余的mpg、dat等视频格式的设备类型及MCI驱动程序视其产品提供的MCI驱动程序而定。

(2)利用用户控制对象VBX进行编程,处理图、文、声、像等多媒体数据

目前有众多知名厂商开发出各类VBX控制对象,支持VisualC++、VisualBasic,VBX有可能成为标准文件格式。这类功能强大的VBX控制对象是开发多媒体系统,提高开发效率,缩短开发周期的有效武器,使我们对复杂的图文特效及外部设备的控制都交给了控制对象去处理,大大减少了编程的工作量,而且准确性、高效性大大地提高。

开发多媒体系统常用到的VBX主要有:支持MCI接口的MCI.VBX(Microsoft公司);支持flc、fli动画演播的VBPLAY.VBX(Autodesk公司);支持图文播放效果的FXTools/VB(ImageFx公司)、Knife.VBX(ImageKnife)、MHPicture.VBX(MicroHelp公司);支持图形、图像、文字播放效果的FXImage.VBX、FXLabel.VBX;支持mov视频播放的QtMove.VBX、QtView.VBX。

四、结束语

多媒体创作系统的开发与通常的应用系统开发有一定的差异,既要有丰富的编程经验,又要充分了解多媒体的特点。

善于利用多媒体集成工具,就能在应用系统开发中作到事半功倍。完成多媒体作品相当部分的工作量在于图形、图像、声音、影像素材的准备,其技术及艺术含量都很高。而多媒体创作系统,其目的是便于用户高效地使用创作工具按某种构想,将图、文、声、像等媒体进行导演、创意及包装。

目前,多媒体创作工具种类越来越多,随着多媒体技术应用发展的深入,开发多媒体的技术将越来越先进、越科学、越方便、越有效。

本系统应用范围广,适用于需经常制作多媒体作品的教育、军事、旅游等部门。

以下是一个用MCI.VBX控制对象来播放多媒体数据的函数实例(VisualBasic编写,对MPEG视频以realmagicMPEG解压卡为例),可看出用控制对象处理多媒体信息的方便高效性。

constMCI_MODE_NOT_OPEN=524

Subclosemedia(byValmediatype)''''关闭媒体

SelectCasemediatype

Case"video","sound","animator"

ifNotMMControl1.Mode=MCI_MODE_NOT_OPENThen

MMControl1.Wait=True

mand="Close"

EndIf

Case"graph"

image.Picture=LoadPicture("")

image.Visible=False

EndSelect

EndSub

SubopenMedia(mediatypeAsString,medianameAsString)''''

打开并演播媒体

IfNotMMControl.Mode=MCI_MODE_NOT_OPEN_Then

MMControl.Wait=True

mand="Close"

EndIf

SelectCaseMediatype

Case"graph"''''图像

image.Picture=LoadPicture(medianame)

image.Visible=True

exitsub

Case"sound"''''声音

tt$=UCase(Right$(medianame,3))

SelectCasett$

Case"WAV"

MMControl.DeviceType="WaveAudio"

Case"MID"

MMControl.DeviceType="Sequencer"

EndSelect

Case"animator"''''二、三维动画

tt$=UCase(Right$(medianame,3))

SelectCasett$

Case"FLC","FLI"

Mmcontrol.DeviceType="Animation1"

Case"MMM"

Mmcontrol.DeviceType="MMMovie"

EndSelect

Case"video"''''视频

tt!=UCase(Right$(medianame,3))

SelectCasttt$

Case"AVI"

Mmcontrol.DeviceType="AVIVideo"

Case"MOV"

Mmcontrol.DeviceType="QtwVideo"

Case"MPG"

Mmcontrol.DeviceType="MMaster"''''reelmagic设备名

Case"DAT"

Mmcontrol.DeviceType="MMaster"''''reelmagic设备名

Case"CDI"

Mmcontrol.DeviceType="MMaster"''''reelmagic设备名

EndSelect

EndSelect

Mmcontrol.FileName=medianame

Mmcontrol.Wait=True

mand="Open"''''打开设备

Mmcontrol.Notify=True

友情链接