Linux 核心--7.PCI设备

第六章 PCI

外围设备互连(PCI)是一种将系统中外部设备以结构化与可控制方式连接到起来的总线标准 , 包括系统部件连接的电气特性及行为 。本章将详细讨论Linux核心对系统中的PCI总线与设备的初始化过程 。






图6.1 一个基于PCI的系统示意图

图6.1是一个基于PCI的系统示意图 。PCI总线和PCI-PCI桥接器在连接系统中设备到上起关键作用 , 在这个系统中CPU和视频设备被连到PCI bus 0上 , 它是系统中的主干PCI总线 。而PCI-PCI桥接器这个特殊PCI设备将主干总线PCI bus 0与下级总线PCI bus 1连接到一起 。PCI标准术语中 , PCI bus 1是PCI-PCI桥接器的downstream而PCI bus 0是此桥接器的up-stream 。SCSI和以太网设备通过二级PCI总线连接到这个系统中 。而在物理实现上 , 桥接器和二级PCI总线被集成到一块PCI卡上 。而PCI-ISA桥接器用来支持古老的ISA设备 , 图中有一个高级I/O控制芯片来控制键盘、鼠标及软盘设备 。


6.1PCI地址空间
CPU和PCI设备需要存取在它们之间共享的内存空间 。这块内存区域被设备驱动用来控制PCI设备并在CPU与PCI设备之间传递信息 。最典型的共享内存包括设备的控制与状态寄存器 。这些寄存器用来控制设备并读取其 信息 。例如PCI SCSI设备驱动可以通过读取其状态寄存器 , 找出已准备好将一块数据写入SCSI磁盘的SCSI设备 。同时还可以在设备加电后 , 通过对控制寄存器写入信息来启动设备 。

CPU的系统内存可以被用作这种共享内存 , 但是如果采用这种方式 , 则每次PCI设备访问此内存块时 , CPU将被迫停止工作以等待PCI设备完成此操作 。这种方式将共享内存限制成每次只允许一个系统设备访问 。该策略会大大降低系统性能 。但如果允许系统外设不受限制地访问主存也不是好办法 。它的危险之处在于一个有恶意行为的设备将使整个系统置于不稳定状态 。

外设有其自身的内存空间 。CPU可以自由存取此空间 , 但设备对系统主存的访问将处于DMA(直接内存访问)通道的严格控制下 。ISA设备需要存取两个地址空间:ISA I/O(输入输出)和ISA内存 。而PCI设备需要访问三种地址空间:PCI I/O、PCI内存和PCI配置空间 。CPU则可以访问所有这些地址空间 。PCI I/O和 PCI内存由设备驱动程序使用而PCI配置空间被Linux 核心中的PCI初始化代码使用 。

Alpha AXP处理器并不能象访问系统地址空间那样随意访问这些地址空间 , 它只能通过辅助芯片组来存取这些 地址空间 , 如PCI配置空间 。Alpha AXP处理器使用稀疏地址映射策略来从系统巨大的虚拟内存中"窃取"一部分并将其映射到PCI地址空间 。


6.2PCI 配置头



图6.2 PCI配置头


系统中每个PCI设备 , 包括PCI-PCI桥接器在内 , 都有一个配置数据结构 , 它通常位于PCI配置地址空间中 。PCI配置头允许系统来标识与控制设备 。配置头在PCI配置空间的位置取决于系统中PCI设备的拓扑结构 。例如将一个PCI视频卡插入不同的PCI槽 , 其配置头位置会变化 。但对系统没什么影响 , 系统将找到每个PCI设备与桥接器并使用它们配置头中的信息来配置其寄存器 。

典型的办法是用PCI槽相对主板的位置来决定其PCI配置头在配置空间中的偏移 。比如主板中的第一个PCI槽的PCI配置头位于配置空间偏移0处 , 而第二个则位于偏移256处(所有PCI配置头长度都相等 , 为256字节) , 其它槽可以由此类推 。系统还将提供一种硬件相关机制以便PCI设置代码能正确的辨认出对应PCI总线上所有存在的设备的PCI配置头 。通过PCI配置头中的某些域来判断哪些设备存在及哪些设备不存在(这个域叫厂商标志域: Vendor Identification field) 。对空PCI槽中这个域的读操作将得到一个值为0xFFFFFFFF的错误信息 。

推荐阅读