PCI 设备 Windows NT 平台驱动程序设计
引言
在设计和使用 PCI 设备时,经常要在 PC 机的软件中访问和控制硬件设备,但 Windows 操
作系统 (Windows NT、Windows2000、WindowsXP)为了保证系统的安全性、稳定性和可
移植性,对应用程序访问硬件资源加以限制,这就要求设计设备驱动程 序以实现 PC 机的
软件对 PCI 设备的访问。
内核(Kernel)模式的驱动程序可以应用于 WINDOWS NT 和 WINDOWS 2000 的操作系统
中。它区别于 WDM(Win32 Driver Model)模型,主要不支持即插即用,但对于编程的思
想二者基本上一致,对于本文所述的 DMA 编程的方法在 WDM 模式的驱动程序中一样适
合。
本 文 通 过现 有 最常 见的 AMCC 公 司 生产 的 AMCC S5933 PCI 控 制芯 片 为例 说明 在
WINDOWS NT 平台下如何编写设备驱动程序以实现 DMA 传输方式。本文对基本的驱动程
序设计技术不作详细的说明,重点介绍 PCI 设备驱动程序开发的相关技术与实现方 法,以
及用户接口程序的设计与实现技术。
1 NT 平台驱动程序模式及开发工具
设备驱动程序是指管理某个外围设备的一段代码,驱动程序不会独立地存在,而是操作系
统的一部分。通过设备驱动程序,多个进程可以同时使用这些资源,从而可以实现多进程
并行运行。在本文中,将调用设备驱动程序的 PC 机程序称为用户程序。
Intel 80386 以上的微处理器有 4 个优先级别:0 级、1 级、2 级和 3 级。Windows NT 使用了
一个简化的模型描述硬件特权级,然后这个模型映射到指定 CPU 上可用的特权检查机制,
即内核模式和用户模式。内核模式对应于 Intel 系统的 0 级,可以执行特权级指令,对任何
I/O 设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。用户模式对应于
Intel 系统的 3 级环,用户程序在 该模式下运行,对硬件的访问操作受到系统的限制。
开发设备驱动采用的工具包括微软为驱动开发提供的设备驱动开发包( Device Driver
Kit,DDK)。 DDK 开发包提供了设备开发的帮助文档,编译需要的头文件和库文件,调
试工具和范例程序。基于 NT DDK 使用 C 语言编写,因此我们使用 VC++6.0 作为编辑与编
译工具。内核调试工具选用了 Numega 公司的产品 SoftICE。
2 PCI 设备驱动开发的特点
2.1PCI 配置空间
每个 PCI 设备都有自己的配置空间,用于支持即插即用,使之满足现行的系统配置结构。
下面对 PCI 配置空间做一下简要介绍。
配 置空间是一容量为 256 字节并具有特定结构的地址空间。这个空间又分为头标区和设备
有关区两部分。头标区的长度是 64 字节,每个设备都必须配置该区的寄存 器。该区中的
各个字段用来唯一地识别设备。其余的 192 字节因设备而异。配置空间的头标区 64 个字节
的使用情况如图 1 示。
为了实现即插即用,系统可根据硬件资源的使用情况,为 PCI 设备分配新的资源。因此编
写设备驱动程序重点是获得基址寄存器(Base Address)和中断干线寄存器的内容。配置空
间共有六个基址寄存器和一个中断干线寄存器,具体用法如下:
PCI Base Address 0 寄存器:系统利用此寄存器为 PCI 接口芯片的配置寄存器分配一段 PCI
地址空间,通过这段地址我们可以以内存映射的形式访问 PCI 接口芯片的配置寄存器。
PCI Base Address 1 寄存器:系统利用此寄存器为 PCI 接口芯片的配置寄存器分配一段 PCI
地址空间,通过这段地址我们可以以 I/O 的形式访问 PCI 接口芯片的配置寄存器。
PCI Base Address 2、3、4、5 寄存器:系统 BIOS 利用这些寄存器分配 PCI 地址空间以支持
评论1