前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PCI Express 系列连载篇(十四)

PCI Express 系列连载篇(十四)

作者头像
FPGA技术江湖
发布2020-12-30 10:12:12
发布2020-12-30 10:12:12
1.3K0
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

最近有很多大侠在交流群里讨论PCI总线,PCI作为高速接口之一,在当下的FPGA产品设计研发中,地位举足轻重,应用广泛,今天给大侠带来PCI Express 系列连载,今天带来第十四篇,PCI设备对不可Cache的存储器空间进行DMA读写、PCI设备对可Cache的存储器空间进行DMA读写、PCI设备进行DMA写时发生Cache命中以及DMA写时发生Cache命中的优化相关内容。希望对各位大侠的学习有参考价值,话不多说,上货。

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

在x86处理器和PowerPC处理器中,PCI设备对“不可Cache的存储器空间”进行DMA读写的过程并不相同。其中PowerPC处理器对“不可Cache的存储器空间”进行DMA读写进行了专门的处理,而x86处理器在对这类空间操作时,效率相对较低。

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总线传送事务[1]进行存储器写操作,从而数据在发向FSB时,CPU必须要进行总线监听,通知FSB总线这段空间是“不可Cache的”。

在x86处理器中,PCI设备向不可Cache的存储器空间进行读操作时,CPU也必须进行Cache共享一致性操作,而这种没有必要的Cache共享一致性操作将影响PCI总线的传送效率。当PCI设备所访问的存储器空间没有在CPU的Cache命中时,CPU会通知FSB,数据没有在Cache中命中,此时PCI设备访问的数据将从存储器中直接读出。

x86处理器在前端总线上进行Cache共享一致性操作时,需要使用Snoop Phase,如果PCI设备能事先得知所访问的存储器是“不可Cache的”,就可以不在前端总线上进行Cache共享一致性操作,即FSB总线事务可以不包含Snoop Phase,从而可以提高前端总线的使用效率。但是x86处理器并不支持这种方式。

在x86处理器系统中,无论PCI设备访问的存储器空间是否为“不可Cache的”,都需要进行Cache共享一致性操作。这也是PCI总线在x86处理器使用中的一个问题。而PCIe总线通过在数据报文中设置“Snooping”位解决了这个问题,有关PCIe总线Snooping位的内容参见后续内容。

2 PowerPC处理器

在MPC8548处理器中,HOST主桥可以通过PIWARn寄存器[2]的RTT字段和WTT字段预知PCI设备访问的存储器空间是否为可Cache空间。当HOST主桥访问“不可Cache空间时”,可以使用FSB总线的“不进行Cache一致性”的总线事务。

此时PowerPC处理器不会在FSB总线中进行Cache一致性操作,即忽略FSB总线事务的Snoop Phase。PCI设备进行DMA写时,数据将直接进入主存储器,而PCI设备进行DMA读所读取的数据将直接从主存储器获得。与x86处理器相比,PowerPC处理器可以忽略CPU进行总线监听的动作,从而提高了FSB传送效率。

[1] FSB总线定义了许多总线事务,有的FSB总线提供了一个Snoop信号,该信号为1时表示当前FSB的总线事务需要进行Cache共享一致性,为0时不需要进行Cache共享一致性。

[2] 该寄存器在Inbound寄存器组中,详见前五篇介绍。

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

PCI设备向“可Cache的存储器空间”进行读操作的过程相对简单。对于x86处理器或者PowerPC处理器,如果访问的数据在Cache中命中,CPU会通知FSB总线,PCI设备所访问的数据在Cache中。

首先HOST主桥发起存储器读总线事务,并在Request Phase中,提供地址。Snoop Agent在Snoop Phase进行总线监听,并通过HIT#和HITM#信号将监听结果通知给Response Agent。如果Cache行的状态为E时,Response Agent将提供数据,而CPU不必改变Cache行状态。如果Snoop Agent可以直接将数据提供给HOST主桥,无疑数据访问的延时更短,但是采用这种方法无疑会极大的提高Cache Memory系统的设计难度,因此采用这种数据传送方式的处理器[1]并不多。

如果Cache行的状态为M时,Response Agent在Response Phase阶段,要求Snoop Agents将Cache中数据回写到存储器,并将Cache行状态更改为E。Snoop Agents在Data Phase,将Cache中数据回写给存储器控制器,同时为HOST主桥提供数据。Snoop Agents也可以直接将数据提供给HOST主桥,不需要进行数据回写过程,也不更改Cache行状态,但是采用这种方法会提高Cache Memory系统的设计难度。

如果PCI设备访问的数据没有在Cache中命中,Snoop Agents会通知FSB总线,PCI设备所访问的数据不在Cache中,此时存储器控制器(Response Agent)将在Data Phase向HOST主桥提供数据。

PCI设备向“可Cache的”存储器区域进行写操作,无论对于PowerPC处理器还是x86处理器,都较为复杂。当HOST主桥通过FSB将数据发送给存储器控制器时,在这个系统总线上的所有CPU都需要对这个PCI写操作进行监听,并根据监听结果,合理地改动Cache行状态,并将数据写入存储器。

下文以图3-7所示的SMP处理器系统为例,说明PCI设备对“可Cache的存储器空间”进行DMA写的实现过程。

在图3-7所示的处理器系统中,存在4个CPU,这4个CPU通过一条FSB连接在一起,而CPU之间使用MESI协议进行Cache一致性处理,而HOST主桥和存储器控制器与FSB直接相连。HOST主桥向存储器控制器传递数据时,需要处理Cache的一致性。

在这个处理器系统中,当PCI设备,如PCI设备01,进行DMA写操作时,数据将首先到达HOST主桥,而HOST主桥将首先接管该PCI设备数据访问并将其转换为FSB总线事务,并在Request Phase中,提供本次FSB总线事务的地址。CPU将在Snoop Phase对这个地址进行监听,判断当前地址在Cache中的命中情况。

当HOST主桥访问的地址不在Cache中命中时,此时在处理器系统中,所有CPU都没有驱动HIT#和HITM#信号,HIT#和HITM#信号都为1,表示HOST主桥访问的地址没有在CPU的Cache中命中,HOST主桥可以简单地将数据写入存储器。当HOST主桥访问的存储器地址在Cache中命中时,Cache行的状态可以为S、E或者为M,此时处理器系统的处理过程相对较为复杂,下一节将专门讨论这种情况。

[1] 目前Cortex A8/A9和Intel的Nehelem处理器支持这种方式。

PCI设备进行DMA写时发生Cache命中

如果PCI设备访问的地址在某个CPU的Cache行中命中时,可能会出现三种情况。

第一种情况是命中的Cache行其状态为E,即Cache行中的数据与存储器中的数据一致;而第二种情况是命中的Cache行其状态为S。其中E位为1表示该数据在SMP处理器系统中,有且仅有一个CPU的Cache中具有数据副本;而S位为1表示在SMP处理器系统中,该数据至少在两个以上CPU的Cache中具有数据副本。

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

Cache行状态为S时的处理情况与状态为E时的处理情况大同小异,PCI设备在进行写操作时也将数据直接写入主存储器,并使无效状态为S的Cache行。

第三种情况是命中的Cache行其状态为M(Modified),即Cache行中的数据与存储器的数据不一致,Cache行中保存最新的数据拷贝,主存储器中的部分数据无效。对于SMP系统,此时有且仅有一个CPU中的Cache行的状态为M,因为MESI协议规定存储器中的数据不能在多个CPU的Cache行中的状态为M。

我们假定一个处理器的Cache行长度为32B,即256b。当这个Cache行的状态为M时,表示这个Cache行的某个字节、双字、几个双字、或者整个Cache行中的数据比主存储器中含有的数据新。

假设HOST主桥访问的地址,在Snoop Phase,通过CPU进行总线监听后,发现其对应的Cache行状态为M。此时HOST主桥进行存储器写操作时,处理情况较为复杂,此时这些状态为M的数据需要回写到主存储器。

我们考虑如图3-8所示的实例。假定处理器的Cache使用回写(Write-Back)策略进行更新。在这个实例中,HOST主桥对存储器的某个地址进行写操作,而所有CPU通过FSB总线进行总线监听时发现,HOST主桥使用的这个目的地址在某个CPU的Cache行命中,此时这个CPU将置HITM#信号为0,并置HIT#信号为1,表示当前Cache行中含有的数据比存储器中含有的数据更新。

我们假设此时在Cache行中,阴影部分的数据比存储器中的数据新,而其他数据与存储器保持一致,即在这个Cache行中第0~3个双字的数据是当前处理器系统中最新的数据,而第4~7个双字中的数据与存储器保持一致。

如果PCI设备向存储器写的数据区域可以完全覆盖这些阴影部分,如对第0~5个双字进行写操作时,这种情况不难处理。此时CPU只需在总线监听阶段,将这个Cache行使无效,然后将数据写入存储器即可。因为完成这个存储器写操作之后,PCI设备写入的数据是最新的,而且这个最新的数据将完全覆盖在Cache行中阴影部分的数据,所以CPU只需要简单地将这个Cache行使无效即可。

然而PCI设备(HOST主桥)无法预先知道这些Cache行中的数据哪些是有效的,哪些是无效的,而仅知道命中了一个“被修改过”的Cache行,从而PCI设备(HOST主桥)无法保证能够对Cache行中有效数据进行覆盖。因此PCI设备对存储器进行写操作时,不能简单地使无效(Invalid)状态位为M的Cache行。

我们仍然以图3-8为例,考虑一个PCI设备将4个双字(第4~7个双字)的数据写入到一个存储器中,这4个双字所访问的数据在某个CPU的Cache行中命中,而且该Cache行的状态为M,而且这个Cache行的前4个双字曾被处理器修改过。

此时CPU对FSB总线监听时,不能简单将当前Cache行使无效,因为这个使无效操作将丢失阴影部分的有效数据。这个阴影部分中的有效数据并没有被PCI设备重新写入,因此在整个处理器系统中,这个阴影部分仍然包含最新的数据。将最新的数据丢弃显然是一种错误做法,将会导致处理器系统的崩溃。

为此HOST主桥需要专门处理这种情况,不同的HOST主桥采用了不同的方法处理这种情况,但无外乎以下三种方法。

(1) CPU进行总线监听后发现,HOST主桥访问的数据命中了一个状态位为M的Cache行,此时存储器控制器将通知HOST主桥重试或者延时处理,并暂时停止HOST主桥发起的这次存储器写操作。随后CPU将状态位为M的Cache行与存储器进行同步后,再使无效这个Cache行。之后HOST主桥在合适的时机,重新发起被HOST主桥要求重试的总线事务,此时CPU再次进行总线监听时不会再次出现Cache命中的情况,因此HOST主桥可以直接将数据写入存储器。许多HOST主桥使用这种方法处理PCI设备的存储器写总线事务。

(2) 首先HOST主桥将接收PCI设备进行DMA写的数据,并将这些数据放入存储器控制器的一个缓冲区中,同时结束PCI设备的存储器写总线事务。之后CPU进行总线监听,如果CPU发现HOST主桥访问的数据命中了一个状态位为M的Cache行时,则这个Cache行放入存储器控制器的另一个缓冲区后,使无效这个Cache行。最后存储器控制器将这两个缓冲区的数据合并然后统一写入到存储器中。

(3) HOST主桥并不结束当前PCI总线周期,而直接进行总线监听,如果CPU进行总线监听发现HOST主桥访问的数据命中了一个状态位为M的Cache行时,则将这个Cache行整体写入存储器控制器的缓冲区后使无效这个Cache行,之后HOST主桥开始从PCI设备接收数据,并将这些数据直接写入这个缓冲区中。最后HOST主桥结束PCI设备的存储器写总线周期,同时存储器控制器将这个缓冲区内的数据写入存储器。

以上这几种情况是PCI设备进行存储器写时,HOST主桥可能的处理情况,其中第1种方法最常用。而x86处理器使用的implicit writeback方式,与第2种方法基本类似。第3种方法与第2种方法并没有本质不同。

但是如果PCI设备对一个或者多个完整Cache行的存储器区域进行写操作时,上述过程显得多余。对完整Cache行进行写操作,可以保证将Cache行对应的存储器区域完全覆盖,此时Cache行中的数据在PCI设备完成这样的操作后,在处理器系统中将不再是最新的。PCI设备进行这样的存储器写操作时,可以直接将数据写入存储器,同时直接使无效状态为M的Cache行。

PCI总线使用存储器写并无效(Memory Write and Invalidate)总线事务,支持这种对一个完整Cache行进行的存储器写总线事务。PCI设备使用这种总线事务时,必须要事先知道当前处理器系统中CPU使用的Cache行大小,使用这种总线事务时,一次总线事务传递数据的大小必须以Cache行为单位对界。为此PCI设备必须使用配置寄存器Cache Line Size保存当前Cache行的大小,Cache Line Size寄存器在PCI配置空间的位置见图2-9。

存储器读(Memory Read)、存储器多行读(Memory Read Multiple)和存储器单行读(Memory Read Line)总线事务也是PCI总线中的重要总线事务,这些总线事务不仅和Cache有关,还和PCI总线的预读机制有关。

DMA写时发生Cache命中的优化

在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的DMA写过程。如Freescale的I/O Stashing和Intel的IOAT技术。

如图3-8所示,当设备进行存储器写时,如果可以对Cache直接进行写操作时,即便这个存储器写命中了一个状态为M的Cache行,可以不将该Cache行的数据回写到存储器中,而是直接将数据写入Cache,之后该Cache行的状态依然为M。采用这种方法可以有效提高设备对存储器进行写操作的效率。采用直接向Cache行写的方法,PCI设备对存储器写命中一个状态为M的Cache行时,将执行以下操作。

(1) HOST主桥将对存储器的写请求发送到FSB总线上。

(2) CPU通过对FSB监听,发现该写请求在某个Cache行中命中,而且该Cache行的状态为M。

(3) HOST主桥将数据直接写入到Cache行中,并保持Cache行的状态为M。注意此时设备不需要将数据写入存储器中。

从原理上看,这种方法并没有奇特之处,仅需Cache能够提供一个接口,使外部设备能够直接写入即可。但是从具体实现上看,设备直接将数据写入Cache中,还是有相当大的难度。特别是考虑在一个处理器中,可能存在多级Cache,当CPU进行总线监听时,可能是在L1、L2或者L3 Cache中命中,此时的情况较为复杂,多级Cache间的协议状态机远比FSB总线协议复杂的多。

在一个处理器系统中,如果FSB总线事务在“与FSB直接相连的Cache”中命中时,这种情况相对容易处理;但是在与BSB(Back-Side Bus)直接相连的Cache命中时,这种情况较难处理。下文分别对这两种情况进行讨论,在一个处理器中,采用FSB和BSB连接Cache的拓扑如图3-9所示。

当采用FSB总线连接L2 Cache时,L2 Cache直接连接到FSB总线上,设备通过FSB总线向L2 Cache进行写操作并不难实现,MPC8548处理器就是采用了这种结构将L2 Cache直接连接到FSB总线上。

但是由于FSB总线的频率远低于BSB总线频率,因此采用这种结构将影响L2 Cache的访问速度,为此高端处理器多采用BSB总线连接L2 Cache,x86处理器在Pentium Pro之后的高性能处理器都使用BSB总线连接L2 Cache,Freescale的G4系列处理器和最新的P4080处理器也使用BSB总线连接L2 Cache。

当L2 Cache没有直接连接到FSB上时,来自外部设备的数据并不容易到达BSB总线。除了需要考虑Cache连接在BSB总线的情况外,在外部设备进行DMA操作时,还需要考虑多处理器系统的Cache共享一致性协议。设计一个专用通道,将数据从外部设备直接写入到处理器的Cache中并不容易实现。Intel的IOAT和Freescale的I/O Stashing可能使用了这种专用通道技术,直接对L1和L2 Cache进行写操作,并在极大增加了设计复杂度的前提下,提高了处理器系统的整体效率。

以上对Cache进行直接写操作,仅是Intel的IOAT和Freescale的I/O Stashing技术的一个子集。目前Intel和Freescale没有公开这些技术的具体实现细节。在一个处理器系统中,可能存在多级Cache,这些Cache的层次组成结构和状态机模型异常复杂,本章对这些内容不做进一步说明。

PCI Express 系列连载篇(十四)就到这里结束,明天继续带来第十五篇,包括预读机制相关内容。各位大侠,明天见!

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 x86处理器
  • 2 PowerPC处理器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档