- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
PCI设备Windows通用驱动程序设计
录入:edatop.com 点击:
在设计和使用PCI设备时,经常要在PC机的软件中访问和控制硬件设备,但Windows操作系统(包括Windows 95/98、Windows NT、Windows 2000)为了保证系统的安全性、稳定性和可移植性,对应用程序访问硬件资源加以限制,这就要求设计设备驱动程序以实现PC机的软件对PCI设备的访问。
Windows下的驱动程序不仅仅包括物理设备的驱动程序,也包括为文件系统等非物理设备编写的虚拟设备驱动程序。为了简化问题,下面只讨论硬件物理设备的驱动程序。本文将以"通用高速PCI总线目标模块"[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 NT 5.0)中。从长远的角度看。今后开发人员只要开发WDM驱动就可以了,但从目前的市场情况来看,Windows 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为扩展名,放在WindowsSystem目录下,可以在Windows 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 95 DDK容易。
2 PCI驱动程序的特点
在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。硬件设备的特性会对驱动程序设计产生重大的影响。需要了解的最主要的硬件特性包括:
(1)设备的总线结构
设备采用什么总线结构非常关键,因为不同的总线类型(如ISA和PCI)在许多硬件工作机制上是不同的,所以驱动程序设计也不同。
(2)寄存器
要了解设置的控制寄存器、数据寄存器和状态寄存器,以及这些寄存器工作的特性。
(3)设备错误和状态
要了解如何判断设备的状态和错误信号,这些信号要通过驱动程序返回给用户。
(4)中断行为
要了解设备产生中断的条件和使用中断的数量。
(5)数据传输机制
最常见的数据传输机制是通过I/O端口(port),也就是通过CPU的IN/OUT指令进行数据读写。PC的另一种重要的传输机制是DMA,但PCI规范不包括从属DMA的说明。
(6)设备内存
许多设备自身带有内存,PCI设备大多是采用映射的方式映射到PC系统的物理内存。有的设备还要通过驱动程序设置设备的接口寄存器。
有关驱动程序的加载和响应用户请求的内容,在DDK文档中有规定,所以设计设备驱动程序主要的面临问题是如何进行硬件操作,这是根据设备的不同而不同的。而硬件驱动程序的功能虽然千差万别,但基本功能就是完成设备的初始化、对端口的读写操作、中断的设置、响应和调用以及对内存的直接读写。如前面所说,Windows 9x和Windows NT的操作系统模型不同,但驱动程序所要完成的工作却是相同的,所以下面以Windows 9x为主进行介绍,仅在需要的地方指出两个操作系统的不同。
Windows下的驱动程序不仅仅包括物理设备的驱动程序,也包括为文件系统等非物理设备编写的虚拟设备驱动程序。为了简化问题,下面只讨论硬件物理设备的驱动程序。本文将以"通用高速PCI总线目标模块"[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 NT 5.0)中。从长远的角度看。今后开发人员只要开发WDM驱动就可以了,但从目前的市场情况来看,Windows 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为扩展名,放在WindowsSystem目录下,可以在Windows 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 95 DDK容易。
2 PCI驱动程序的特点
在设计驱动程序之前,首先要对欲控制的硬件设备进行细致地分析,更需要详细了解硬件设备的特性。硬件设备的特性会对驱动程序设计产生重大的影响。需要了解的最主要的硬件特性包括:
(1)设备的总线结构
设备采用什么总线结构非常关键,因为不同的总线类型(如ISA和PCI)在许多硬件工作机制上是不同的,所以驱动程序设计也不同。
(2)寄存器
要了解设置的控制寄存器、数据寄存器和状态寄存器,以及这些寄存器工作的特性。
(3)设备错误和状态
要了解如何判断设备的状态和错误信号,这些信号要通过驱动程序返回给用户。
(4)中断行为
要了解设备产生中断的条件和使用中断的数量。
(5)数据传输机制
最常见的数据传输机制是通过I/O端口(port),也就是通过CPU的IN/OUT指令进行数据读写。PC的另一种重要的传输机制是DMA,但PCI规范不包括从属DMA的说明。
(6)设备内存
许多设备自身带有内存,PCI设备大多是采用映射的方式映射到PC系统的物理内存。有的设备还要通过驱动程序设置设备的接口寄存器。
有关驱动程序的加载和响应用户请求的内容,在DDK文档中有规定,所以设计设备驱动程序主要的面临问题是如何进行硬件操作,这是根据设备的不同而不同的。而硬件驱动程序的功能虽然千差万别,但基本功能就是完成设备的初始化、对端口的读写操作、中断的设置、响应和调用以及对内存的直接读写。如前面所说,Windows 9x和Windows NT的操作系统模型不同,但驱动程序所要完成的工作却是相同的,所以下面以Windows 9x为主进行介绍,仅在需要的地方指出两个操作系统的不同。
上一篇:赛灵思无线解决方案:下一代无线技术的创新
下一篇:Google神秘服务器大公开