一、简介
在处理器体系结构中,PCI 总线属于局部总线(Local Bus)。主要功能是为了连接外部设备。PCI 总线推出之后,迅速统一了当时并存的各类局部总线。EISA、VESA 等其他32位总线很快就被PCI 总线淘汰了。从那时起,PCI 总线一直在处理器体系结构中占有重要地位。
目前 PCI Express 总线逐步取代了 PCI 总线成为 PC 局部总线的主流,从软件层面上看,PCI Express 总线与 PCI 总线基本兼容;从硬件层面上看,PCI Express 总线在很大程度上继承了 PCI 总线的设计思路。
PCISIG 还推出了一系列和 PCI 总线直接相关的规范。如 PCI-to-PCI桥规范、PCI 电源管理规范、PCI 热插拔规范和 CompactPCI 总线规范。其中 PCI-to-PCI 桥规范最为重要,理解 PCI-to-PCI 桥是理解 PCI 体系结构的基础。
PCISIG 在 PCI 总线规范的基础上,进一步提出 PCI-X 规范。与 PCI 总线相比,PCI-X总线规范可以支持133MHz、266MHz 和533MHz 的总线频率,并在传送规则上做了一些改动。
随着时间的推移,PCI 和 PCI-X 总线逐步遇到瓶颈。PCI 和 PCI-X 总线使用单端并行信号进行数据传递,由于单端信号容易被外部系统干扰,其总线频率很难进一步提高。目前,为了获得更高的总线频率以提高总线带宽,高速串行总线逐步替代了并行总线。PCI Express总线也逐渐替代 PCI 总线成为主流。但是从系统软件的角度上看,PCI Express 总线仍然基于 PCI 总线。理解 PCI Express 总线的一个基础是深入理解 PCI 总线,同时 PCI Express总线也继承了 PCI 总线的许多概念。
二、PCI基本概念
1、PCI总线特点
PCI 总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接 Cache 和主存储器。但是 PCI 总线、系统总线和处理器体系结构之间依然存在着紧密的联系。
对于当前来说,PCI 总线提出的许多概念略显过时,也有许多不足之处。但是在当年,PCI 总线与之前的存在其他并行局部总线如 ISA、EISA 和 MCA 总线相比,具有许多突出的优点,是一个全新的设计。
(1)PCI 总线空间与处理器空间隔离
PCI 设备具有独立的地址空间,即 PCI 总线地址空间,该空间与存储器地址空间通过 HOST主桥隔离。处理器需要通过 HOST 主桥才能访问 PCI 设备,而 PCI 设备需要通过 HOST 主桥才能主存储器。
HOST 主桥的存在也使得 PCI 设备和处理器可以方便地共享主存储器资源。处理器访问 PCI 设备时,必须通过 HOST 主桥进行地址转换;而 PCI 设备访问主存储器时,也需要通过 HOST 主桥进行地址转换。HOST 主桥的一个重要作用就是将处理器访问的存储器地址转换为 PCI 总线地址。PCI 设备使用的地址空间是属于 PCI 总线域的,而与存储器地址空间不同。
(2)可扩展性
PCI 桥是 PCI 总线的一个重要组成部件,该部件的存在使得 PCI 总线极具扩展性。
(3)动态配置机制
每一个 PCI 设备都有独立的配置空间,在配置空间中含有该设备在 PCI 总线中使用的基地址,系统软件可以动态配置这个基地址,从而保证每一个 PCI 设备使用的物理地址并不相同。PCI 桥的配置空间中含有其下 PCI 子树所能使用的地址范围。
(4)总线带宽
PCI 总线与之前的局部总线相比,极大提高了数据传送带宽,32位/33MHz 的 PCI 总线可以提供132MB/s 的峰值带宽,而64位/66MHz 的 PCI 总线可以提供的峰值带宽为532MB/s。
(5)共享总线机制
PCI 设备通过仲裁获得 PCI 总线的使用权后,才能进行数据传送,在 PCI 总线上进行数据传送,并不需要处理器进行干预。
(6)中断
PCI 总线上的设备可以通过四根中断请求信号 INTA~D#向处理器提交中断请求。进一步,PCI提出了 MSI(Message Signal Interrupt)机制,该机制使用存储器写总线事务传递中断请求,从而提高了 PCI 设备的中断请求效率。
(7)PCI总线结构
在一个处理器系统中,与 PCI 总线相关的模块包括,HOST 主桥、PCI 总线、PCI 桥和 PCI 设备。PCI 总线由 HOST 主桥和 PCI 桥推出,HOST 主桥与主存储器控制器在同一级总线上,PCI 设备可以方便地通过 HOST 主桥访问主存储器,即进行 DMA 操作。
2.1 HOST主桥
HOST 主桥主要功能是隔离处理器系统的存储器域与处理器系统的 PCI 总线域,管理 PCI 总线域,并完成处理器与 PCI 设备间的数据交换。处理器与 PCI设备间的数据交换主要由“处理器访问 PCI 设备的地址空间”和“PCI 设备使用 DMA 机制访问主存储器”这两部分组成。
在一个处理器系统中,有几个 HOST 主桥,就有几个 PCI 总线域。HOST主要的实现也与具体架构相关。
2.2 PCI总线
PCI 总线由 HOST 主桥或者 PCI 桥管理,用来连接各类设备,如声卡、网卡和 IDE 接口卡等。在一个处理器系统中,可以通过 PCI 桥扩展 PCI 总线,并形成具有血缘关系的多级PCI 总线,从而形成 PCI 总线树型结构。在处理器系统中有几个 HOST 主桥,就有几颗这样的 PCI 总线树,而每一颗 PCI 总线树都与一个 PCI 总线域对应。
2.3 PCI设备
在 PCI 总线中有三类设备,PCI 主设备、PCI 从设备和桥设备。其中 PCI 从设备只能被动地接收来自 HOST 主桥,或者其他 PCI 设备的读写请求;而 PCI 主设备可以通过总线仲裁获得 PCI 总线的使用权,主动地向其他 PCI 设备或者主存储器发起存储器读写请求。而桥设备的主要作用是管理下游的 PCI 总线,并转发上下游总线之间的总线事务。
2.4 HOST处理器
PCI 总线规定在同一时刻内,在一颗 PCI 总线树上有且只有一个 HOST 处理器。这个 HOST处理器可以通过 HOST 主桥,发起 PCI 总线的配置请求总线事务,并对 PCI 总线上的设备和桥片进行配置。
在 PCI 总线中,HOST 处理器是一个较为模糊的概念。在 SMP(symmetric multiprocessing)处理器系统中,所有 CPU 都可以通过 HOST 主桥访问其下的 PCI 总线树,这些 CPU 都可以作为 HOST 处理器。但是值得注意的是,HOST 主桥才是 PCI 总线树的实际管理者,而不是 HOST处理器。
而配置访问事务在各个架构不尽相同,X86通过HOST 主桥中设置了0xCF8和0xCFC 这两个 I/O 端口访问 PCI 设备的配置空间,MIPS由于地址是统一编址,各PCI设备被映射到固件地址,通过BFC偏移来方式各设备配置空间。
2.5 PCI总线负载
PCI 总线的所能挂接的负载与总线频率相关,其中总线频率越高,所能挂接的负载越少。
三、PCI总线的存储器读写事务
总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备。PCI 总线使用单端并行数据线,采用地址译码方式进行数据传递,而采用 ID 译码方式进行配置信息的传递。其中地址译码方式使用地址信号,而 ID 译码方式使用 PCI 设备的 ID号,包括 Bus Number、Device Number、Function Number 和 Register Number。
PCI 设备只有在系统软件初始化配置空间之后,才能够被其他主设备访问。PCI 总线支持以下几类存储器读写总线事务。
(1)HOST 处理器对 PCI 设备的 BAR 空间进行数据读写,BAR 空间可以使用存储器或者 I/O 译码方式。HOST 处理器使用 PCI 总线的存储器读写总线事务和 I/O 读写总线事务访问 PCI 设备的 BAR 空间。
(2)PCI 设备之间的数据传递。在 PCI 总线上的两个设备可以直接通信,如一个 PCI设备可以访问另外一个设备的 BAR 空间。不过这种数据传递在 PC 处理器系统中,较少使用。
(3)PCI 设备对主存储器进行读写,即 DMA 读写操作。DMA 读写操作结束后将伴随着中断的产生。PCI 设备可以使用 INTA#、INTB#、INTC#和 INTD#信号提交中断请求,也可以使用 MSI 机制提交中断请求。
3.1 Posted 和 Non-Posted 传送方式
PCI 总线规定了两类数据传送方式,分别是 Posted 和 Non-Posted 数据传送方式。
Posted: PCI 主设备向 PCI 目标设备进行数据传递时,当数据到达 PCI桥后,即由 PCI 桥接管来自上游总线的总线事务,并将其转发到下游总线。在数据还没有到达最终的目的地之前,PCI 总线就可以结束当前总线事务,
Non-Posted:PCI 主设备向 PCI 目标设备进行数据传递时,数据必须到达最终目的地之后,才能结束当前总线事务的一种数据传递方式。
Non-Posted将严重阻塞当前 PCI 总线上的其他数据传送,因此PCI 总线使用 Delayed 总线事务处理 Non-Posted 数据请求,而pci-x进一步使用Split 总线事务进行数据传送(Split 总线事务的基本思想是发送端首先将 Non-Posted 总线请求发送给接收端,然后再由接收端主动地将数据传递给发送端)。
3.2 HOST 处理器访问 PCI 设备
HOST 处理器对 PCI 设备的数据访问主要包含两方面内容,一方面是处理器向 PCI 设备发起存储器和 I/O 读写请求;另一方面是处理器对 PCI 设备进行配置读写。
在 PCI 总线中,存储器读写事务与 I/O 读写事务的实现较为类似。首先 HOST 处理器在初始化时,需要将 PCI 设备使用的 BAR 空间映射到“存储器域”的存储器地址空间。之后处理器通过存储器读写指令访问“存储器域”的存储器地址空间,HOST 主桥将“存储器域”的读写请求翻译为 PCI 总线的存储器读写总线事务之后,再发送给目标设备。
3.3 PCI设备读写主存储器
PCI 设备与存储器直接进行数据交换的过程也被称为 DMA。与其他总线的 DMA 过程类似,PCI 设备进行 DMA 操作时,需要获得数据传送的目的地址和传送大小。支持 DMA 传递的 PCI设备可以在其 BAR 空间中设置两个寄存器,分别保存这个目标地址和传送大小。这两个寄存器也是 PCI 设备 DMA 控制器的组成部件。
值得注意的是,PCI 设备进行 DMA 操作时,使用的目的地址是 PCI 总线域的物理地址,而不是存储器域的物理地址,因为 PCI 设备并不能识别存储器域的物理地址,而仅能识别
PCI 总线域的物理地址。HOST 主桥负责完成 PCI 总线地址到存储器域地址的转换。HOST 主桥需要进行合理设置,将存储器的地址空间映射到 PCI 总线之后,PCI 设备才能对这段存储器空间进行 DMA 操作。PCI 设备不能直接访问没有经过主桥映射的存储器空间。
四、PCI总线的中断机制
PCI 总线使用 INTA#、INTB#、INTC#和 INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并与处理器的中断控制器连接。在 PCI 体系结构中,这些中断信号属于边带信号(Sideband Signals),PCI 设备还可以使用 MSI 机制向处理器提交中断请求,而不使用这组中断信号。
4.1 中断信号与 PCI 总线的连接关系
(1)由 BIOS 或者 APCI 表记录 PCI 总线的 INTA~D#信号与中断控制器之间的映射关系,保存这个映射关系的数据结构也被称为中断路由表。
(2)BIOS 初始化代码根据中断路由表中的信息,可以将 PCI 设备使用的中断向量号写入到该 PCI 设备配置空间的 Interrupt Line register 寄存器中。
4.2 中断请求的同步
(1)普通中断
在书写中断服务例程时,往往都是先读取 PCI 设备的中断状态寄存器,判断中断产生原因之后,才对 PCI 设备写入的数据进行操作。这个读取中断状态寄存器的过程,一方面可以获得设备的中断状态,另一方面是保证 DMA 写的数据最终到达存储器。
(2)MSI中断
PCI 总线 V2.2规范还定义了一种新的中断机制,即 MSI 中断机制。MSI 中断机制采用存储器写总线事务向处理器系统提交中断请求,其实现机制是向 HOST 处理器指定的一个存储器地址写指定的数据。这个存储器地址一般是中断控制器规定的某段存储器地址范围,而且数据也是事先安排好的数据,通常含有中断向量号。
HOST 主桥会将 MSI 这个特殊的存储器写总线事务进一步翻译为中断请求,提交给处理器。目前 PCIe 和 PCI-X 设备必须支持 MSI 中断机制,但是 PCI 设备并不一定都支持 MSI 中断机制。
但是使用 MSI 中断机制可以取消 PCI 总线这个 INTx#边带信号,可以解决使用 INTx 中断机制所带来的数据完整性问题。而更为重要的是,PCI 设备使用 MSI 中断机制,向处理器系统提交中断请求的同时,还可以通知处理器系统产生该中断的原因,即通过不同中断向量号表示中断请求的来源。当处理器系统执行中断服务例程时,不需要读取 PCI 设备的中断状态寄存器,获得中断请求的来源,从而在一定程度上提高了中断处理的效率。