目录
1.3.2 Posted 和 Non⁃Posted 传送方式
没有废话,全是干货
第Ⅰ篇 PCI体系结构概述
第一章 PCI总线的基本知识
本篇主要介绍PCI总线的 32 位地址模式,为节省篇幅,下文将PCI Express总线简称为 PCIe 总线,PCI⁃to⁃PCI 桥简称为PCI桥,PCI Express⁃to⁃PCI 桥简称为 PCIe 桥,Host⁃to⁃PCI主桥简称为HOST主桥。值得注意的是许多书籍将HOST主桥称为PCI主桥或者PCI总线控制器。
PCI总线作为处理器系统的局部总线,其主要目的是为了连接外部设备。PCI 总线作为系统总线的延伸,其设计考虑了许多与处理器相关的内容,如处理器的Cache共享一致性和数据完整性(Data Consistency,也称为 Memory Consistency),以及如何与处理器进行数据交换等一系列内容。其中 Cache 共享一致性和数据完整性是现代处理器局部总线的设计的重点和难点。
PCI总线特点:
(1)PCI 总线空间与处理器空间隔离
- PCI设备具有独立的地址空间,即PCI总线地址空间,该空间与存储器地址空间通过HOST主桥隔离。处理器需要通过HOST主桥才能访问PCI设备,而PCI设备需要通过HOST主桥才能访问主存储器。
- 在HOST主桥中含有许多缓冲,这些缓冲使得处理器总线与PCI总线工作在各自的时钟频率中,互不干扰。HOST主桥的存在也使得PCI设备和处理器可以方便地共享主存储器资源。
- 处理器访问PCI设备时,必须通过HOST主桥进行地址转换;而PCI设备访问主存储器时,也需要通过HOST主桥进行地址转换。HOST主桥的一个重要作用就是将处理器访问的存储器地址转换为PCI总线地址。PCI设备使用的地址空间是属于PCI总线域的这与存储器地址空间不同。
- x86处理器对PCI总线域与存储器域的划分并不明晰,这也使得许多程序员并没有准确地区分PCI总线域地址空间与存储器域地址空间。而本书将反复强调存储器地址和PCI总线地址的区别,因为这是理解PCI体系结构的重要内容。
- PCI规范并没有对HOST主桥的设计进行约束。每一个处理器厂商使用的HOST主桥,其设计都不尽相同。HOST主桥是联系PCI总线与处理器的核心部件,掌握HOST主桥的实现机制是深入理解PCI体系结构的前提。
思考:什么是PCI总线域地址空间?什么是存储器域地址空间?如何准确地区分PCI总线域地址空间与存储器域地址空间?
(2)可扩展性
- PCI总线具有很强的扩展性。在PCI总线中,HOST主桥可以直接推出一条PCI总线,这条总线也是该HOST主桥管理的第一条PCI总线,该总线还可以通过PCI桥扩展出一系列PCI总线,并以HOST主桥为根节点,形成1棵PCI总线树。这些PCI总线都可以连接 PCI设备,但是在 1 棵PCI总线树上,最多只能挂接 256 个PCI设备(包括PCI桥)。
- 在同一条PCI总线上的设备间可以直接通信,而并不会影响其他PCI总线上设备间的数据通信。隶属于同一棵PCI总线树上的PCI设备,也可以直接通信,但是需要通过PCI桥进行数据转发。
- PCI桥可以管理这个PCI总线子树,PCI桥的配置空间含有一系列管理 PCI总线子树的配置寄存器。在PCI桥的两端,分别连接了两条总线,分别是上游总线(Primary Bus)和下游总线( Secondary Bus)。其中与处理器距离较近的总线被称为上游总线,另一条被称为下游总线。这两条总线间的通信需要通过PCI桥进行。
(3)动态配置机制
- PCI设备使用的地址可以根据需要由系统软件动态分配。PCI总线使用这种方式合理地解决了设备间的地址冲突,从而实现了“即插即用”功能。
- 每一个PCI设备都有独立的配置空间,在配置空间中含有该设备在PCI总线中使用的基地址,系统软件可以动态配置这个基地址,从而保证每一个PCI设备使用的物理地址并不相同。PCI 桥的配置空间中含有其下PCI子树所能使用的地址范围。
(4)总线带宽
PCI总线与之前的局部总线相比,极大提高了数据传送带宽,32位/33 MHz 的PCI总线可以提供 132 MB/s的峰值带宽,而 64 位/ 66 MHz 的PCI总线可以提供的峰值带宽为 532 MB/s。
虽然PCI总线所能提供的峰值带宽远不能和 PCIe 总线相比,但是与之前的局部总线 ISA、 EISA和 MCA 总线相比,仍然具有极大的优势。
总线类型 | 最高主频 | 位宽 | 峰值带宽 |
PCI | 33MHz | 32位 | 132MB/s |
PCI | 66 | 64 | 532 |
ISA | 8 | 16 | 16 |
MCA | 33 | 32 | 33 |
MCA | 10 | 32 | 40 |
(5)共享总线机制
- PCI设备通过仲裁获得PCI总线的使用权后,才能进行数据传送,在PCI总线上进行数据传送,并不需要处理器进行干预。
- PCI设备使用共享总线方式进行数据传递,在同一条总线上,所有PCI设备共享同一总线带宽 这将极大地影响PCI总线的利用率。这种机制显然不如 PCIe 总线采用的交换结构,
(6)中断机制
- PCI总线上的设备可以通过四根中断请求信号 INTA ~ D# 向处理器提交中断请求。
- PCI总线上的设备可以共享这些中断请求信号,PCI设备的配置空间记录了该设备使用这四根中断请求信号的信息。
- PCI总线还进一步提出了 MSI(Message Signal Interrupt)机制,该机制使用存储器写总线事务传递中断请求,并可以使用 x86 处理器 FSB( Front Side Bus)总线提供的Interrupt Message 总线事务,从而提高了PCI设备的中断请求效率。
1.1 PCI总线的组成结构
PCI总线作为处理器系统的局部总线,是处理器系统的一个组成部件,讲述PCI总线的组成结构不能离开处理器系统这个大环境。在一个处理器系统中,与PCI总线相关的模块如图所示。
- 图中与PCI总线相关的模块包括:HOST主桥、PCI总线、PCI桥和PCI设备。
- DMA 操作: PCI总线由HOST主桥和PCI桥推出,HOST主桥与主存储器控制器在同一级总线上,因此PCI设备可以方便地通过HOST主桥访问主存储器 即进行 DMA 操作。
- 值得注意的是,PCI 设备的 DMA 操作需要与处理器系统的 Cache 进行一致性操作,当PCI设备通过HOST主桥访问主存储器时,Cache一致性模块将进行地址监听,并根据监听的结果改变 Cache 的状态。
- 在一些简单的处理器系统中,可能不含有PCI桥,此时所有PCI设备都是连接在HOST主桥推出的PCI总线上。此外在一些处理器系统中可能含有多个HOST主桥.
1.1.1HOST主桥
注:为简便起见,下面将处理器系统的存储器域简称为存储器域,而将处理器系统的PCI总线域称为PCI总线域,存储器域和PCI总线域的后续会有详细介绍。
HOST主桥是一个很特别的桥片,主要功能以及相关注意点如下:
主要功能:
- 隔离处理器系统的存储器域与处理器系统的PCI总线域,管理PCI总线域,并完成处理器与PCI设备间的数据交换。
处理器与PCI设备间的数据交换组成:
- 主要由“处理器访问PCI设备的地址空间”和“PCI设备使用 DMA 机制访问主存储器”这两部分组成。
PCI总线域数量:
- 在一个处理器系统中,有几个HOST主桥,就有几个PCI总线域。
HOST主桥在处理器系统中的位置:
- PowerPC 处理器将HOST主桥与处理器集成在一个芯片中。x86 处理器使用南北桥结构,处理器内核在一个芯片中,而HOST主桥在北桥中。
Cache一致性:
- PCI设备通过HOST主桥访问主存储器时,需要与处理器的 Cache 进行一致性操作,因此在设计HOST主桥时需要重点考虑Cache一致性操作。
预读机制:
- 在HOST主桥中,还含有许多数据缓冲,以支持PCI总线的预读机制。
HOST主桥是联系处理器与PCI设备的桥梁。在一个处理器系统中,每一个HOST主桥都管理了一棵PCI 总线树(如上图HOST主桥x之下的PCI设备属于PCI总线x域,而HOST主桥y之下的PCI设备属于PCI总线y域),在同一棵PCI总线树上的所有PCI设备属于同一个PCI总线域。在这棵总线树上的所有PCI设备的配置空间都由HOST主桥通过配置读写总线周期访问。
1.1.2 PCI总线
在处理器系统中,含有PCI总线和PCI总线树这两个概念。这两个概念并不相同,
- PCI总线由HOST主桥或者PCI桥管理,用来连接各类设备,如声卡、网卡和IDE接口卡等。
- 在一个处理器系统中,可以通过PCI桥扩展PCI总线,并形成具有血缘关系的多级PCI总线,从而形成PCI总线树型结构。
在一棵PCI总线树中可能具有多条 PCI总线,而具有血缘关系的PCI总线组成一棵PCI总线树。在处理器系统中有几个HOST主桥,就有几棵这样的PCI总线树,而每一棵PCI总线树都与一个PCI总线域对应。分属不同 PCI总线树的设备,其使用的PCI总线地址空间分属不同的PCI总线域空间。
与HOST主桥直接连接的PCI总线通常被命名为PCI总线0。PCI总线x树具有两条PCI总线,分别为PCI总线x0(HOST主桥x推出的PCI总线命名为x0总线)和PCI总线x1(将PCI桥x1扩展出的PCI总线称为x1总线)。而PCI总线y树中仅有一条PCI总线(将HOST主桥y推出的PCI总线称为y0~yn)。
1.1.3 PCI设备
在PCI总线中有三类设备:PCI主设备、PCI从设备和桥设备。
PCI从设备:只能被动地接收来自HOST主桥或者其他PCI设备的读写请求;
PCI主设备:可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。
桥设备:主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。包括PCI桥、 PCI⁃to⁃( E) ISA 桥和PCI⁃to⁃Cardbus桥。重点介绍PCI桥,PCI桥的存在使PCI总线极具扩展性,处理器系统可以使用PCI桥进一步扩展PCI总线
一个PCI设备可以既是主设备也是从设备,但是在同一个时刻,这个PCI设备要么是主设备要么是从设备。PCI总线规范将PCI主从设备统称为PCI Agent设备。在处理器系统中常见的PCI网卡、显卡、声卡等设备都属于PCI Agent 设备。
在PCI总线中,HOST主桥是一个特殊的PCI设备,该设备可以获取PCI总线的控制权访问PCI设备,也可以被PCI设备访问,但是HOST主桥并不是PCI设备。
PCI桥可以连接两条PCI总线,上游PCI总线和下游PCI总线,这两个PCI总线属于同一个PCI总线域,使用PCI桥扩展的所有PCI总线都同属于一个PCI总线域。其中对PCI设备配置空间的访问可以从上游总线转发到下游总线,而数据传送可以双方向进行。在PCI总线中,还存在一种非透明PCI桥,该桥片不是PCI总线规范定义的标准桥片,但是适用于某些特殊应用,后续会有详细介绍。
1.1.4 HOST处理器
PCI总线规定在同一时刻内,在一棵PCI总线树上有且只有一个HOST处理器。这个HOST处理器可以通过HOST主桥,发起PCI总线的配置请求总线事务,并对PCI总线上的设备和桥片进行配置。
在HOST主桥中,设置了许多寄存器,HOST处理器通过操作这些寄存器来管理PCI设备。如在x86处理器的HOST主桥中设置了 0xCF8 和 0xCFC 这两个I/O端口访问PCI设备的配置空间,而 PowerPC 处理器的HOST主桥设置了 CFG_ADDR 和 CFG_DATA 寄存器访问PCI 设备的配置空间。值得注意的是,在 PowerPC 处理器中并没有 I/O端口,因此使用存储器映像寻址方式访问外部设备的寄存器空间。
1.1.5 PCI总线的负载
PCI总线能挂接的负载与总线频率相关,总线频率越高,能挂接的负载越少,但是整条总线能提供的带宽越大。下面以PCI总线和 PCI⁃X 总线为例说明总线频率、 峰值带宽和负载能力之间的关系,(PCI⁃X 总线与PCI总线的传送协议略有不同,因此 66 MHz 的PCI⁃X 总线的负载数较大)
1.2 PCI总线的信号定义
PCI总线是一条共享总线,在一条 PCI总线上可以挂接多个PCI设备。这些PCI设备通过一系列信号与PCI总线相连,这些信号由地址/数据信号、控制信号、仲裁信号、中断信号等多种信号组成。
PCI总线是一个同步总线,每一个设备都具有一个CLK信号,其发送设备与接收设备使用这个CLK信号进行同步数据传递。PCI总线可以使用33 MHz或者66 MHz 的时钟频率,而PCI⁃X总线可以使用133 MHz、266 MHz或者533MHz的时钟频率。
除了RST#、INTA ~ D#、PME#和CLKRUN#等信号之外,PCI设备使用的绝大多数信号都使用这个 CLK 信号进行同步。其中RST#是复位信号,而PCI设备使用INTA ~ D#信号进行中断请求。不详细介绍 PME#和 CLKRUN#信号。
1.2.1 地址和数据信号
在PCI总线中,与地址和数据相关的信号如下所示。
(1)AD[31∶0]信号(PCI总线复用地址与数据信号)
- PCI总线事务在启动后的第一个时钟周期传送地址,这个地址是PCI总线域的存储器地址或者I/O 地址;而在下一个时钟周期传送数据。
- 传送地址的时钟周期也被称为地址周期,而传送数据的时钟周期也被称为数据周期。
- PCI 总线支持突发传送,即在一个地址周期之后,可以紧跟多个数据周期。
(2)PAR 信号(奇偶校验信号)
- PCI总线使用奇偶校验机制,保证地址和数据信号在进行数据传递时的正确性。
- PAR 信号是AD[31∶0]和C/BE[3∶ 0]的奇偶校验信号。
- PCI主设备在地址周期和数据周期中,使用该信号为地址和数据信号线提供奇偶校验位。
(3)C/BE[3∶0]#信号
PCI总线复用命令与字节选通引脚。
在地址周期中,C/BE[3∶0]#信号表示PCI总线的命令。而在数据周期中,C/BE [3∶0]#引脚输出字节选通信号,其中C/BE3#、C/BE2#、C/BE1#和C/BE0#与数据的字节3、2、1和0对应。使用这组信号可以对PCI设备进行单个字节、 字和双字访问。
PCI总线通过 C/BE[3∶0]#信号定义了多个总线事务,这些总线事务如表 1-2 所示。
1.2.2 接口控制信号
在PCI总线中,接口控制信号的主要作用是保证数据的正常传递,并根据PCI主从设备的状态,暂停、终止或者正常完成当前总线事务,其主要信号如下。
(1)FRAME#信号
- 该信号指示一个PCI总线事务的开始与结束。
- 当PCI设备获得总线的使用权后,将置该信号有效,即置为低,启动PCI总线事务;
- 当结束总线事务时,将置该信号无效,即置为高;
- PCI设备(包括HOST主桥)只有通过仲裁获得当前PCI总线的使用权后,才能驱动该信号。
(2)IRDY#信号
- 该信号由PCI主设备(包括HOST主桥) 驱动,该信号有效时表示PCI主设备的数据已经准备完毕;
- 如果当前PCI总线事务为写事务,表示数据已经在AD[31∶0]上有效;
- 如果为读事务,表示PCI目标设备已经准备好接收缓冲,目标设备可以将数据发送到 AD[31∶0]上。
(3)TRDY#信号
- 该信号由目标设备驱动,该信号有效时表示目标设备已经将数据准备完毕;
- 如果当前PCI总线事务为写事务,表示目标设备已经准备好接收缓冲,可以将AD[31∶0]上的数据写入目标设备;
- 如果为读事务,表示PCI设备需要的数据已经在AD[31∶0]上有效。
该信号可以和IRDY#信号联合使用,在PCI总线事务上插入等待周期,对PCI总线的数据传送进行控制。
(4)STOP#信号
- 该信号有效时表示目标设备请求主设备停止当前PCI总线事务。
- 一个PCI总线事务除了可以正常结束外,目标设备还可以使用该信号终止当前PCI总线事务。目标设备可以根据不同的情况,要求主设备对当前PCI总线事务进行重试(Retry)、断连(Disconnect),也可以向主设备报告目标设备夭折(Target Abort)
- 目标设备要求主设备Retry和Disconnect并不意味着当前PCI总线事务出现错误。当目标设备没有将数据准备好时,可以使用Retry周期使主设备重试当前PCI总线事务。有时目标设备不能接收来自主设备较长的Burst操作时,可以使用 Disconnect 周期,将一个较长的Burst 操作分解为多个 Burst 操作。当主设备访问的地址越界时,目标设备可以使用 Disconnect 周期,终止主设备的越界访问。
- 而Target Abort表示在数据传送中出现错误。处理器系统必须对这种情况进行处理。在PCI总线中,出现Abort一般意味着当前PCI总线域出现了较为严重的错误。
(5)IDSEL 信号
- PCI总线在进行配置读写总线事务时,使用该信号选择PCI目标设备。
- 配置读写总线事务与存储器读写总线事务在实现上略有不同。在PCI总线中,存储器读写总线事务使用地址译码方式访问外部设备。而配置读写总线事务使用“ID译码方式”访问PCI设备,即通过PCI设备的总线号、设备号和寄存器号访问PCI设备的配置空间。
IDSEL信号与PCI设备的设备号相关,相当于PCI设备配置空间的片选信号,这部分内容后续详细介绍。
(6)DEVSEL#信号
该信号有效时表示PCI总线的目标设备准备好.
DEVSEL#信号与TRDY#信号区别?
- DEVSEL#信号有效仅表示目标设备已经完成了地址译码。目标设备使用该信号通知PCI主设备,其访问对象在当前PCI总线上,但是并不表示目标设备可以与主设备进行数据交换。
- 而TRDY#信号表示数据有效,PCI主设备可以向目标设备写入或者从目标设备读取数据。
(7) LOCK#信号
- PCI主设备可以使用该信号,将目标设备的某个存储器或者 I/O 资源锁定,以禁止其他PCI主设备访问此资源,直到锁定这个资源的主设备将其释放。
- PCI总线使用 LOCK#信号实现 LOCK 总线事务,只有HOST主桥、PCI桥或者其他桥片可以使用 LOCK#信号。
- LOCK 总线事务将严重影响PCI总线的传送效率,在实际应用中,设计者应当尽量避免使用该总线事务。
1.2.3 仲裁信号
PCI 设备使用该组信号进行总线仲裁,并获得PCI总线的使用权。
只有PCI主设备需要使用该组信号,而PCI从设备可以不使用总线仲裁信号。这组信号由REQ#和GNT#组成。其中PCI主设备的REQ#和GNT#信号与PCI总线的仲裁器直接相连。PCI主设备的总线仲裁信号与PCI总线仲裁器的连接关系如图 1-2 所示。
- 值得注意的是,每一个PCI主设备都具有独立的总线仲裁信号,并与PCI总线仲裁器一一相连。
- 而总线仲裁器需要保证在同一个时间段内,只有一个PCI设备可以使用当前总线。
- 在一个处理器系统中,一条PCI总线可以挂接PCI主设备的数目,除了与负载能力相关之外,还与PCI总线仲裁器能够提供的仲裁信号数目直接相关。
在一棵PCI总线树中,每一条PCI总线上都有一个总线仲裁器。一个处理器系统可以使用PCI桥扩展出一条新的PCI总线,这条新的PCI总线也需要一个总线仲裁器,通常在 PCI桥中集成了这个总线仲裁器。多数HOST主桥也集成了一个PCI总线仲裁器,但是PCI总线也可以使用独立的PCI总线仲裁器。
数据传递通信方式:
PCI 主设备使用PCI总线进行数据传递时,需要首先置 REQ#信号有效,向PCI总线仲裁器发出总线申请,当PCI总线仲裁器允许PCI主设备获得PCI总线的使用权后,将置 GNT#信号为有效,并将其发送给指定的PCI主设备。而PCI主设备在获得总线使用权之后,将可以置FRAME#信号有效,与PCI从设备进行数据通信。
1.2.4 中断请求等其他信号
INTA#、 INTB#、 INTC#和 INTD#
PCI总线提供了INTA#、 INTB#、 INTC#和 INTD#四个中断请求信号,PCI设备借助这些中断请求信号,使用电平触发方式向处理器提交中断请求。
中断请求流程:
- 当这些中断请求信号为低时,PCI设备将向处理器提交中断请求;
- 当处理器执行中断服务程序清除PCI设备的中断请求后,PCI设备将该信号置高,结束当前中断请求。
(INTx#这组信号为开漏输出,当所有的驱动源不驱动该信号时,该信号由上拉电阻驱动为高。)
PCI总线规定单功能设备只能使用 INTA#信号,而多功能设备才能使用 INTB# / C# / D#信号。
PCI设备的这些中断请求信号可以通过某种规则进行线与,之后与中断控制器的中断请求信号线相连。而处理器系统需要预先知道这个规则,以便正确处理来自不同PCI设备的中断请求,这个规则也被称为中断路由表,后续详细介绍中断路由表。
PERR#和SERR#信号
PCI 总线在进行数据传递过程时,难免会出现各种各样的错误,因此PCI总线提供了一些错误信号,如PERR#和SERR#信号。
- 当 PERR#信号有效时,表示数据传送过程中出现奇偶校验错( Special Cycle 周期除外);
- 当 SERR#信号有效时,表示当前处理器系统出现了三种错误可能,分别为地址奇偶校验错、在 Special Cycle 周期中出现数据奇偶校验错、系统出现其他严重错误。
1.3 PCI总线的存储器读写总线事务
总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备。在处理器系统中,这些数据传送都要依赖一定的规则,PCI总线并不例外。
PCI总线使用单端并行数据线,采用地址译码方式进行数据传递,而采用 ID 译码方式进行配置信息的传递。地址译码方式使用地址信号,ID译码方式使用PCI设备的ID号,包括 Bus Number、 Device Number、Function Number 和 Register Number。
重点介绍存储器读写总线事务与 I/O读写总线事务。PCI设备只有在系统软件初始化配置空间之后,才能够被其他主设备访问。当PCI设备的配置空间被初始化之后,该设备在当前的PCI总线树上将拥有一个独立的PCI 总线地址空间,即BAR( Base Address Register) 寄存器所描述的空间。处理器与PCI设备进行数据交换,PCI设备与主存储器进行 DMA 操作时,使用的都是PCI总线域的地址。
思考?
- 如何配置读写总线事务?
- BAR寄存器是什么?
- HOST主桥和PCI桥的详细实现机制?
在下文中,假定所使用的PCI设备的配置空间已经被系统软件初始化。
PCI 总线支持以下几类存储器读写总线事务:
(1)HOST处理器对PCI设备的BAR空间进行数据读写,BAR 空间可以使用存储器或者 I/O 译码方式。HOST处理器使用PCI总线的存储器读写总线事务和 I/O 读写总线事务访问PCI设备的BAR空间。
(2)PCI设备对主存储器进行读写,即DMA读写操作。DMA读写操作在所有处理器系统中都较为常用,也是 PCI总线数据传送的重点。在多数情况下,DMA 读写操作结束后将伴随着中断的产生.PCI 设备可以使用 INTA#、 INTB#、 INTC#和 INTD#信号提交中断请求,也可以使用 MSI 机制提交中断请求。
1.3.1 PCI总线事务的时序
一个完整的PCI总线事务远比上述过程复杂得多,因为PCI总线还支持许多传送方式,如双地址周期、 fast back⁃to⁃back (快速背靠背)、插入等待状态、重试和断连、总线上的错误处理等一系列总线事务。不一一介绍这些传送方式。
1.3.2 Posted 和 Non⁃Posted 传送方式
PCI 总线规定了两类数据传送方式,分别是 Posted 和 Non⁃Posted 数据传送方式。
使用Posted数据传送方式的总线事务也被称为Posted总线事务;使用 Non⁃Posted 数据传送方式的总线事务也被称为 Non⁃Posted 总线事务。
posted总线事务?
- Posted 总线事务指PCI主设备向PCI目标设备进行数据传递时,当数据到达PCI桥后,即由PCI桥接管来自上游总线的总线事务,并将其转发到下游总线。采用这种数据传送方式,在数据还没有到达最终的目的地之前,PCI总线就可以结束当前总线事务,从而在一定程度上解决了PCI总线的拥塞问题。
Non-Posted总线事务?
- Non⁃Posted 总线事务是指PCI主设备向PCI目标设备进行数据传递时,数据必须到达最终目的地之后,才能结束当前总线事务的一种数据传递方式。
Non-Posted总线事务优化方式?
- 采用 Non⁃Posted 传送方式等待将严重阻塞当前PCI总线上的其他数据传送,PCI 总线使用 Delayed 总线事务处理Non⁃Posted 数据请求,可以相对缓解PCI总线的拥塞,后续将详细介绍Delayed 总线事务。
PCI总线规定只有存储器写请求(包括存储器写并无效请求)可以采用 Posted 总线事务,下文将 Posted 存储器写请求简称为 PMW( Posted Memory Write),而存储器读请求、I/O读写请求、配置读写请求只能采用Non⁃Posted 总线事务。
1.3.3 HOST处理器访问PCI设备
HOST处理器对PCI设备的数据访问主要包含两方面内容,一方面是处理器向PCI设备发起存储器和 I/O 读写请求; 另一方面是处理器对PCI设备进行配置读写。
在PCI设备的配置空间中,共有6个BAR寄存器。每一个BAR寄存器都与PCI设备使用的一组PCI总线地址空间对应,BAR寄存器记录这组地址空间的基地址。本书将与 BAR寄存器对应的PCI总线地址空间称为BAR空间,在BAR空间中可以存放 I/O 地址空间,也可以存放存储器地址空间。后续详细介绍BAR寄存器。
HOST处理器访问PCI设备I/O地址空间的过程在不同的CPU处理器上有差异,具体如下。
具有独立的I/O地址空间,如x86处理器,访问流程如下:
- 将PCI设备使用的I/O地址映射到存储器域的I/O地址空间中;
- 之后处理器可以使用 IN、 OUT 等指令对存储器域的I/O地址进行访问;
- 然后通过HOST主桥将存储器域的I/O地址转换为PCI总线域的I/O地址;
- 最后使用PCI总线的I/O总线事务对PCI设备的I/O地址进行读写访问。
- 在x86处理器中,存储器域的I/O地址与PCI总线域的I/O地址相同。
对于有些没有独立I/O地址空间的处理器,如 PowerPC 处理器,
- 需要在HOST主桥初始化时,将PCI设备使用的I/O地址空间映射为处理器的存储器地址空间;
- PowerPC 处理器对这段“存储器域”的存储器空间进行读写访问时,HOST主桥将存储器域的这段存储器地址转换为PCI总线域的I/O地址;
- 然后通过PCI总线的I/O总线事务对PCI设备的I/O地址进行读写操作。
在PCI总线中,访问存储器读写事务流程如下:
- 首先HOST处理器在初始化时,需要将PCI设备使用的BAR空间映射到“存储器域”的存储器地址空间;
- 之后处理器通过存储器读写指令访问“存储器域”的存储器地址空间,
- HOST主桥将“存储器域”的读写请求翻译为PCI总线的存储器读写总线事务之后,再发送给目标设备。
需注意存储器域和PCI总线域的概念。PCI设备能够直接使用的地址是PCI总线域的地址,在PCI总线事务中出现的地址也是PCI总线域的地址;而处理器能够直接使用的地址是存储器域的地址。理解存储器域与PCI总线域的区别对于理解PCI总线至关重要,后续将专门讨论这两个概念。
以上对PCI总线的存储器与I/O总线事务的介绍并没有考虑PCI桥的存在,如果将 PCI桥考虑进来,情况将略微复杂。下面将以图 1-1 为例说明处理器如何通过HOST主桥和PCI桥1对PCI设备进行存储器读写操作。当处理器对PCI设备11进行存储器写操作时,这些数据需要通过HOST主桥x和PCI桥x1,最终到达PCI设备11,其访问步骤如下。
Posted 方式:
- (1)首先处理器将要传递的数据放入通用寄存器中,之后向PCI设备11映射到的存储器域的地址进行写操作。处理器必须通过HOST主桥将存储器域的数据访问转换为PCI总线事务才能对PCI总线地址空间进行访问。
- (2)HOST主桥x接收来自处理器的存储器写请求,之后处理器结束当前存储器写操作,释放系统总线。HOST主桥x 将存储器域的存储器地址转换为PCI总线域的PCI总线地址。并向 PCI总线x0发起PCI写请求总线事务。
- (3)PCI总线x0上的PCI设备01、PCI设备02和PCI桥1将同时监听这个PCI写总线事务。最后PCI桥x1接收这个写总线事务,并结束来自PCI总线x0的PCI总线事务。之后PCI桥x1向PCI总线x1发起新的PCI总线写总线事务
- (4)PCI总线x1上的PCI设备11和PCI设备12同时监听这个PCI写总线事务。最后PCI设备11通过地址译码方式接收这个写总线事务,并结束来自PCI总线x1上的PCI总线事务。
(以上第一次阅读时,如不理解,请多读几次。核心就是层层监听接收读写,操作完成后释放当前总线资源)
Non⁃Posted 方式。
- (1)首先处理器准备接收数据使用的通用寄存器,之后向PCI设备11映射到的存储器域的地址进行读操作。
- (2)HOST主桥x接收来自处理器的存储器读请求。HOST主桥x进行存储器地址到PCI总线地址的转换,之后向PCI总线x0发起存储器读总线事务。
- (3)PCI总线x0上的PCI设备01、PCI设备02和PCI桥x1将监听这个存储器读请求,之后PCI桥1接收这个存储器读请求。然后PCI桥x1向PCI总线x1发起新的PCI总线读请求。
- (4)PCI 总线x1上的PCI设备11和PCI设备12监听这个PCI读请求总线事务。最后PCI设备11接收这个存储器读请求总线事务,并将这个读请求总线事务转换为存储器读完成总线事务之后,将数据传送到PCI桥 x1 ,并结束来自PCI总线 x1 上的PCI总线事务。
- (5)PCI桥 x1 将接收到的数据通过PCI总线 x0,继续上传到 HOST 主桥 x,并结束 PCI总线 x0 上的PCI总线事务。(与posted方式的差异)
- (6)HOST 主桥 x 将数据传递给处理器,最终结束处理器的存储器读操作。(与posted方式的差异)
显然这种方式与 Posted 传送方式相比,PCI总线的利用率较低。因为只要 HOST 处理器没有收到来自目标设备的 “回应”,那么 HOST 处理器到目标设备的传送路径上使用的所有PCI 总线都将被阻塞。因而PCI总线 x0 和 x1 并没有被充分利用。
总结
本篇我们学到了PCI总线的组成结构,PCI总线的信号定义以及PCI总线的存储器读写总线事务,HOST处理器访问PCI设备的流程我们了解到了,那么相反PCI设备访问HOST处理器的流程呢?欲知后事如何,且听下回分解!
附:通过本专栏,将学习到 PCI 及 PCI Express 总线相关的最为基础的内容,一些必要的、 与 PCI 总线相关的处理器体系结构知识,深入理解处理器体系结构是理解 PCI 与 PCI Express 总线的重要基础。