PCI、PCIe 一篇搞定

PCI、PCIe 一篇搞定PCI PCIe 概述 pcipcie

大家好,欢迎来到IT知识分享网。

文章目录

缩略词

缩写 全拼 解释
ISA Industry Standard Architecture 工业标准结构
PCI Peripheral Component Interconnect 外围器件互联
PCIe PCI Express
PCI-SIG PCI 特殊兴趣组织

历史

PCI

PCI 标准的特点

  1. 它是并行总线
    在一个时钟周期内 32 bit 同时被传输,引脚定义如下
    在这里插入图片描述
    在一个时钟周期内,按照协议,传输一次地址或一次数据。


  2. PCI 空间与处理器空间隔离
    PCI 设备具有独立的地址空间,即 PCI 总线地址空间,该空间与存储器地址空间通过 Host Bridge 隔离。
    处理器需要通过 HOST 主桥才能访问 PCI 设备,PCI 设备需要通过 HOST 主桥才能访问内存。
    换句话说,处理器访问 PCI 设备时,必须通过 HOST 主桥进行地址转换,PCI 设备访问内存时,也需要通过 HOST 主桥进行地址转换。HOST 主桥的一个重要作用就是将处理器访问的内存地址转换为 PCI 总线地址。


  3. 共享总线机制
    PCI 设备通过仲裁获得 PCI 总线的使用权后,才能进行数据传送。在 PCI 总线上进行数据传送,并不需要处理器进行干预。
  4. 扩展性强
    PCI 总线具有很强的扩展性,在 PCI 总线中,Root Bridge 可以直接连出一条 PCI 总线,这条总线也是该 Root Bridge 所管理的第一条 PCI 总线,该总线还可以通过 PCI 桥扩展出一系列 PCI 总线,并以 Root Bridge 为根节点,形成一颗 PCI 总线树。在同一条 PCI 总线上的设备间可以直接通信,并不会影响其它 PCI 总线上设备间的数据通信。隶属于同一颗 PCI 总线树上的 PCI 设备也可以直接通信,但需要通过 PCI 桥进行数据转发。

从 PCI 到 PCIe

PCIe 和 PCI 差异

  1. PCI 是总线结构,PCIe 是点对点结构。一个典型的 PCIe 系统框图如下
    在这里插入图片描述
    一个典型的结构是一个 root port 和一个 endpoint 直接组成一个点对点连接对,而 Switch 可以同时连接几个 endpoint。
    一个 root port 和一个 endpoint 对就需要一个单独的 PCI bus。
    而 PCI 是在同一个总线上的设备共享同一个 bus number。
    过去主板上的 PCI 插槽都公用一个 PCI bus,而现在的 PCIe 插槽却连在芯片组不同的 root port 上。




  2. PCIe 的连接是由不同的 lane 来连接的
    这些 lane 可以合在一起提供更高的带宽。譬如两个 l lane 可以合成 2 lane 的连接,写作 x2,两个 x2 可以变成 x4。
  3. PCI 配置空间从 256B 扩展为 4k,同时提供了 PCIe memory map 访问方式。

PCIe

PCI 细节

HOST 主桥

PCI 总线

PCI 设备

HOST 处理器

PCI 总线的负载

PCI 总线的信号定义

地址和数据信号
接口控制信号
仲裁信号

在这里插入图片描述
在一颗 PCI 总线树中,每一条 PCI 总线上都有一个总线仲裁器。一个处理器体系可以使用 PCI 桥扩展出一条新的 PCI 总线,这条新的 PCI 总线也需要一个总线仲裁器,通常在 PCI 桥中集成了这个总线仲裁器。多数 HOST 主桥也集成了一个 PCI 总线仲裁器。
PCI 主设备使用 PCI 总线进行数据传递时,需要首先置 REQ# 信号有效,向 PCI 总线仲裁器发出总线申请,当 PCI 总线仲裁器允许 PCI 主设备获得 PCI 总线的使用权后,将置 GNT# 信号为有效,并将其发送给指定的 PCI 主设备。而 PCI 主设备在获得总线使用权后,可以置 FRAME# 信号有效,与 PCI 从设备进行数据通信。

中断请求信号

PCI 总线的存储器读写总线事务

PCI 总线事务的时序
Posted 和 Non-Posted 传送方式
  1. PCI 设备 11 进行 DMA 写操作时使用存储器写总线事务,当 PCI 设备 11 获得 PCI 总线 x1 的使用权后,将发送存储器写总线事务到 PCI 总线 x1 上。
  2. 当 PCI 桥 1 发现这个总线事务的地址不在该桥管理的地址范围内,将首先接收这个总线事务,并结束 PCI 总线 x1 的总线事务。
  3. 此时 PCI 总线 x1 使用的资源已经被释放,PCI 设备 11 和 PCI 设备 12 可以使用 PCI 总线 x1 进行通信。
  4. PCI 桥 1 获得 PCI 总线 x0 的使用权后,将转发这个存储器写总线事务到 PCI 总线 x0 上
  5. 之后,HOST 主桥 x 将接收这个存储器写总线事务,并最终将数据写入主存储器。
HOST 处理器访问 PCI 设备

HOST 处理器对 PCI 设备的数据访问主要包括两方面

  • 处理器向 PCI 设备发起存储器和 I/O 读写请求。(内存空间、I/O 空间)
  • 处理器对 PCI 设备进行配置读写。(配置空间)

在 PCI 设备的配置空间中,共有 6 个 BAR 寄存器,每一个 BAR 寄存器都与 PCI 设备使用的一组 PCI 总线地址空间对应,BAR 寄存器记录这组地址空间的基地址。将与 BAR 寄存器对应的 PCI 总线地址空间称为 BAR 空间,在 BAR 空间中可以存放 I/O 地址空间,也可以存放存储器(内存)地址空间。注意,在 BAR 寄存器中存放地是 PCI 设备使用的“PCI 总线域”的物理地址,而不是“存储器域”的物理地址。
HOST 处理器访问 PCI 设备 I/O 地址空间的过程,与访问存储器地址空间略有不同。
访问 I/O 地址空间:
有些处理器,如 x86 处理器,具有独立的 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 地址。
访问存储器地址:
HOST 处理器在初始化时,需要将 PCI 设备使用的 BAR 空间映射到“存储器域”的存储器地址空间。
HOST 主桥将“存储器域”的读写请求翻译为 PCI 总线的存储器读写总线事务之后,再发送给目标设备。
总结:







  • HOST 主桥相当于一个网关,上面是广域网,下面是局域网
  • HOST 主桥上面是存储器域,下面是 PCI 域;上面是 CPU 的世界,下面是 PCI 的世界;上面通行使用存储器域地址(内存地址),下面通行使用 PCI 地址
  • 通信经过网关需要进行地址转换,网关有隔离和转换功能

以上面的结构框图为例说明处理器如何通过 HOST 主桥和 PCI 桥 1 对 PCI 设备 11 进行存储器读写操作。当处理器对 PCI 设备 11 进行存储器写操作时,这些数据需要通过 HOST 主桥 x 和 PCI 桥 x1,最终到达 PCI 设备 11,其访问步骤如下

  1. 首先处理器将要传递的数据放入通用寄存器中,之后向 PCI 设备 11 映射到的存储器域的地址进行写操作。
  2. HOST 主桥 x 接收来自处理器的存储器写请求,之后处理器结束当前存储器写操作,释放系统总线。
  3. HOST 主桥 x 将存储器域的存储器地址转换为 PCI 总线域的 PCI 总线地址。并向 PCI 总线 x0 发起 PCI 写请求总线事务。(注意:虽然在许多处理器系统中,存储器地址和 PCI 总线地址完全相等,但其含义完全不同。)
  4. PCI 总线 x0 上的 PCI 设备 01、PCI 设备 02 和 PCI 桥 1 将同时监听这个 PCI 写总线事务。最后 PCI 桥 x1 接收这个写总线事务,并结束来自 PCI 总线 x0 的 PCI 总线事务。
  5. PCI 桥 x1 向 PCI 总线 x1 发起新的 PCI 总线写总线事务。
  6. PCI 总线 x1 上的 PCI 设备 11 和 PCI 设备 12 同时监听这个 PCI 写总线事务。最后 PCI 设备 11 通过地址译码方式接收这个写总线事务,并结束来自 PCI 总线 x1 上的 PCI 总线事务。
PCI 设备读写主存储器
  1. PCI 设备 11 将存储器写请求发向 PCI 总线 x1,写请求使用的地址为 PCI 总线域的地址。
  2. PCI 总线 x1 上的所有设备监听这个请求,因为 PCI 设备 11 是向处理器的存储器写数据,所以 PCI 总线 x1 上的 PCI Agent 设备都不会接收这个数据请求。
  3. PCI 桥 x1 发现当前总线事务使用的 PCI 总线地址不是其下游设备使用的 PCI 总线地址,则接收这个数据请求。此时 PCI 桥 x1 将结束来自 PCI 设备 11 的 Posted 存储器写请求,并将这个数据请求推到上游 PCI 总线上,即 PCI 总线 x0 上。
  4. PCI 总线 x0 上的所有 PCI 设备包括 HOST 主桥将监听这个请求。PCI 总线 x0 上的 PCI Agent 设备也不会接收这个数据请求,此时这个数据请求将由 HOST 主桥 x 接收,并结束 PCI 桥 1 的 Posted 存储器写请求。
  5. HOST 主桥 x 发现这个数据请求是发向存储器的,则将来自 PCI 总线 x0 的 PCI 总线地址转换为存储器地址(liyongjun:应该反过来,先转换,后发现),之后通过存储器控制器将数据写入存储器,完成 PCI 设备的 DMA 写操作。

PCI 总线的中断机制

中断请求的同步

PCI 总线的桥与配置

存储器域与 PCI 总线域

在这里插入图片描述
本书中将 CPU 域和 DRAM 域统称为存储器域。存储器域包括 CPU 内部的通用寄存器、存储器映像寻址的寄存器、主存储器空间和外部设备空间。
CPU 域地址空间指 CPU 所能直接访问的地址空间集合(在本书中,CPU、处理器与处理器系统的概念不同。如 MPC8548 处理器的内核是 E500 V25,本书将这个处理器内核称为 CPU;处理器由一个或者多个 CPU、外部 Cache、中断控制器和 DRAM 控制器组成;而处理器系统由一个或者多个处理器和外部设备组成)。CPU 域仅在 CPU 内核中有效,CPU 访问主存储器时,首先将读写命令放入读写指令缓冲中,然后将这个命令发送到 DRAM 控制器或者 HOST 主桥。DRAM 控制器或者 HOST 主桥将 CPU 地址转换为 DRAM 或者 PCI 总线地址,分别进入 DRAM 域或者 PCI 总线域后,再访问相应的地址空间。
DRAM 域地址空间指 DRAM 控制器能够访问的地址空间集合。
在多数处理器系统中,DRAM 域空间是 CPU 域空间的一部分(除此之外,CPU 域还包含外部设备空间),但也有例外,比如显卡控制器可能会借用一部分主存储器空间,这些被借用的空间不能被 CPU 访问,而只能被 DRAM 控制器,更为准确地说是显卡通过 DRAM 控制器访问,因此这段空间不属于 CPU 域,严格地讲,这段空间属于外部设备域。(liyongjun:这不就是我之前研究的 CMA 嘛)
值得注意的是,存储器域的外部设备空间,在 PCI 总线域中还有一个地址映射。当处理器访问 PCI 设备时,首先访问的是这个设备在存储器域上的 PCI 设备空间,之后 HOST 主桥将这个存储器域的 PCI 总线地址转换为 PCI 总线域的物理地址。
在一个处理器系统中,CPU 能够访问的 PCI 总线地址一定在存储器域中具有地址映射;PCI 设备能够访问的存储器域地址也一定在 PCI 总线域中具有地址映射。 这个映射存在于 HOST 主桥中。
PCI 设备使用的地址空间保存在各自的 PCI 配置寄存器中,即 BAR 寄存器中。这些 PCI 总线地址空间需要在初始化时映射成为存储器域的存储器地址空间,保存在 HOST 主桥中,之后处理器才能访问这些地址空间。
在 32 位的 PCI 总线中,每一个 PCI 总线域的地址范围都是 0x00000000~0xffffffff,PCI 总线 x 域上的 PCI 总线地址 0x00000000 与 PCI 总线 y 域上的 PCI 总线地址 0x00000000 并不相同,而且这两个 PCI 总线地址经过 HOST 主桥反向映射后,得到的存储器地址也不相同。







-5fffffff : MEM -410fffff : PCI Bus 0000:01 -41007fff : 0000:01:00.0 -41007fff : 0000:01:00.0 -412fffff : PCI Bus 0000:01 -411fffff : 0000:01:00.0 -411fffff : 0000:01:00.0 -41200fff : 0000:01:00.0 -41200fff : 0000:01:00.0 -7fffffff : MEM -610fffff : PCI Bus 0001:01 -61007fff : 0001:01:00.0 -61007fff : 0001:01:00.0 -612fffff : PCI Bus 0001:01 -611fffff : 0001:01:00.0 -611fffff : 0001:01:00.0 -61200fff : 0001:01:00.0 -61200fff : 0001:01:00.0 
HOST 主桥
PCI 设备配置空间的访问机制
  • Enable 位。当该位为 1 时,HOST 主桥使能对 PCI 设备配置空间的访问,当 HOST 处理器对 CFG_DATA 寄存器进行访问时,HOST 主桥将对这个寄存器的访问转换为 PCI 配置读写总线事务并发送到 PCI 总线上。
  • Bus Number 字段记录 PCI 设备所在的总线号。
  • Device Number 字段记录 PCI 设备的设备号。
  • Function Number 字段记录 PCI 设备的功能号。
  • Register Number 字段记录 PCI 设备的配置寄存器号。
存储器域地址空间到 PCI 总线域地址空间的转换
x86 处理器的 HOST 主桥
PCI 桥
PCI Agent 设备的配置空间
pciaddr = pci_resource_start(pdev, 1); regs = ioremap(pciaddr, CP_REGS_SIZE); 

在 Linux 系统中,使用 pci_dev->resource[bar].start 参数保存 BAR 寄存器在存储器域的地址。在编写 Linux 设备驱动程序时,必须使用 pci_resource_start 函数获得 BAR 空间对应的存储器域的物理地址,而不能使用从 BAR 寄存器中读出的地址。
当驱动程序获得 BAR 空间在存储器域的物理地址后,再使用 ioremap 函数将这个物理地址转换为虚拟地址。
Linux 系统直接使用 BAR 空间的方法是正确的,如源代码

pci_read_config_dword(pdev, 1, &pciaddr); regs = ioremap(pciaddr, BAR_SIZE); 
PCI 桥的配置空间
  • Secondary Bus Reset 位,第 6 位,可读写。当该位为 1 时,将使用下游总线提供的 RST# 信号复位与 PCI 桥的下游总线连接的 PCI 设备。

PCI 总线的配置

PCI 总线的数据交换

PCI 设备 BAR 空间的初始化

存储器地址与 PCI 总线地址的转换
PCI 设备 BAR 寄存器和 PCI 桥 Base、Limit 寄存器的初始化

PCI 设备的数据传递

处理器到 PCI 设备的数据传送
PCI 设备的 DMA 操作

11:
PCI 设备通过 DMA 向内存写数据时,PCI 设备发出的地址为 PCI 总线地址,我的问题是,PCI 设备如何知道 PCI 总线地址和内存总线地址的映射关系呢?我知道这个映射关系是存储在 HOST 主桥中的,PCI 设备是如何知道这个映射关系的呢?
AI:
PCI设备通过DMA向内存写数据时,需要知道PCI总线地址和内存总线地址的映射关系。这个映射关系存储在主机主桥中的PCI配置空间中的PCI Base Address Register(BAR)中。
主机主桥是PCI总线和系统总线(如PCIe或PCI-X)之间的桥接器。它负责管理PCI设备和系统总线之间的通信。当PCI设备插入主机时,主机主桥会为该设备分配一个唯一的PCI总线地址,并将该地址配置给设备。
PCI设备可以通过PCI配置空间访问该配置信息。PCI配置空间是一组寄存器,存储在设备的内存空间中。通过读取和写入这些寄存器,设备可以获取分配给它的PCI总线地址,并了解PCI总线地址和内存总线地址的映射关系。
设备可以使用PCI配置空间中的BAR寄存器来获取映射关系。每个BAR寄存器包含一个地址掩码和一个基地址。设备读取该寄存器,获得基地址并与地址掩码进行逻辑与运算,以获取映射到内存总线的地址范围。
通过BAR寄存器,设备可以确定映射关系,并使用正确的地址访问内存。这使得设备能够使用DMA直接向内存写入数据,而不需要主机的干预。
总结起来,PCI设备通过访问PCI配置空间中的BAR寄存器来获取PCI总线地址和内存总线地址的映射关系。这种映射关系由主机主桥进行配置,并通过BAR寄存器向设备公开。
11:
我知道的是 BAR 寄存器中保存 内存总线地址到 PCI 总线地址映射后的 PCI 总线基地址,难道还保存着 PCI 总线地址到内存总线地址映射后的 PCI 总线基地址?
AI:
是的,您说得对。PCI设备通过BAR(Base Address Register)寄存器来了解PCI总线地址和内存总线地址的映射关系。每个PCI设备都有多个BAR寄存器,其中包含了PCI总线地址到内存总线地址的映射信息
BAR寄存器中的值指示了PCI设备在PCI总线上的地址范围,并提供了与内存总线上对应地址的映射。PCI设备可以通过读取BAR寄存器中的值来获取PCI总线地址到内存总线地址的映射关系。
具体而言,当PCI设备需要向内存写入数据时,它会使用DMA(Direct Memory Access)进行传输。在进行DMA传输之前,PCI设备会读取相应的BAR寄存器来获取映射关系,从而知道应该将数据写入哪个内存地址。
因此,PCI设备通过读取BAR寄存器中的值来了解PCI总线地址到内存总线地址的映射关系,从而确定数据应该写入的内存地址。















(2)。。。 略

与 Cache 相关的 PCI 总线事务

Cache 一致性的基本概念

PCI 设备对可 Cache 的存储器空间进行 DMA 读写操作的过程较为复杂,本节仅介绍在 Cache Memory 系统中与 PCI 设备进行 DMA 操作相关的一些最为基础的概念。

  1. Cache 一致性协议
    多数 SMP 处理器系统使用 MESI 协议处理多个处理器之间的 Cache 一致性。该协议也称为 Illinois protocol,在 SMP 处理器系统中得到广泛应用。MESI 协议使用四个状态位描述每一个 Cache 行。
  • M(Modified)位。M 位为 1 时表示当前 Cache 行中包含的数据与存储器中的数据不一致,而且它仅在本 CPU 的 Cache 中有效,不在其它 CPU 的 Cache 中存在副本,在这个 Cache 行中的数据是当前处理器系统中最新的数据副本。当 CPU 对这个 Cache 行进行替换操作时,必然会引发系统总线的写周期,将 Cache 行中数据与内存中的数据进行同步。
  • E(Exclusive)位。E 位为 1 时表示当前 Cache 行中包含的数据有效,而且该数据仅在当前 CPU 的 Cache 中有效,而不在其它 CPU 的 Cache 中存在副本。在该 Cache 行中的数据是当前处理器系统中最新的数据副本,而且与存储器中的数据一致。
  • S(Shared)位。S 位为 1 表示 Cache 行中包含的数据有效,而且在当前 CPU 和至少其它一个 CPU 中具有副本。在该 Cache 行中的数据是当前处理器系统中最新的数据副本,而且与存储器中的数据一致。
  • I(Invalid)位。I 位为 1 表示当前 Cache 行中没有有效数据或者该 Cache 行没有使能。MESI 协议在进行 Cache 行替换时,优先使用 I 位为 1 的 Cache 行。
  • 状态为 E 或者 M 时,数据将直接写入到 Cache 中,并将状态改为 M。
  • 状态为 S 时,数据将直接写入到 Cache 中,并将状态改为 M,同时其它 CPU 保存该数据副本的 Cache 行状态将从 S 或者 O 迁移到 I(Probe Write Hit)。
  • 状态为 O 时,数据将直接写入到 Cache 中,并将状态改为 M,同时其它 CPU 保存该数据副本的 Cache 行状态将从 S 迁移到 I(Probe Write Hit)。

当 CPU A 对一段存储器进行写操作时,如果这些数据没有在本地 Cache 中命中,而在其它 CPU,如 CPU B 的 Cache 中命中时,其状态可能为 E、S、M 或者 O。其中 CPU A 使用 CPU B 在同意 Cache 共享域中。

  • Cache 行状态为 E 时,CPU B 将该 Cache 行状态改为 I;而 CPU A 将从本地申请一个新的 Cache 行,将数据写入,并该 Cache 行状态更新为 M。
  • Cache 行状态为 S 时,CPU B 将该 Cache 行状态改为 I,而且具有同样副本的其他 CPU 的 Cache 行也需要将状态改为 I;而 CPU A 将从本地申请一个 Cache 行,将数据写入,并该 Cache 行状态更新为 M。
  • Cache 行状态为 M 时,CPU B 将原 Cache 行中的数据回写到主存储器,并将该 Cache 行状态改为 I,具有同样数据副本的其他 CPU 的 Cache 行也需要将状态从 S 更改为 I;CPU A 将从本地申请一个 Cache 行,将数据写入,并该 Cache 行状态更新为 M。
    Cache 行状态可以从 M 迁移到 O。例如当 CPU A 读取的数据从 CPU B 中命中时,如果在 CPU B 中 Cache 行的状态为 M 时,将迁移到 O,同时 CPU B 将数据传送给 CPU A 新申请的 Cache 行中,而且 CPU A 的 Cache 行状态将被更改为 S。
  1. HIT# 和 HITM# 信号
    在 SMP 处理器系统中,每一个 CPU 都使用 HIT# 和 HITM# 信号反映 HOST 主桥访问的地址是否在各自的 Cache 中命中。当 HOST 主桥访问存储器时,CPU 将驱动 HIT# 和 HITM# 信号,其描述如下
    在这里插入图片描述
    HIT# 和 HITM# 信号是 FSB 中非常重要的两个信号,各个 CPU 的 HIT# 和 HITM# 信号通过“线与”方式直接相连。


PCI 设备对不可 Cache 的存储器空间进行 DMA 读写
  1. x86 处理器
    x86 处理器使用 MTRR(Memory Type Range Register)寄存器设置存储器空间的属性,如果存储器空间为“可 Cache 空间”,x86 处理器还可以进一步设置这段空间为“Write Through”、“Write Combining”、“Write Protect”和“Write Back”。但是这些设置与 PCI 设备进行 DMA 操作时,是否进行 Cache 一致性操作并没有直接关系。
    在 x86 处理器系统中,一个 PCI 设备进行 DMA 写操作,可以将数据从 PCI 设备写入到主存储器中。这个数据首先需要通过 HOST 主桥,然后经过 FSB 发送到存储器控制器。虽然在 x86 处理器系统中,CPU 知道这个存储器区域是否为“可 Cache 的”,但是 HOST 主桥并不知道 PCI 设备访问的存储器地址是否为“可 Cache 的”,因此都需要使用“Cache 一致”的 FSB 总线传送事务进行存储器写操作,从而数据在发向 FSB 时,CPU 必须要进行总线监听,通知 FSB 总线这段空间是“不可 Cache 的”。
    在 x86 处理器中,PCI 设备向不可 Cache 的存储器空间进行读操作时,CPU 也必须进行 Cache 共享一致性操作,而这种没有必要的 Cache 共享一致性操作将影响 PCI 总线的传送效率。当 PCI 设备所访问的存储器空间没有在 CPU 的 Cache 命中时,CPU 会通知 FSB,数据没有在 Cache 中命中,此时 PCI 设备访问的数据将从存储器中直接读出。
    在 x86 处理器系统中,无论 PCI 设备访问的存储器空间是否为“不可 Cache 的”,都需要进行 Cache 共享一致性操作。这也是 PCI 总线在 x86 处理器使用中的一个问题。而 PCIe 总线通过在数据报文中设置“Snooping”位解决了这个问题。



  2. PowerPC 处理器
    在 MPC8548 处理器中,HOST 主桥可以通过 PIW ARn 寄存器的 RTT 字段和 WTT 字段预知 PCI 设备访问的存储器空间是否为可 Cache 空间。当 HOST 主桥访问“不可 Cache 空间”时,可以使用 FSB 总线的“不进行 Cache 一致性”的总线事务。
    此时 PowerPC 处理器不会在 FSB 总线中进行 Cache 一致性操作,即忽略 FSB 总线事务的 Snoop Phase。PCI 设备进行 DMA 写时,数据将直接进入主存储器,而 PCI 设备进行 DMA 读时,所读取的数据直接从主存储器获得。PowerPC 处理器可以忽略 CPU 进行总线监听的动作,从而提高了 FSB 传送效率。

PCI 设备对可 Cache 的存储器空间进行 DMA 读写

PCI 设备进行 DMA 写时发生 Cache 命中,如果命中的 Cache 行状态为 E,PCI 设备(通过 HOST 主桥)写入存储器的信息比 Cache 行中的数据新,而且 PCI 设备在进行 DMA 写操作之前,存储器域 Cache 中数据一致,此时 CPU 进需要在 Snoop Phase 使无效(Invalidate)这个 Cache 行,然后 FSB 总线事务将数据写入存储器即可。当然如果 FSB 总线事务可以将数据直接写入 Cache,并将 Cache 行的状态更改为 M,也可以提高 DMA 写的效率

预读机制

指令预读
数据预读
PCI 总线的预读机制

(2)对“well-behavior” 存储器的多次读操作,可以合并为一次读操作。如向这个设备的地址 n、n + 4、n + 8、n + 12 地址处进行四个双字的读操作,可以合并为对 n 地址的一次突发读操作(大小为 4 个双字)。

PCIe 细节

PCIe 总线的基础知识

端到端的数据传递

PCIe 总线物理链路间的数据传递使用基于时钟的同步传送机制,但是在物理链路上并没有时钟线,PCIe 总线的接收端含有时钟恢复模块 CDR(Clock Data Recovery),CDR 将从接收报文中提取接收时钟,从而进行同步数据传递,PCIe 设备进行链路训练时将完成时钟的提取工作。

值得注意的是,在一个 PCIe 设备中除了需要从报文中提取时钟外,还使用了 REFCLK+ 和 REFCLK- 信号对作为本地参考时钟

PCIe 总线使用的信号

PCIe 设备使用两种电源信号供电,分别是 Vcc 与 Vaux,其额定电压为 3.3V。其中 Vcc 为主电源,PCIe 设备使用的主要逻辑模块均使用 Vcc 供电,而一些与电源管理相关的逻辑使用 Vaux 供电。
PCIe 链路的最大宽度为 x32,但在实际应用中,x32 的链路宽度极少使用。一般提供 x16 的 PCIe 插槽,并使用 16 对 PETxx 信号用于发送链路,另外 16 对 PERxx 信号用于接收链路。除此之外,PCIe 总线还使用了下列辅助信号。

  1. PERST# 信号
    该信号为全局复位信号,由处理器系统提供,处理器系统需要为 PCIe 插槽和 PCIe 设备提供该复位信号。
  2. REFCLK+ 和 REFCLK- 信号
    在一个处理器系统中,可能含有许多 PCIe 设备,这些设备可以作为 Add-In 卡与 PCIe 插槽连接,也可以作为内置模块,与处理器系统提供的 PCIe 链路直接相连,而不需要经过 PCIe 插槽。PCIe 设备与 PCIe 插槽都具有 REFCLK+ 和 REFCLK- 信号,其中 PCIe 插槽使用这组信号与处理器系统同步。
    在一个处理器系统中,通常采用专用逻辑向 PCIe 插槽提供 REFCLK+ 和 REFCLK- 信号,如下图所示,其中 100MHz 的时钟源由晶振提供,并经过一个 “一推多” 的差分时钟驱动器生成多个同相位的时钟源,与 PCIe 插槽一一对应连接。
    在这里插入图片描述
    PCIe 插槽需要使用参考时钟,其频率范围为 100MHz ± 300ppm,处理器系统需要为每一个 PCIe 插槽、MCH、ICH 和 Switch 提供参考时钟。
    当 PCIe 设备作为 Add-In 卡连接在 PCIe 插槽时,可以直接使用 PCIe 插槽提供的 REFCLK+ 和 REFCLK- 信号,也可以使用独立的参考时钟,只要这个参考时钟在 100MHz ± 300ppm 范围内即可。内置的 PCIe 设备与 Add-In 卡在处理 REFCLK+ 和 REFCLK- 信号时使用的方法类似,但是 PCIe 设备可以使用独立的参考时钟,而不使用 REFCLK+ 和 REFCLK- 信号。
    在一个处理器系统中,如果使用 PCIe 链路进行机箱到机箱间的互连,因为参考时钟可以异步设置,机箱到机箱之间进行数据传送时仅需要差分信号线即可,而不需要参考时钟,从而极大地降低了连接难度。





  3. WAKE# 信号
    当 PCIe 设备进入休眠状态,主电源已经停止供电时,PCIe 设备使用该信号向处理器系统提交唤醒请求,使处理器系统重新为该 PCIe 设备提供主电源 Vcc。WAKE# 信号是可选的。
    WAKE# 是一个 Open Drain 信号,一个处理器的所有 PCIe 设备可以将 WAKE# 信号进行线与后,统一发送给处理器系统的电源控制器。当某个 PCIe 设备需要被唤醒时,该设备首先置 WAKE# 信号为有效,然后在经过一段延时之后,处理器系统开始为该设备提供主电源 Vcc,并使用 PERST# 信号对该设备进行复位操作(liyongjun疑问:驱动需要重新加载吗?)。此时 WAKE# 信号需要始终保存低,当主电源 Vcc 上电完成之后,PERST# 信号也将置为无效并结束复位,WAKE# 信号也将随之置为无效,结束整个唤醒过程。

  4. JTAG 信号
    JTAG(Joint Test Action Group)是一种国际标准测试协议,主要用于芯片内部测试。目前绝大多数器件都支持 JTAG 测试标准。
    JTAG 信号由 TRST#、TCK、TDI、TDO 和 TMS 信号组成。其中 TRST# 为复位信号;TCK 为时钟信号;TDI 和 TDO 分别与数据输入和数据输出对应;而 TMS 信号为模式选择。
    JTAG 允许多个器件通过 JTAG 接口串联在一起,并形成一个 JTAG 链。目前 FPGA 和 EPLD 可以借用 JTAG 接口实现在线编程(In-System Programming, ISP)功能。处理器也可以使用 JTAG 接口进行系统级调试,如设置断点、读取内部寄存器和存储器等一系列操作。除此之外 JTAG 接口也可以用作 “逆向工程”,分析一个产品的实现细节,因此在正式产品中,一般不保留 JTAG 接口。


  5. PRSNT1# 和 PRSNT2# 信号
    PRSNT1# 和 PRSNT2# 信号与 PCIe 设备的热拔插相关。
    当 Add-In 卡没有插入时,处理器主板的 PRSNT2# 信号由上拉电阻接为高,而当 Add-In 卡插入时,主板的 PRSNT2# 信号与 PRSNT1# 信号通过 Add-In 卡连通,此时 PRSNT2# 信号为低。处理器主板的热插拔控制逻辑将捕获这个 “低电平”,得知 Add-In 卡已插入,从而触发系统软件进行相应处理。
    值得注意的是,在实现热拔插功能时,Add-In 卡需要使用 “长短针” 结构。


PCIe 总线的层次结构
  1. 事务层
    事务层定义了 PCIe 总线使用总线事务,其中多数总线事务与 PCI 总线兼容。这些总线事务可以通过 Switch 等设备传送到其它 PCIe 设备或者 RC。
    事务层接收来自 PCIe 设备核心层的数据,并将其封装为 TLP(Transaction Layer Packet)后,发向数据链路层。此外事务层还可以从数据链路层中接收数据报文,然后转发至 PCIe 设备的核心层。

  2. 数据链路层
    数据链路层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。
    来自事务层的报文在通过数据链路层时,将被添加 Sequence Number 前缀和 CRC 后缀。数据链路层使用 ACK/NAK 协议保证报文的可靠传递。

  3. 物理层
    物理层时 PCIe 总线的最底层,将 PCIe 设备连接在一起。PCIe 总线的物理电气特性决定了 PCIe 链路只能使用端到端的连接方式。PCIe 总线的物理层为 PCIe 设备间的数据通信提供传送介质,为数据传递提供可靠的物理环境。
    物理层是 PCIe 体系结构中最重要,也是最难实现的部分。PCIe 总线的物理层定义了 LTSSM(Link Training and Status State Machine)状态机,PCIe 链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理。
    对于系统软件而言,物理层几乎不可见,但是系统程序员仍有必要较为深入地理解物理层的工作原理。


PCIe 链路的扩展

PCIe 体系结构的组成部件

PCIe 体系结构的组成部件

基于 PCIe 总线的通用处理器结构
RC 的组成结构
Switch
VC 和端口仲裁
  • Switch 的 Egress 端口。当 EP A 和 EP B 同时访问 EP C,D 或者 DDR-SDRAM 时,需要通过 Switch 的 Egress 端口 C。此时 Switch 需要进行端口仲裁确定是 EP A 的数据报文还是 EP B 的数据报文优先通过 Egress 端口 C。
  • 多端口 RC 的 Egress 端口。当 RC 的端口 1 和端口 3 同时访问 EP C 时,RC 的端口 2 需要进行端口仲裁,决定来自 RC 哪个端口的数据可以率先通过。
  • RC 通往主存储器的端口。当 RC 的端口 1、端口 2 和端口 3 同时访问 DDR 控制器时,这些数据报文将通过 RC 的 Egress 端口 4,此时需要进行端口仲裁。

PCIe 设备的扩展配置空间

PCIe 总线的事务层

TLP 格式

在这里插入图片描述
一个完整的 TLP 由 1 个或者多个 TLP Prefix、TLP Head、Data Payload(数据有效负载)和 TLP Digest 组成。TLP 头是 TLP 最重要的标志,不同的 TLP 其头的定义并不相同。TLP 头包含了当前 TLP 的总线事务类型、路由信息等一系列信息。在一个 TLP 中,Data Payload 的长度可变,最小为 0,最大为 1024 DW。
TLP Digest 是一个可选项,一个 TLP 是否需要 TLP Digest 由 TLP Head 决定。
在这里插入图片描述
TLP Head 由 3 个或者 4 个双字(DW)组成。其中第一个双字中保存通用 TLP 头,其它字段与通用 TLP 头的 Type 字段相关。一个通用 TLP 头由 Fmt、Type、TC、Length 等字段组成。
如果存储器读写 TLP 支持 64 位地址模式时,TLP 头的长度为 4DW,否则为 3DW。




TLP 的路由
基于地址的路由
基于 ID 的路由
隐式路由

在这里插入图片描述
使用隐式路由方式的 TLP,其 Route 字段为 “000”,“011”,“100” 或者 “101”。

如果 Switch 的上游端口接收了一条来自 RC 的广播消息,则将该报文发向所有的下游端口;如果 Switch 的下游端口接收了一条发向 RC 的消息报文时,Switch 将此报文直接转发到上游端口,直至 RC。

消息请求报文
  • INTx 中断消息报文(INTx Interrupt Signaling)
  • 电源管理消息报文
  • 错误消息报文
  • 锁定事务消息报文
  • 插槽电源限制消息报文
  • Vendor-Defined Messages
INTx 中断消息报文

PCIe 总线的数据链路层与物理层

与事务层不同,数据链路层主要处理端到端的数据传送。在事务层中,源设备与目标设备间的传送距离较长,设备之间可能经过若干级 Switch;而在数据链路层中,源设备与目标设备在一条 PCIe 链路的两端(liyongjun:醍醐灌顶,类比于网络协议)(liyongjun:数据链路层,关键字:相邻)。
物理层是 PCIe 总线的最底层,也是 PCIe 总线体系结构的核心。在物理层中涉及许多与差分信号传递有关的模拟电路知识。

物理层简介
  • 保证发送的信号可以被接收端正确接收
  • 保证发送的信号不会影响其它信号
  • 保证发送的信号不会损坏接收器件
  • 保证发送的信号不会产生较大的 EMI 电磁噪声。
PCIe 链路的差分信号

PCIe 总线的链路训练与电源管理

流量控制

流量控制的基本原理

在这里插入图片描述
假设 Node 1 与 Node 2 之间共存在 5 个 VC,即在链路 1 的两端设置了 5 组缓存。而这 5 个 VC 共享一个物理通路,即链路 1。

MSI 和 MSI-X 中断机制

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140255.html

(0)
上一篇 2025-05-27 22:00
下一篇 2025-05-27 22:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信