嵌入式系统嵌入式系统/ARM技术中的技术中的ISA数据通讯卡数据通讯卡WDM驱动程序的实驱动程序的实
现现
WDM(Windows Driver Mode1)是Microsoft公司全新的Windows驱动程序模式,支持即插即用(PNP)、电
源管理和WMI技术,它的运行平台是Windows 98/2000/XP/2003操作系统。这种具有跨平台性的设备驱动
模型可以大大简化驱动程序的开发工作,为用户的PNP设备驱动完成了大量的底层工作。这也使得WDM对各种
老设备,特别是那些不具有即插即用特性硬件的支持明显的不足。在科研和工控中,最常用的数据采集卡通常
都是基于PC总线的不能为PNP提供硬件支持的ISA设备。为这类硬件编写非WDM驱动程序只能局部支持PNP特
性,而且需要做大量额外的工作如:必须检测硬件,为
WDM(Windows Driver Mode1)是Microsoft公司全新的Windows驱动程序模式,支持即插即用(PNP)、电源管理和
WMI技术,它的运行平台是Windows 98/2000/XP/2003操作系统。这种具有跨平台性的设备驱动模型可以大大简化驱动
程序的开发工作,为用户的PNP设备驱动完成了大量的底层工作。这也使得WDM对各种老设备,特别是那些不具有即插即用
特性硬件的支持明显的不足。在科研和工控中,最常用的数据采集卡通常都是基于PC总线的不能为PNP提供硬件支持的ISA
设备。为这类硬件编写非WDM驱动程序只能局部支持PNP特性,而且需要做大量额外的工作如:必须检测硬件,为硬件创建
设备对象(用于代表硬件),配置并初始化硬件使其正常工作,这些工作非常复杂。利用WDM可以大大简化这些工作。
1 WDM的结构的结构
WDM实际上是一个编写驱动程序的规范。其驱动程序结构的特点和WINDOWS程序设计的消息驱动机制很相像,采用
IRP驱动机制。WINDOWS 98和WINDOWS 2000处理IRP的方式一样,本质却完全不同。
Windows2000的内存管理采用了虚拟内存的概念,系统表现为具有一个比物理内存大得多的虚拟内存空间。每个进程都
被赋予它自己的虚拟地址空间,这个地址空间划分成固定大小的页(x86、32位处理器的页大小为4KB),一个页可以驻留在
物理内存(非分页内存),或者被交换到硬盘上(分页内存)。当进程中的一个线程正在运行时,该线程可以访问只属于它的
进程的内存,属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。每个进程有独立的内存空间,不会被其他
程序访问,保护了数据的完整性。这样,有一部分内存实际上不是在物理内存中,而是在硬盘上。当访问并不存在于实际物理
内存的地址时,内存管理器引发DISPATCH_ LEVEL级别的页故障中断,调用硬盘驱动程序把故障页读入内存。所以,在
DISPATCH LEVEL级别上运行代码时,访问非分页内存是一个基本原则,否则进程将被阻塞,因为这个页故障中断被屏蔽
了。这时,在当前的Windows系统中,就会发生蓝屏。虚拟内存方便了应用程序l的开发,却给ISA设备在分配资源时带来一些
复杂的问题。因为x86处理器的内存页大小为4KB,所以在为ISA设备进行内存映射时每段就不要超过4KB。否则当访问超出
4KB地内存时就会出现上面所说的蓝屏。
WDM驱动程序面对的主要内容是一系列内核驱动对象。这些对象包括驱动对象、设备对象,还有一系列的资源抽象对象
如中断对象、适配器对象(处理DMA操作)、内核模式派发器对象、控制器对象、推迟过程对象、定时器对象、设备队列对
象、回调对象等。其中驱动对象由I/O管理器负责创建和管理。WDM驱动程序利用IRP和这些对象完成硬件设备的抽象化,并
对应用程序提供统一操作接口。这就是所谓的WDM规范。
WDM驱动程序的结构很简单。它的主体是一个入口函数DriverEntry。DriverEntry的第一个参数是指针,指向一个刚被初
始化的驱动程序对象,该对象代表驱动程序。WDM驱动程序的DriverEntry例程完成这个对象的初始化并返回。WDM驱动程序
的DriverEntry例程的主要工作是把各种函数指针填入驱动程序对象。这些指针对操作系统指明了驱动程序容器中各种子例程的
位置。它包括下面这些指针成员:
·DriverUnload指向驱动程序的清除例程。I/O管理器会在卸载驱动程序前调用该例程。通常WDM驱动程序的DriverEntry例
程一般不分配任何资源,所以DriverUnload例程也没有什么清除工作要做。
·DriverStartIo,如果驱动程序使用标准的串行IRP,则必须使用这个函数,使它指向驱动程序的StarIo例程。
·MajorFunction是一个指针数组,它主要处理各种用户的I/O请求IRP。默认情总况下,用户的所有I/O请求都会由I/O管理
器返回失败。驱动程序为要处理的IRP指定相应的派遣函数。
2 为为ISA设备分配资源设备分配资源
虽然WDM驱动程序可以简化很多工作,但是给ISA设备编写WDM驱动程序也有困难。这个困难是ISA设备所需资源的分
配问题。根据PNP的规范,支持PNP的设备如PCI总线设备有相应的寄存器标识自己和自己可以接受的资源,如中断、端口范
围、内存范围等,并且有相应的逻辑支持配置资源。这使得操作系统启动过程中可以动态地规划调整各个设备的资源而不需要
用户的干预。为了兼容非PNP设备,INF文件支持几个命令为设备分配资源。这些信息初提供给NPN管理器,并且被PNP管理
器用来与系统其它部分协商以完成非PNP设备的自动资源分配。LOGCONFIG为设备制定一个可选的资源设定。还有相应的
IRQCONFIG、IOCONFIG、DMACONFIG、MEMCONFIG子命令,它们为设备指定具体的可选资源。语法如下:
[<log-config-section-name>]
ConfigPririty=<priority-value>
[DMAConfig=<dma-list>]
[IOConfig=<io-range-list]