本文结合“通用高速pci总线目标模块”的驱动程序设计,全面地讨论了windows设备(特别是pci设备)驱动程序编写时所面临的主要问题及解决方案,并提出了封装设备驱动的方法。
关键词: pci设备驱动程序 端口 内存 中断 封装
在设计和使用pci设备时,经常要在pc机的软件中访问和控制硬件设备,但windows操作系统(包括windows95/98、windows nt、windows 2000为了保证系统的安全性、稳定性和可移植性,对应用程序访问硬件资源加以限制,这就要求设计设备驱动程序以实现pc机的软件对pci设备的访问。
windows下的驱动程序不仅仅包括物理设备的驱动程序,也包括为文件系统等非物理设备编写的虚拟设备驱动程序。为了简化问题,下面只讨论硬件物理设备的驱动程序。本文将以撏ㄓ酶咚伲校茫勺芟吣勘昴?閿[1]的驱动设计为例,探讨pci设备的驱动程序设计方案。我们开发了一套通用的pci设备驱动程序,它可以完成一般pci设备驱动所需的功能,可以作为其它pci设备驱动开发的框架。
1 驱动程序的模式和开发工具的选择
设备驱动程序是指管理某个外围设备的一段代码。驱动程序不会独立地存在,而是操作系统的一部分。通过设备驱动程序,多个进程可以同时使用这些资源,从而可以实现多进程并行运行。在下文中,将调用设备驱动程序的pc机程序称为用户程序。
windows 95和windows nt采用的驱动程序体系不同,所以大多数情况下驱动程序也不能通用。如果设备需要在windows 9x/nt下使用,一般至少要设计windows 9x和windows nt两个驱动程序版本。windows 98 可以兼容windows 95的驱动程序,同时它又推出一个新的win32 drivers mode (wdm)驱动类型。windows 98中有些设备(如usb设备)的驱动程序必须为wdm模式。这个新的类型实际是在windows nt的驱动模型的基础上增加了即插即用等内容。wdm驱动也可以用在windows 2000(先前叫windows nt5.0)中。从长远的角度看。今后开发人员只要开发wdm驱动就可以了,但从目前的市场情况来看,windws 95是无法放弃的,所以wdm在近一两年还无法替代其它类型的设备驱动。
intel 80386以上的微处理器有4个优先级别:0级、1级、2级和3级,一般操作系统运行于优先级0级上,而用户程序运行在3级上,在对硬件操作上有一些限制(具体的限制在不同的操作系统中是不同的)。windows 95支持的驱动类型很多,但针对一般硬件设备而言,主要是vxd和打印机驱动两类。vxd指的是virtual device drivers。vxd运行在intel系统的0级上,可以执行特权级指令,对任何i/o设备有全部访问权,所以大多数硬件驱动程序都是vxd。vxd驱动通常以.vxd为扩展名,放在windows\system目录下,可以在windws 95启动时装入,也可以在程序运行时根据需要动态地载入。动态加载有助于节约系统内存和资源。但打印机驱动程序不是vxd,它运行在3级上。同windows 95类似,windows nt的驱动也有可以运行在0级的内核模式(kernel mode)和运行在3极的用户模式(user mode)之分。由于windows nt禁止用户模式的程序访问i/o端口(windows 95/98则允许用户程序直接访问i/o端口),直接控制物理设备的驱动程序都是内核模式的。而我们设计的pci通用驱动程序要求对各种硬件资源访问,所以应该选择工作在0级的驱动程序模式。
开发设备驱动采用的主要开发工具是微软为设备开发者提供的软件包device driver kit (ddk)。这个软件包包括有关设备开发的文档、编译需要的头文件和库文件、调试工具和程序范例。在ddk中还定义了一些设备驱动可以调用的系统底层服务,象dma服务、中断服务、内存管理服务、可安装文件系统服务等等。这些都是编写设备驱动所必须的。但windows 95的ddk由于主要使用汇编语言描述。开发起来比较困难。因此,我们在windows 95操作系统中同时采用了numega公司的产品vtoolsd。vtoolsd是基于c/c++的,支持borland c++和visual c++,使用和维护都较windows ddk容易。
2 pci驱动程序的特点
在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。硬件设备的特性会对驱动程序设计产生重大的影响。需要了解的最主要的硬件特性包括: