Linux 核心--7.PCI设备( 二 )



图6.2给出了256字节PCI配置头的结构 , 它包含以下域:


厂商标识(Vendor Identification)
用来唯一标识PCI设备生产厂家的数值 。Digital的PCI厂商标识为0x1011而Intel的为0x8086 。
设备标识(Device Identification)
用来唯一标识设备的数值 。Digital 21141快速以太设备的设备标识为0x0009 。
状态(Status)
此域提供PCI标准定义中此设备的状态信息 。
命令(Command)
通过对此域的写可以控制此设备 , 如允许设备访问PCI I/O内存 。
分类代码(Class Code)
此域标识本设备的类型 。对于每种类型的视频 , SCSI等设备都有标准的分类代码 。如SCSI设备分类代码为0x0100 。
基地址寄存器(Base Address Registers)
这些寄存器用来决定和分配此设备可以使用的PCI I/O与PCI内存空间的类型 , 数量及位置 。
中断引脚(Interrupt Pin)
PCI卡上的四个物理引脚可以将中断信号从插卡上带到PCI总线上 。这四个引脚标准的标记分别为A、B、C及D 。中断引脚域描叙此PCI设备使用的引脚号 。通常特定设备都是采用硬连接方式 。这也是系统启动时 , 设备总使用相同中断引脚的原因 。中断处理子系统用它来管理来自该设备的中断 。
中断连线(Interrupt Line)
本设备配置头中的中断连线域用来在PCI初始化代码、设备驱动以及Linux中断处理子系统间传递中断处理过程 。虽然本域中记录的这个数值对于设备驱动毫无意义 。但是它可以将中断处理过程从PCI卡上正确路由到Linux操作系统中相应的设备驱动中断处理代码中 。在interrupt一章中将详细描叙Linux中断处理过程 。

6.3PCI I/O和PCI内存地址
这两个地址空间用来实现PCI设备和Linux核心中设备驱动程序之间的通讯 。例如DEC21141快速以太网设备的内部寄存器被映射到PIC I/O空间上时 , 其对应的Linux设备驱动可以通过对这些寄存器的读写来控制此设备 。PCI视频卡通常使用大量的PCI内存空间来存储视频信息 。

在PCI系统建立并通过用PCI配置头中的命令域来打开这些地址空间前 , 系统决不允许对它们进行存取 。值得注意的是只有PCI配置代码读取和写入PCI配置空间 , Linux设备驱动只读写PCI I/O和PCI内存地址 。


6.4PCI-ISA 桥接器
这种桥接器通过将PCI I/O和PCI内存空间的存取转换成对ISA I/O和ISA内存的存取来支持古老的ISA设备 。市场上许多主板中同时包含几个ISA总线槽和PCI槽 。但今后对ISA设备的向后兼容支持将逐渐减弱 , 最终主板上只会有PCI槽 。早期的Intel 8080 PC就将ISA设备的ISA地址空间固定了下来 。即使在价值5000美圆的Alpha AXP 系统中其ISA软盘控制器地址也和最早IBM PC上的相同 。PCI标准将PCI I/O和PCI内存的低端部分保留给系统中的ISA外设 , 另外还使用PCI-ISA桥接器实现从PCI内存访问到ISA内存访问的转换 。

6.5PCI-PCI 桥接器
PCI-PCI桥接器是一种将系统中所有PCI总线连接起来的特殊PCI设备 。在简单系统中只存在一条PCI总线 , 由于受电气特性的限制 , 它所连接的PCI设备个数有限 。引入PCI-PCI桥接器后系统可以使用更多的PCI设备 。对于高性能服务器这是非常重要的 。Linux提供了对PCI-PCI桥接器的全面支持 。


6.5.1PCI-PCI桥接器:PCI I/O和PCI 内存窗口
PCI-PCI桥接器将PCI I/O和PCI内存读写请求中的一个子集向下传送 。例如在图6.1中 , 如果来自PCI 总线0请求是对SCSI或以太设备所拥有的PCI I/O或PCI内存的读写 , 则此PCI-PCI桥接器将只需把请求从总线0传递到PCI总线1上;所有其它PCI I/O和内存地址都将被它忽略 。这个过滤使得这些地址信息不会在整个系统中扩散 。为了实现这点 , PCI-PCI桥接器必须编程为有某个PCI I/O及PCI内存基址和上限 , 只有在这个地址范围内的PCI地址访问才能从主干总线传递到二级总线 。一旦系统中的PCI-PCI桥接器被设置成这样 , 则只要当Linux设备驱动程序通过这个窗口访问PCI I/O和PCI内存空间时 , 此PCI-PCI桥接器就将变得透明 。这样也给Linux PCI设备驱动编写者提供了方便 。我们在稍后的讨论中将看到Linux对PCI-PCI桥接器非常巧妙的配置 。

推荐阅读