没有合适的资源?快使用搜索试试~ 我知道了~
首页PCIe体系结构入门指南:从PCI到PCIe的发展与应用
PCIe体系结构入门指南:从PCI到PCIe的发展与应用
1星 需积分: 48 100 下载量 111 浏览量
更新于2024-07-15
1
收藏 7.75MB PDF 举报
PCIExpress(PCIe)体系结构是一个复杂的主题,它的发展与个人计算机(PC)的进步密切相关。最初,PCI标准作为局部总线在PC架构中扮演关键角色,它的出现是为了满足处理器速度提升带来的高速数据传输需求。PCI标准在1990年代初期引入,通过标准化并快速获得半导体厂商的广泛支持,它成功统一了当时竞争激烈的局部总线市场,如EISA和VESA,从而巩固了其在PC系统中的核心地位。 早期的PCI总线版本包括1.0规范,主要关注单个印刷电路板(PCB)内设备间的连接。然而,随着技术的发展,PCIe总线在20世纪90年代末期开始崭露头角。V2.0规范的发布增加了对PCI插槽的支持,这使得外部设备的接入更加便捷。紧接着,PCIe V2.1规范的出台具有重大意义,它不仅提升了性能,还奠定了PCIe在后续版本中持续演进的基础。 尽管PCIe总线已经成为当前PC局部总线的主要选择,但PCI总线因其灵活性和兼容性仍然在许多场景下被广泛应用,特别是在一些老系统和特定应用中。软硬件工程师在设计处理器系统时,无论是PCI还是PCIe,都需要对其理解深入,因为它们都对系统性能和兼容性有着直接影响。 PCIExpress体系结构是现代计算机架构中的基石,理解它的历史演变、规范变迁以及与传统PCI总线的关系,对于从事该领域工作的专业人士来说至关重要。学习者可以通过《PCIExpress体系结构导读》这样的教材,结合实践,逐步掌握这一复杂而富有挑战性的技术。
资源详情
资源推荐
(5) HOST 主桥 x 将数据经由 PCI 桥 x1 传递到 PCI 设备 11,PCI 设备 11 接收到这个数据后
结束 DMA 读。
以上过程仅是 PCI 设备向存储器读写数据的一个简单流程。如果考虑处理器中的 Cache,这些
存储器读写过程较为复杂。
PCI 总线还允许 PCI 设备之间进行数据传递,PCI 设备间的数据交换较为简单。在实际应用中,
PCI 设备间的数据交换并不常见。下文以图 1-1 为例,简要介绍 PCI 设备 11 将数据写入 PCI 设
备 01 的过程;请读者自行考虑 PCI 设备 11 从 PCI 设备 01 读取数据的过程。
(1) 首先 PCI 设备 11 将 PCI 写总线事务发向 PCI 总线 x1 上。PCI 桥 x1 和 PCI 设备 12 同时
监听这个写总线事务。
(2) PCI 桥 x1 将接收这个 PCI 写请求总线事务,并将这个 PCI 写总线事务上推到 PCI 总线 x0。
(3) PCI 总线 x0 上的所有设备将监听这个 PCI 写总线事务,最后由 PCI 设备 01 接收这个数
据请求,并完成 PCI 写事务。
1.3.5 Delayed 传送方式
如上文所述,如果处理器使用 Non-Posted 总线周期对 PCI 设备进行读操作,或者 PCI 设备使用
Non-Posted 总线事务对存储器进行读操作时,如果数据没有到达目的地,那么在这个读操作路
径上的所有 PCI 总线都不能被释放,这将严重影响 PCI 总线的使用效率。
为此 PCI 桥需要对 Non-Posted 总线事务进行优化处理,并使用 Delayed 总线事务处理这些
Non-Posted 总线事务,PCI 总线规定只有 Non-Posted 总线事务可以使用 Delayed 总线事务。PCI
总线的 Delay 总线事务由 Delay 读写请求和 Delay 读写完成总线事务组成,当 Delay 读写请求到
达目的地后,将被转换为 Delay 读写完成总线事务。基于 Delay 总线请求的数据交换如图 1-4
所示。
假设处理器通过存储器读、I/O 读写或者配置读写访问 PCI 设备 22 时,首先经过 HOST 主桥
进行存储器域与 PCI 总线域的地址转换,并由 HOST 主桥发起 PCI 总线事务,然后通过 PCI 桥
1、2,最终到达 PCI 设备 22。其详细步骤如下。
(1) HOST 主桥完成存储器域到 PCI 总线域的转换,然后启动 PCI 读总线事务。
(2) PCI 桥 1 接收这个读总线事务,并首先使用 Retry 周期,使 HOST 主桥择时重新发起相同
的总线周期。此时 PCI 桥 1 的上游 PCI 总线将被释放。值得注意的是 PCI 桥并不会每一次都使
用 Retry 周期,使上游设备择时进行重试操作。在 PCI 总线中,有一个“16 Clock”原则,即
FRAME#信号有效后,必须在 16 个时钟周期内置为无效,如果 PCI 桥发现来自上游设备的读总
线事务不能在 16 个时钟周期内结束时,则使用 Retry 周期终止该总线事务。
(3) PCI 桥 1 使用 Delayed 总线请求继续访问 PCI 设备 22。
(4) PCI 桥 2 接收这个总线请求,并将这个 Delayed 总线请求继续传递。此时 PCI 桥 2 也将首
先使用 Retry 周期,使 PCI 桥 1 择时重新发起相同的总线周期。此时 PCI 桥 2 的上游 PCI 总线
被释放。
(5) 这个数据请求最终到达 PCI 设备 22,如果 PCI 设备 22 没有将数据准备好时,也可以使
用 Retry 周期,使 PCI 桥 2 择时重新发起相同的总线周期;如果数据已经准备好,PCI 设备 22
将接收这个数据请求,并将这个 Delayed 总线请求转换为 Delayed 总线完成事务。如果 Delayed
总线请求是读请求,则 Delayed 总线完成事务中含有数据,否则只有完成信息,而不包含数据。
(6) Delayed 总线完成事务将“数据或者完成信息”传递给 PCI 桥 2,当 PCI 桥 1 重新发出
Non-Posted 总线请求时,PCI 桥 2 将这个“数据或者完成信息”传递给 PCI 桥 1。
(7) HOST 主桥重新发出存储器读总线事务时,PCI 桥 1 将“数据或者完成信息”传递给 HOST
主桥,最终完成整个 PCI 总线事务。
由以上分析可知,Delayed 总线周期由 Delayed 总线请求和 Delayed 总线完成两部分组成。下文
将 Delayed 读请求总线事务简称为 DRR(Delayed Read Request),Delayed 读完成总线事务简称为
DRC(Delayed Read Completion);而将 Delayed 写请求总线事务简称为 DWR(Delayed Write
Request),Delayed 写完成总线事务简称为 DWC(Delayed Write Completion)。
PCI 总线使用 Delayed 总线事务,在一定程度上可以提高 PCI 总线的利用率。因为在进行
Non-Posted 总线事务时,Non-Posted 请求在通过 PCI 桥之后,可以暂时释放 PCI 总线,但是采
用这种方式,HOST/PCI 桥将会择时进行重试操作。在许多情况下,使用 Delayed 总线事务,并
不能取得理想的效果,因为过多的重试周期也将大量消耗 PCI 总线的带宽。
为了进一步提高 Non-Posted 总线事务的执行效率,PCI-X 总线将 PCI 总线使用的 Delayed 总线
事务,升级为 Split 总线事务。采用 Split 总线事务可以有效解决 HOST/PCI 桥的这些重试操作。
Split 总线事务的基本思想是发送端首先将 Non-Posted 总线请求发送给接收端,然后再由接收端
主动地将数据传递给发送端。
除了 PCI-X 总线可以使用 Split 总线事务进行数据传送之外,有些处理器,如 x86 和 PowerPC
处理器的 FSB(Front Side Bus)总线也支持这种 Split 总线事务,因此这些 HOST 主桥也可以发起
这种 Split 总线事务。在 PCIe 总线中,Non-Posted 数据传送都使用 Split 总线事务完成,而不再
使用 Delayed 总线事务。本章将在第 1.5.1 节简要介绍 Split 总线事务和 PCI-X 总线对 PCI 总线
的一些功能上的增强。
[1] 如果是存储器、I/O 读或者配置读总线事务,这个回应包含数据;如果是 I/O 写或者配置写,
这个回应不包含数据。
1.4 PCI 总线的中断机制
PCI 总线使用 INTA#、INTB#、INTC#和 INTD#信号向处理器发出中断请求。这些中断请求信
号为低电平有效,并与处理器的中断控制器连接。在 PCI 体系结构中,这些中断信号属于边带
信号(Sideband Signals),PCI 总线规范并没有明确规定在一个处理器系统中如何使用这些信号,
因为这些信号对于 PCI 总线是可选信号。PCI 设备还可以使用 MSI 机制向处理器提交中断请求,
而不使用这组中断信号。有关 MSI 机制的详细说明见第 8 章。
1.4.1 中断信号与中断控制器的连接关系
不同的处理器使用的中断控制器不同,如 x86 处理器使用 APIC(Advanced Programmable Interrupt
Controller)中断控制器,而 PowerPC 处理器使用 MPIC(Multiprocessor Interrupt Controller)中断控
制器。这些中断控制器都提供了一些外部中断请求引脚 IRQ_PINx#。外部设备,包括 PCI 设备
可以使用这些引脚向处理器提交中断请求。
但是 PCI 总线规范没有规定 PCI 设备的 INTx 信号如何与中断控制器的 IRQ_PINx#信号相连,
这为系统软件的设计带来了一定的困难,为此系统软件使用中断路由表存放 PCI 设备的 INTx
信号与中断控制器的连接关系。在 x86 处理器系统中,BIOS 可以提供这个中断路由表,而在
PowerPC 处理器中 Firmware 也可以提供这个中断路由表。
在一些简单的嵌入式处理器系统中,Firmware 并没有提供中断路由表,此时系统软件开发者需
要事先了解 PCI 设备的 INTx 信号与中断控制器的连接关系。此时外部设备与中断控制器的连
接关系由硬件设计人员指定。
我们假设在一个处理器系统中,共有 3 个 PCI 插槽(分别为 PCI 插槽 A、B 和 C),这些 PCI 插槽
与中断控制器的 IRQ_PINx 引脚(分别为 IRQW#、IRQX#、IRQY#和 IRQZ#)可以按照图 1‑5 所
示的拓扑结构进行连接。
采用图 1-5 所示的拓扑结构时,PCI 插槽 A、B、C 的 INTA#、INTB#和 INTC#信号将分散连接
到中断控制器的 IRQW#、IRQX#和 IRQY#信号,而所有 INTD#信号将共享一个 IRQZ#信号。
采用这种连接方式时,整个处理器系统使用的中断请求信号,其负载较为均衡。而且这种连接
方式保证了每一个插槽的 INTA#信号都与一根独立的 IRQx#信号对应,从而提高了 PCI 插槽中
断请求的效率。
在一个处理器系统中,多数 PCI 设备仅使用 INTA#信号,很少使用 INTB#和 INTC#信号,而
INTD#信号更是极少使用。在 PCI 总线中,PCI 设备配置空间的 Interrupt Pin 寄存器记录该设备
究竟使用哪个 INTx 信号,该寄存器的详细介绍见第 2.3.2 节。
1.4.2 中断信号与 PCI 总线的连接关系
在 PCI 总线中,INTx 信号属于边带信号。所谓边带信号是指这些信号在 PCI 总线中是可选信号,
而且只能在一个处理器系统的内部使用,并不能离开这个处理器环境。PCI 桥也不会处理这些
边带信号。这给 PCI 设备将中断请求发向处理器带来了一些困难,特别是给挂接在 PCI 桥之下
的 PCI 设备进行中断请求带来了一些麻烦。
在一些嵌入式处理器系统中,这个问题较易解决。因为嵌入式处理器系统很清楚在当前系统中
存在多少个 PCI 设备,这些 PCI 设备使用了哪些中断资源。在多数嵌入式处理器系统中,PCI
设备的数量小于中断控制器提供的外部中断请求引脚数,而且在嵌入式系统中,多数 PCI 设备
仅使用 INTA#信号提交中断请求。
在这类处理器系统中,可能并不含有 PCI 桥,因而 PCI 设备的中断请求信号与中断控制器的连
接关系较易确定。而在这类处理器系统中,即便存在 PCI 桥,来自 PCI 桥之下的 PCI 设备的中
断请求也较易处理。
在多数情况下,嵌入式处理器系统使用的 PCI 设备仅使用 INTA#信号进行中断请求,所以只要
将这些 INTA#信号挂接到中断控制器的独立 IRQ_PIN#引脚上即可。这样每一个 PCI 设备都可
以独占一个单独的中断引脚。
而在 x86 处理器系统中,这个问题需要 BIOS 参与来解决。在 x86 处理器系统中,有许多 PCI
插槽,处理器系统并不知道在这些插槽上将要挂接哪些 PCI 设备,而且也并不知道这些 PCI 设
备到底需不需要使用所有的 INTx#信号线。因此 x86 处理器系统必须要对各种情况进行处理。
x86 处理器系统还经常使用 PCI 桥进行 PCI 总线扩展,扩展出来的 PCI 总线还可能挂接一些 PCI
插槽,这些插槽上 INTx#信号仍然需要处理。PCI 桥规范并没有要求桥片传递其下 PCI 设备的
中断请求。事实上多数 PCI 桥也没有为下游 PCI 总线提供中断引脚 INTx#,管理其下游总线的
PCI 设备。但是 PCI 桥规范推荐使用表 1-3 建立下游 PCI 设备的 INTx 信号与上游 PCI 总线 INTx
信号之间的映射关系。
表 1-3 PCI 设备 INTx#信号与 PCI 总线 INTx#信号的映射关系
设备号 PCI 设备的 INTx#信号 PCI 总线的 INTx#信号
0, 4, 8, 12, 16, 20, 24, 28 INTA# INTA#
INTB# INTB#
INTC#
INTC#
INTD# INTD#
1, 5, 9, 13, 17, 21, 25, 29
INTA#
INTB#
INTB# INTC#
INTC#
INTD#
INTD# INTA#
2, 6, 10, 14, 18, 22, 26, 30
INTA#
INTC#
INTB# INTD#
INTC# INTA#
INTD# INTB#
3, 7, 11, 15, 19, 23, 27, 31 INTA# INTD#
INTB#
INTA#
INTC# INTB#
INTD#
INTC#
我们举例说明该表的含义。在 PCI 桥下游总线上的 PCI 设备,如果其设备号为 0,那么这个设
备的 INTA#引脚将和 PCI 总线的 INTA#引脚相连;如果其设备号为 1,其 INTA#引脚将和 PCI
总线的 INTB#引脚相连;如果其设备号为 2,其 INTA#引脚将和 PCI 总线的 INTC#引脚相连;
如果其设备号为 3,其 INTA#引脚将和 PCI 总线的 INTD#引脚相连。
在 x86 处理器系统中,由 BIOS 或者 APCI 表记录 PCI 总线的 INTA~D#信号与中断控制器之间
的映射关系,保存这个映射关系的数据结构也被称为中断路由表。大多数 BIOS 使用表 1-3 中的
映射关系,这也是绝大多数 BIOS 支持的方式。如果在一个 x86 处理器系统中,PCI 桥下游总线
的 PCI 设备使用的中断映射关系与此不同,那么系统软件程序员需要改动 BIOS 中的中断路由
表。
BIOS 初始化代码根据中断路由表中的信息,可以将 PCI 设备使用的中断向量号写入到该 PCI
设备配置空间的 Interrupt Line register 寄存器中,该寄存器将在第 2.3.2 节中介绍。
1.4.3 中断请求的同步
在 PCI 总线中,INTx 信号是一个异步信号。所谓异步是指 INTx 信号的传递并不与 PCI 总线的
数据传送同步,即 INTx 信号的传递与 PCI 设备使用的 CLK#信号无关。这个“异步”信号给系
统软件的设计带来了一定的麻烦。
系统软件程序员需要注意“异步”这种事件,因为几乎所有“异步”事件都会带来系统的“同
步”问题。以图 1-1 为例,当 PCI 设备 11 使用 DMA 写方式,将一组数据写入存储器时,该设
备在最后一个数据离开 PCI 设备 11 的发送 FIFO 时,会认为 DMA 写操作已经完成。此时这个
设备将通过 INTx 信号,通知处理器 DMA 写操作完成。
此时处理器(驱动程序的中断服务例程)需要注意,因为 INTx 信号是一个异步信号,当处理器收
到 INTx 信号时,并不意味着 PCI 设备 11 已经将数据写入存储器中,因为 PCI 设备 11 的数据
传递需要通过 PCI 桥 1 和 HOST 主桥,最终才能到达存储器控制器。
而 INTx 信号是“异步”发送给处理器的,PCI 总线并不知道这个“异步”事件何时被处理。很
有可能处理器已经接收到 INTx 信号,开始执行中断处理程序时,该 PCI 设备还没有完全将数
据写入存储器。
因为“PCI 设备向处理器提交中断请求”与“将数据写入存储器”分别使用了两个不同的路径,
处理器系统无法保证哪个信息率先到达。从而在处理器系统中存在“中断同步”的问题,PCI
总线提供了以下两种方法解决这个同步问题。
(1) PCI 设备保证在数据到达目的地之后,再提交中断请求。
显然这种方法不仅加大了硬件的开销,而且也不容易实现。如果 PCI 设备采用 Posted 写总线事
务,PCI 设备无法单纯通过硬件逻辑判断数据什么时候写入到存储器。此时为了保证数据到达
目的地后,PCI 设备才能提交中断请求,PCI 设备需要使用“读刷新”的方法保证数据可以到达
目的地,其方法如下。
PCI 设备在提交中断请求之前,向 DMA 写的数据区域发出一个读请求,这个读请求总线事务将
被 PCI 设备转换为读完成总线事务,当 PCI 设备收到这个读完成总线事务后,再向处理器提交
中断请求。PCI 总线的“序”机制保证这个存储器读请求,会将 DMA 数据最终写入存储器,有
关 PCI 序的详细说明见第 9.3 节。
PCI 总线规范要求 HOST 主桥和 PCI 桥必须保证这种读操作可以刷新写操作。但问题是,没有
多少芯片设计者愿意提供这种机制,因为这将极大地增加他们的设计难度。除此之外,使用这
种方法也将增加中断请求的延时。
(2) 中断服务例程使用“读刷新”方法。
中断服务例程在使用“PCI 设备写入存储器”的这些数据之前,需要对这个 PCI 设备进行读操
作。这个读操作也可以强制将数据最终写入存储器,实际上是将数据写到存储器控制器中。这
种方法利用了 PCI 总线的传送序规则,这种方法与第 1 种方法基本相同,只是使用这种方法使
用软件方式,而第 1 种方式使用硬件方式。第 9.3 节将详细介绍这个读操作如何将数据刷新到
存储器中。
第 2 种方法也是绝大多数处理器系统采用的方法。程序员在书写中断服务例程时,往往都是先
读取 PCI 设备的中断状态寄存器,判断中断产生原因之后,才对 PCI 设备写入的数据进行操作。
这个读取中断状态寄存器的过程,一方面可以获得设备的中断状态,另一方面是保证 DMA 写
的数据最终到达存储器。如果驱动程序不这样做,就可能产生数据完整性问题。产生这种数据
完整性问题的原因是 INTx 这个异步信号。
这里也再次提醒系统程序员注意 PCI 总线的“异步”中断所带来的数据完整性问题。在一个操
作系统中,即便中断处理程序没有首先读取 PCI 设备的寄存器,也多半不会出现问题,因为在
操作系统中,一个 PCI 设备从提交中断到处理器开始执行设备的中断服务例程,所需要的时间
较长,处理器系统基本上可以保证此时数据已经写入存储器。
但是如果系统程序员不这样做,这个驱动程序依然有 Bug 存在,尽管这个 Bug 因为各种机缘巧
合,始终不能够暴露出来,而一旦这些 Bug 被暴露出来将难以定位。为此系统程序员务必要重
视设计中出现的每一个实现细节,当然仅凭谨慎小心是远远不够的,因为重视细节的前提是充
分理解这些细节。
PCI 总线 V2.2 规范还定义了一种新的中断机制,即 MSI 中断机制。MSI 中断机制采用存储器写
总线事务向处理器系统提交中断请求,其实现机制是向 HOST 处理器指定的一个存储器地址写
指定的数据。这个存储器地址一般是中断控制器规定的某段存储器地址范围,而且数据也是事
先安排好的数据,通常含有中断向量号。
HOST 主桥会将 MSI 这个特殊的存储器写总线事务进一步翻译为中断请求,提交给处理器。目
前 PCIe 和 PCI-X 设备必须支持 MSI 中断机制,但是 PCI 设备并不一定都支持 MSI 中断机制。
目前 MSI 中断机制虽然在 PCIe 总线上已经成为主流,但是在 PCI 设备中并不常用。即便是支
持 MSI 中断机制的 PCI 设备,在设备驱动程序的实现中也很少使用这种机制。首先 PCI 设备具
有 INTx#信号可以传递中断,而且这种中断传送方式在 PCI 总线中根深蒂固。其次 PCI 总线是
一个共享总线,传递 MSI 中断需要占用 PCI 总线的带宽,需要进行总线仲裁等一系列过程,远
没有使用 INTx#信号线直接。
剩余140页未读,继续阅读
彭本华
- 粉丝: 4
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端面试必问:真实项目经验大揭秘
- 永磁同步电机二阶自抗扰神经网络控制技术与实践
- 基于HAL库的LoRa通讯与SHT30温湿度测量项目
- avaWeb-mast推荐系统开发实战指南
- 慧鱼SolidWorks零件模型库:设计与创新的强大工具
- MATLAB实现稀疏傅里叶变换(SFFT)代码及测试
- ChatGPT联网模式亮相,体验智能压缩技术.zip
- 掌握进程保护的HOOK API技术
- 基于.Net的日用品网站开发:设计、实现与分析
- MyBatis-Spring 1.3.2版本下载指南
- 开源全能媒体播放器:小戴媒体播放器2 5.1-3
- 华为eNSP参考文档:DHCP与VRP操作指南
- SpringMyBatis实现疫苗接种预约系统
- VHDL实现倒车雷达系统源码免费提供
- 掌握软件测评师考试要点:历年真题解析
- 轻松下载微信视频号内容的新工具介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功