
PCI(外设部件互连)总线的诞生与PC(个人计算机)的蓬勃发展密切相关。在处理器体系结构中,PCI总线属于局部总线。作为系统总线的延伸,局部总线的主要功能是连接外部设备。
随着处理器频率的不断提高,要求局部总线具有更快的速度和更高的带宽。起初PC使用8位XT总线作为本地总线,很快升级到16位ISA(工业标准架构)总线。Eisa(扩展工业标准体系结构)、VESA(文章电子标准协会)和MCA(微通道体系结构)总线逐渐发展到32位。
PCI总线规范是在20世纪90年代提出的。这种总线推出后,很快得到了各大主流半导体厂商的认可,并迅速统一了当时并存的各种局部总线。EISA、VESA等32位总线很快被PCI总线淘汰。此后,PCI总线在处理器体系结构中一直扮演着重要的角色。
长期以来,PC处理器系统的大多数外部设备都直接或间接地连接到PCI总线上。目前,即使PCI Express总线已经逐渐取代PCI总线成为PC局部总线的主流,但它能不要隐藏PCI总线的辉煌。
从软件上看,PCI Express总线基本兼容PCI总线;在硬件层面,PCI Express总线很大程度上继承了PCI总线的设计思想。因此,PCI总线仍然是软硬件工程师在开发设计处理器系统时必须掌握的局部总线。
PCI V1.0规范仅针对PCB(印刷电路板)环境中设备之间的互连,而1993年4月30日发布的V2.0规范增加了对PCI插槽的支持。1995年6月1日,PCI V2.1总线规范发布,这是一个里程碑。正是这个规范使得PCI总线大规模普及,到目前为止PCI总线已经完成了对(E)ISA和MCA总线的替代。
到1996年,VESA巴士已经逐渐离开人们的视线。当然,PCI总线可以不能完全提供显卡所需的带宽,AGP总线是VESA总线的真正替代品。随后PCISIG(PCI特别兴趣小组)相继发布了PCI总线V2.2和V2.3的规范,最终将PCI总线的规范固定在了V3.0
除了PCI总线规范,PCISIG还定义了一些与PCI总线相关的规范,如PCMCIA(个人计算机存储卡国际协会)规范、MiniPCI规范等。PCMCIA规范主要针对笔记本电脑应用,然后PCMCIA升级为PC卡(Cardbus)规范,PC卡升级为ExpressCard规范。
PC卡规格基于32位、33MHz PCI总线;ExpressCard规范基于PCI Express和USB 2.0。这两种规格在笔记本电脑领域都取得了成功。除了PCMCIA规范,Mini PCI总线也很受欢迎。与标准PCI插槽相比,Mini PCI插槽占用的面积更小,适用于一些有尺寸要求的应用。
除了上述规范,PCISIG还推出了一系列与PCI总线直接相关的规范。例如PCI到PCI桥规范、PCI电源管理规范、PCI热插拔规范和CompactPCI总线规范。其中PCI-to-PCI桥规范最为重要,了解PCI-to-PCI桥是了解PCI架构的基础。CompactPCI总线规范多用于背板结构的大型系统,支持热插拔。
在PCI总线规范的基础上,SIG进一步提出了PCI-X规范。与PCI总线相比,PCI-X总线规范可以支持133MHz、266MHz和533MHz的总线频率,并且在传输规则上做了一些改变。虽然PCI-X总线在广泛使用之前已经被PCI Express总线所取代,但是PCI-X总线中提出的许多设计思想仍然被PCI Express总线所继承。
PCI总线规范是Intel对PC领域的一大贡献。Intel在PCI总线规范上也留下了很深的印记,PCI总线规范的很多内容都与基于IA (Intel Architecture)架构的x86处理器密切相关。但这并不妨碍其他处理器系统使用PCI总线。事实上,PCI总线在非x86处理器系统上已经取得了巨大的成功。目前,大多数处理器系统使用PCI/PCI Express总线来连接外部设备,尤其是一些通用外设。
随着时间的推移,PCI和PCI-X总线逐渐遇到瓶颈。和PCI-X总线使用单端并行信号进行数据传输。由于单端信号易受外部系统干扰,总线频率难以进一步提高。目前,为了获得更高的总线频率,提高总线带宽,高速串行总线逐渐取代并行总线。PCI Express总线已经逐渐取代PCI总线成为主流。但是从系统软件的角度来看,PCI Express总线还是基于PCI总线的。理解PCI Express总线的基础是对PCI总线的深刻理解。同时,PCI Express总线继承了PCI总线的许多概念。本文将详细介绍一些必要的与处理器架构相关的PCI总线知识。
为简单起见,本文主要介绍PCI总线的32位地址模式。实际上,很少有PCI设备使用64位地址模式。而且随着PCI Express总线逐渐取代PCI总线的大趋势,以后很难再有更多的64位地址的PCI设备了。如果读者需要掌握PCI总线的64位地址模式,请自行阅读PCI总线的相关规范。事实上,如果读者真正掌握了PCI总线的32位地址模式,就不难理解64位地址模式。
为了节省空间,在下文中,PCI Express总线被缩写为PCIe总线,PCI到PCI桥被缩写为PCI桥,PCI Express到PCI桥被缩写为PCIe桥,主机到PCI主机桥被缩写为主机主机桥。值得注意的是,很多书把主机桥称为PCI主机桥或PCI总线控制器。
PCI总线的基本知识
PCI总线作为处理器系统的局部总线,主要用于连接外部设备,而不是作为处理器的系统总线连接缓存和主存。然而,PCI总线、系统总线和处理器体系结构之间仍然有着密切的关系。
PCI总线作为系统总线的延伸,在设计时考虑了很多处理器相关的内容,比如处理器的缓存共享一致性和数据完整性,以及如何与处理器交换数据等。其中,缓存共享一致性和数据完整性是现代处理器局部总线设计的重点和难点,也是本书将重点讨论的话题之一。
单独研究PCI总线是不可取的,因为PCI总线只是处理器系统的一个组成部分。对PCI总线的深入理解需要一些关于处理器架构的知识。这方面的知识在本书中有所描述,但也被PCI总线规范所忽略。它如果没有实际的处理器系统,深入理解PCI总线规范是不容易也不可能的。
为了今天的读者,PCI总线提出的很多概念略显过时,也有很多不足。但在那个年代,PCI总线与ISA、EISA、MCA等其他并行局部总线相比,有很多突出的优点,是一种全新的设计。
(PCI总线空间与处理器空间相隔离
PCI设备有独立的地址空间,即PCI总线地址空间,通过主桥与内存地址空间隔离。处理器需要通过主桥来访问PCI设备,而PCI设备需要通过主桥来托管内存。主桥中有许多缓冲器,使处理器总线和PCI总线工作在各自的时钟频率,互不干扰。主桥的存在也方便了PCI设备和处理器共享主存资源。
当处理器访问PCI设备时,它必须通过主桥进行地址转换;当PCI设备访问主存储器时,它也需要通过主桥进行地址转换。主桥的一个重要作用是将处理器访问的存储器地址转换成PCI总线地址。PCI设备使用的地址空间属于PCI总线域,但不同于内存地址空间。
x86处理器对于PCI总线域和内存域的划分并不明确,这也使得很多程序员无法准确区分PCI总线域和内存域的地址空间。本书会反复强调内存地址和PCI总线地址的区别,因为这是理解PCI架构的重要内容。
PCI规范没有限制主桥的设计。每个处理器制造商使用的主机桥的设计是不同的。主桥是连接PCI总线和处理器的核心部件。掌握主桥的实现机制是深入理解PCI架构的前提。
这本书将采取飞思卡尔的PowerPC处理器和英特尔的x86处理器为例来说明各自的主桥实现。值得注意的是,本书涉及的PowerPC处理器只针对飞思卡尔的PowerPC处理器,但不包括IBM和AMCC 的Power和PowerPC处理器。另外,除非特别说明,本书中提到的x86处理器指的是Intel处理器,而不是其他厂商的x86处理器。
(2)可扩展性
PCI总线具有很强的扩展性。在PCI总线中,主桥可以直接发起一条PCI总线,这也是主桥管理的第一条PCI总线。这种总线还可以通过PCI桥扩展出一系列PCI总线,以主机桥为根节点,形成PCI总线树。所有这些PCI总线都可以连接到PCI设备,但是一个PCI总线树最多只能连接256个PCI设备(包括PCI桥)。
同一PCI总线上的设备可以直接通信,而不会影响其他PCI总线上的设备之间的数据通信。属于同一个PCI总线树的PCI设备也可以直接通信,但是需要通过PCI桥转发数据。
PCI桥是PCI总线的重要组件,该组件的存在使得PCI总线具有极强的可扩展性。PCI桥也是区别于其他局部总线的重要部件。在以主桥为根节点的PCI总线树中,每个PCI桥还可以连接一个PCI总线子树,PCI桥下的PCI总线仍然可以利用PCI桥进行扩展。
PCI桥可以管理这个PCI总线子树,PCI桥的配置空间包含一系列管理PCI总线子树的配置寄存器。在PCI桥的两端,连接了两条总线,即一级总线和二级总线。离处理器较近的总线称为上游总线,另一条称为下游总线。这两条总线之间的通信需要通过PCI桥进行。PCI桥中的很多概念都被PCIe总线采用,理解PCI桥也是理解PCIe架构的基础。
(3)动态配置机制
PCI设备使用的地址可以由系统软件根据需要动态分配。这样,PCI总线合理地解决了设备间的地址冲突,从而实现了即插即用功能。因此,PCI总线不需要使用ISA或EISA接口卡使用的硬件跳线来解决地址冲突。
每个PCI设备都有一个独立的配置空间,其中包含设备在PCI总线中使用的基址。系统软件可以动态配置这个基地址,从而确保每个PCI设备使用的物理地址不相同。PCI桥的配置空间包含其PCI子树可以使用的地址范围。
(4)总线带宽
与以前的局部总线相比,PCI总线大大增加了数据传输的带宽。32位/33MHz PCI总线的峰值带宽为132MB/s,64位/66MHz PCI总线的峰值带宽为532 MB/s,虽然PCI总线提供的峰值带宽与PCIe总线相差甚远,但与之前的本地总线ISA、EISA、MCA相比仍有很大优势。
ISA总线最高频率8MHz,位宽16,峰值带宽16mb/s;EISA总线最高频率8.33MHz,位宽32,峰值带宽33mb/s;MCA总线最高频率10MHz,最高位宽32,峰值带宽40mb/s,PCI总线提供的峰值带宽远高于这些总线。
(5)共享总线机制
PCI设备通过仲裁获得PCI总线的使用权后,就可以传输数据了。PCI总线上的数据传输不需要处理器的干预。
PCI总线仲裁器不在PCI总线规范定义的范围内,也不一定是主机桥和PCI桥的一部分。尽管大多数主机桥和PCI桥都包含PCI总线仲裁器,但在一些处理器系统的设计中也可以使用独立的PCI总线仲裁器。例如,PowerPC处理器的主机桥包含一个PCI总线仲裁器,但是用户可以关闭这个总线仲裁器,使用一个独立的PCI总线仲裁器。
PCI设备使用共享总线进行数据传输。在同一条总线上,所有的PCI设备共享相同的总线带宽,这将极大地影响PCI总线的利用率。这种机制明显不如PCIe总线采用的交换结构。但是在PCI总线盛行的年代,半导体的技术、设计能力和制造成本决定了共享总线是当时的最佳选择。
(6)中断机制
PCI总线上的设备可以通过四个中断请求信号INTA~D#向处理器提交中断请求。与ISA总线上的设备不同,PCI总线上的设备可以共享这些中断请求信号,不同的PCI设备可以电线和这些中断请求信号,然后将它们连接到中断控制器的中断请求引脚。PCI设备的配置空间记录了设备使用这四个中断请求信号的信息。
PCI总线进一步提出MSI(消息信号中断)机制,利用内存写总线事务传输中断请求,可以使用x86处理器FSB(前端总线)总线提供的中断消息总线事务,从而提高PCI设备的中断请求效率。
从现代总线技术来看,PCI总线仍然有许多缺点,但它可以不可否认,PCI总线已经取得了巨大的成功。不仅x86处理器使用PCI总线作为标准本地总线连接各种外部设备,PowerPC、MIPS和ARM [1]处理器也使用PCI总线作为标准本地总线。此外,基于PCI总线的外围设备,如以太网控制器、声卡、硬盘控制器等。也成为主流。
[1]在ARM处理器中,SoC平台总线,即AMBA总线,用于连接片上设备。然而,一些ARM制造商仍然使用AMBA到PCI桥来推出PCI总线来连接PCI设备。
PCI总线的组成结构
如上所述,PCI总线作为处理器系统的局部总线,是处理器系统不可分割的一部分。PCI总线can的组成结构不要离开处理器系统的大环境。
在一个处理器系统中,与PCI总线相关的模块包括主机桥、PCI总线、PCI桥和PCI设备。PCI总线由主机桥和PCI桥推出。主桥和主存控制器在同一级总线上,PCI设备可以方便地通过主桥访问主存,即进行DMA操作。
值得注意的是,PCI设备的DMA操作需要与处理器系统的缓存保持一致。当PCI设备通过主桥访问主存时,缓存一致性模块会监测地址,并根据监测结果改变缓存的状态。
在一些简单的处理器系统中,可能没有PCI桥。此时,所有的PCI设备都连接到由主机桥推送的PCI总线上。此外,一些处理器系统可能包含多个主桥,例如图11所示的处理器系统,其包含主桥X和主桥y
主机主桥
主桥是一种非常特殊的桥。其主要功能是将处理器系统的内存域与处理器系统的PCI总线域隔离开来,管理PCI总线域,完成处理器与PCI设备之间的数据交换。处理器和PCI设备之间的数据交换主要由两部分组成:处理器访问PCI设备的地址空间和PCI设备使用DMA机制访问主内存。
为了简单起见,处理器系统的存储器域将被称为存储器域,而处理器系统的PCI总线域将被称为PCI总线域。有关内存域和PCI总线域的详细信息,请参见第2.1节。值得注意的是,在一个处理器系统中,有几个主桥,所以有几个PCI总线域。
主桥在处理器系统中的位置是不同的。例如,PowerPC处理器将主桥和处理器集成在一个芯片上。然而,有些处理器不不要做这种整合。比如x86处理器采用南北桥结构,处理器核心在一个芯片里,主机主机桥在北桥。然而,从处理器架构的角度来看,这些集成方法并不重要。
PCI设备通过主桥访问主存时,需要和处理器的缓存保持一致。因此,在设计主桥时,应该考虑高速缓存的一致性。在主桥中,也有许多数据缓冲区来支持PCI总线的预读机制。
主机桥是处理器和PCI设备之间的桥梁。在处理器系统中,每个主桥管理一个PCI总线树,同一PCI总线树上的所有PCI设备属于同一个PCI总线域。如图11所示,主桥X下的PCI设备属于PCI总线X域,而主桥Y下的PCI设备属于PCI总线Y域。主桥通过配置读写总线周期性地访问该总线树上所有PCI设备的配置空间。
如果主桥支持PCI V3.0对等数据传输模式,那么属于不同PCI总线域的PCI设备就可以直接交换数据。如图11所示,如果主桥Y支持对等数据传输,则PCI设备y01可以直接访问PCI设备01或PCI设备11,而不涉及处理器。然而,这种跨总线域的数据传输方式在PC架构中并不常用。在PC架构中,重点考虑的是PCI设备和主存之间的数据交换,而不是PCI设备之间的数据交换。另外,在PC架构中,具有两个主桥的处理器系统并不多见。
在PowerPC处理器中,主桥可以设置入站寄存器,以便属于不同PCI总线域的设备可以直接通信。许多PowerPC处理器有多个主桥。有关PowerPC处理器使用的主机桥的详细信息,请参见第2.2节。
1.1.2 PCI总线
在处理器系统中,有两个概念:PCI总线和PCI总线树。这两个概念不一样。一个PCI总线树中可以有多条PCI总线,相关的PCI总线形成一个PCI总线树。在图11所示的处理器系统中,PCI总线X树具有两条PCI总线,即PCI总线x0和PCI总线x1。而在PCI总线的y树中只有一条PCI总线。
PCI总线由主机桥或PCI桥管理,用于连接各种设备,如声卡、网卡、IDE接口卡等。在处理器系统中,PCI总线可以通过PCI桥进行扩展,形成具有血缘关系的多级PCI总线,从而形成PCI总线的树形结构。处理器系统中有几个主桥,有几个这样的PCI总线树,每个PCI总线树对应一个PCI总线域。
直接连接到主桥的PCI总线通常被命名为PCI总线0。考虑到一个处理器系统中可能存在多个主桥,在图11中,主机主桥X推出的PCI总线称为x0总线,而PCI桥x1扩展的PCI总线称为x1总线。主机桥Y发起的PCI总线叫y0~yn。属于不同PCI总线树的设备所使用的PCI总线地址空间属于不同的PCI总线域空间。
PCI设备
PCI总线中有三种类型的设备:PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地从主桥或其他PCI设备接收读和写请求;PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动向其他PCI设备或主内存发起内存读写请求。桥接设备的主要功能是管理下游PCI总线,并在上游和下游总线之间转发总线事务。
PCI设备既可以是主设备,也可以是从设备,但同时,该PCI设备既可以是主设备,也可以是从设备。PCI总线规范将PCI主从设备称为PCI代理设备。处理器系统中的PCI网卡、显卡、声卡等常见设备都属于PCI代理设备。
在PCI总线中,主机桥是一种特殊的PCI设备,它可以获得PCI总线的控制权,以访问PCI设备或被PCI设备访问。但是主桥不是PCI设备。PCI规范也没有规定如何设计主桥。
在PCI总线中,有一种特殊的设备,即桥接设备。该设备包括PCI桥、PCI-to-(E)ISA桥和PCI-to-Cardbus桥。本文重点介绍PCI桥,不关心其他桥设备的实现原理。PCI桥的存在使得PCI总线具有极强的可扩展性,处理器系统可以利用PCI桥进一步扩展PCI总线。
PCI桥的出现使得使用PCI总线进行大规模系统互连成为可能。然而,在目前已经实现的大规模处理器系统中,PCI总线并不用于处理器系统之间的大规模互连。由于PCI总线是以主机桥为根的树形结构,采用主从式架构,很难实现多处理器系统之间的对等互连。
即便如此,PCI桥仍然是PCI总线规范的精髓,掌握PCI桥是深入理解PCI架构的基础。PCI桥可以连接两条PCI总线,上游PCI总线和下游PCI总线。这两条PCI总线属于同一个PCI总线域,PCI桥扩展的所有PCI总线都属于同一个PCI总线域。
对PCI设备配置空间的访问可以从上游总线转发到下游总线,数据传输可以双向进行。在PCI总线中,还有一个非透明的PCI桥。这个桥不是PCI总线规范定义的标准桥,但是它适用于一些特殊的应用。本文将在第2.5节详细介绍这种桥。在本书中,除非特别强调,PCI桥指的是透明桥,也是PCI总线规范定义的标准桥。
PCI-to-(E)ISA桥和PCI-to-Cardbus桥的主要功能是通过PCI总线扩展(E)ISA和Cardbus总线。PCI总线引入后,(E)ISA总线并没有立即在处理器系统中消失。这时候就需要用PCI-(E)ISA桥来扩展(E)ISA总线,而PCI-to-Cardbus桥是用来扩展Cardbus总线的。本文不关心(E)ISA和Cardbus的设计与实现。
主机处理器
PCI总线规定一个PCI总线树上同时只能有一个主机处理器。该主处理器可以通过主桥发起PCI总线配置请求总线事务,并配置PCI总线上的设备和桥。
主机处理器在PCI总线中是一个模糊的概念。在SMP(对称多处理)处理器系统中,所有的CPU都可以通过主机桥访问其下的PCI总线树,这些CPU都可以作为主机处理器。但值得注意的是,主桥是PCI总线树的实际管理者,而不是主机处理器。
在主机桥中,设置了许多寄存器,主机处理器通过操作这些寄存器来管理这些PCI设备。例如,在x86处理器的主桥中设置两个I/O端口0xCF8和0xCFC来访问PCI设备的配置空间,而在PowerPC处理器的主桥中设置CFG_ADDR和CFG_DATA寄存器来访问PCI设备的配置空间。值得注意的是,PowerPC处理器中没有I/O端口,所以采用内存镜像寻址方式访问外部设备的寄存器空间。
PCI总线的负载
PCI总线可以附加的负载与总线频率有关,总线频率越高,可以附加的负载越少。下面以PCI总线和PCI-X总线为例,说明总线频率、峰值带宽和负载能力之间的关系,如表11所示。
表PCI总线频率、带宽和负载之间的关系
类型总线频率峰值带宽负载能力
PCI33MHz133MB/s4-5插槽
66MHz266MB/s1-2-2插槽
PCI-X66MHz266MB/s4插槽
133MHz533MB/s2插槽
266MHz1066MB/s1插槽
533MHz2131MB/s1/S1插槽
如表11所示,PCI总线的频率越高,它能挂钩的负载越少,但它能提供的带宽越大。值得注意的是,PCI-X总线的传输协议与PCI总线略有不同,因此66MHz PCI-X总线的负载较大。有关PCI-X总线的详细描述,请参见第1.5节。当PCI-X总线频率为266MHz和533MHz时,总线上只能连接一个PCI-X插槽。在PCI总线中,一个插槽相当于两个负载,连接器和卡各算作一个负载。在表11中,33MHz PCI总线可以连接4~5个插槽,相当于直接连接8~10个负载。
japan quarterly 日本季刊









