编写设备驱动程序

PCI 地址域

PCI 地址域包含三种不同的地址空间: 配置、内存以及 I/O 空间。

PCI 配置地址空间

配置空间按地理位置定义。外围设备的位置通过它在互连的 PCI 总线网桥树中的物理位置确定。设备按其总线编号设备插槽编号进行定位。每个外围设备在其 PCI 配置空间中都包含一组明确定义的配置寄存器。这些寄存器不仅用于标识设备,还用于为配置框架提供设备配置信息。例如,必须首先映射设备配置空间中的基址寄存器,然后设备才能响应数据访问。

生成配置周期的方法取决于主机。x86 计算机中使用的是特殊的 I/O 端口。在其他平台上,可以将 PCI 配置空间内存映射到对应于主机地址域中 PCI 主桥 (host bridge) 的某些地址位置。处理器访问设备配置寄存器时,会将请求路由到 PCI 主桥 (host bridge)。然后,该桥会在总线上将访问转换为正确的配置周期。

PCI 配置基址寄存器

PCI 配置空间针对每台设备最多包含六个 32 位基址寄存器。这些寄存器可同时提供大小和数据类型信息。系统固件会将 PCI 地址域中的基本地址分配给这些寄存器。

每个可寻址区域既可以是内存空间,也可以是 I/O 空间。基址寄存器的位 0 包含的值用于标识类型。位 0 中的值为 0 表示内存空间,值为 1 表示 I/O 空间。下图显示了两种基址寄存器: 一种表示内存类型,另一种表示 I/O 类型。

图 A–4 内存和 I/O 的基址寄存器

图中显示了基本地址中的位 0 如何表示内存或 I/O 空间。

PCI 内存地址空间

PCI 同时支持 32 位和 64 位的内存空间地址。系统固件会将 PCI 地址域中的内存空间区域分配给 PCI 外围设备。区域的基本地址存储在设备的 PCI 配置空间的基址寄存器中。每个区域的大小必须是 2 的幂,并且所分配的基本地址必须在与区域大小相等的边界上对齐。内存空间中的设备地址会内存映射到主机地址域中,以便处理器的本机装入指令或存储指令可以对任何设备执行数据访问。

PCI I/O 地址空间

PCI 支持 32 位 I/O 空间。可以在不同的平台上以不同方式访问 I/O 空间。带有特殊 I/O 指令的处理器(如 Intel 处理器系列)使用 inout 指令访问 I/O 空间。没有特殊 I/O 指令的计算机将映射到对应于主机地址域中 PCI 主桥 (host bridge) 的地址位置。处理器访问内存映射的地址时,会向 PCI 主桥 (host bridge) 发送一个 I/O 请求,该主桥 (host bridge) 随后会将地址转换为 I/O 周期并将其放置在 PCI 总线上。内存映射的 I/O 通过处理器的本机装入/存储指令执行。

PCI 硬件配置文件

对于 PCI 局部总线设备,硬件配置文件应是不必要的。但是在某些情况下,PCI 设备的驱动程序需要使用硬件配置文件来增加驱动程序的专用信息。有关更多详细信息,请参见 driver.conf(4)pci(4) 手册页。