tag 标签: pci设备

相关博文
  • 热度 15
    2013-4-27 11:34
    1233 次阅读|
    0 个评论
    在许多高性能处理器中,还提出了一些新的概念,以加速外设到存储器的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的层次组成结构和状态机模型异常复杂,本章对这些内容不做进一步说明。
  • 热度 11
    2013-4-25 11:41
    1681 次阅读|
    0 个评论
    如果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写的效率,这种方式的实现难度较大,第3.3.5节将介绍这种优化方式。 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总线的预读机制有关,本篇在第3.4.5节中重点介绍这些总线事务。
  • 热度 16
    2013-4-25 11:32
    1378 次阅读|
    0 个评论
    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系统的设计难度,因此采用这种数据传送方式的处理器 并不多。 如果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,此时处理器系统的处理过程相对较为复杂,下一节将专门讨论这种情况。 目前Cortex A8/A9和Intel的Nehelem处理器支持这种方式。
  • 热度 18
    2013-4-19 17:45
    1455 次阅读|
    0 个评论
    PCI设备对可Cache的存储器空间进行DMA读写的操作的过程较为复杂,有关Cache一致性的话题可以独立成书。而不同的处理器系统使用的Cache Memory的层次结构和访问机制有较大的差异,这部分内容也是现代处理器系统设计的重中之重。 本节仅介绍在Cache Memory系统中与PCI设备进行DMA操作相关的,一些最为基础的概念。在多数处理器系统中,使用了以下概念描述Cache一致性的实现过程。 1 Cache一致性协议 多数SMP处理器系统使用了MESI协议处理多个处理器之间的Cache一致性。该协议也被称为Illinois protocol,MESI协议在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行。 MESI协议还存在一些变种,如MOESI协议和MESIF协议。基于MOESI协议的Cache一致性模型如图3‑5所示,该模型基于AMD处理器使用的MOESI协议。不同的处理器在实现MOESI协议时,状态机的转换原理类似,但是在处理上仍有细微区别。 MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。 O位。O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中一定具有该Cache行的副本,其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与存储器中的数据并不一致。 S位。在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不一定与存储器一致。如果在其他CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;如果在其他CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。 在一个处理器系统中,主设备(CPU或者外部设备)进行存储器访问时,将试图从存储器系统(主存储器或者其他CPU的Cache)中获得最新的数据拷贝。如果该主设备访问的数据没有在本地命中时,将从其他CPU的Cache中获取数据,如果这些数据仍然没有在其他CPU的Cache中命中,主存储器将提供数据。外设设备进行存储器访问时,也需要进行Cache共享一致性。 在MOESI模型中,“Probe Read”表示主设备从其他CPU中获取数据拷贝的目的是为了读取数据;而“Probe Write”表示主设备从其他CPU中获取数据拷贝的目的是为了写入数据;“Read Hit”和“Write Hit”表示主设备在本地Cache中获得数据副本;“Read Miss”和“Write Miss”表示主设备没有在本地Cache中获得数据副本;“Probe Read Hit”和“Probe Write Hit”表示主设备在其他CPU的Cache中获得数据副本。 本节为简便起见,仅介绍CPU进行存储器写和与O状态相关的Cache行状态迁移,CPU进行存储器读的情况相对较为简单,请读者自行分析这个过程。 当CPU对一段存储器进行写操作时,如果这些数据在本地Cache中命中时,其状态可能为E、S、M或者O。 状态为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 A将从本地申请一个Cache行,将数据写入,并该Cache行状态更新为M。 Cache行状态为O时,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。 当CPU读取的数据在本地Cache中命中,而且Cache行状态为O时,数据将从本地Cache获得,并不会改变Cache行状态。如果CPU A读取的数据在其他Cache中命中,如在CPU B的Cache中命中而且其状态为O时,CPU B将该Cache行状态保持为O,同时CPU B将数据传送给CPU A新申请的Cache行中,而且CPU A的Cache行状态将被更改为S。 在某些应用场合,使用MOESI协议将极大提高Cache的利用率,因为该协议引入了O状态,从而在发送Read Hit的情况时,不必将状态为M的Cache回写到主存储器,而是直接从一个CPU的Cache将数据传递到另外一个CPU。目前MOESI协议在AMD和RMI公司的处理器中得到了广泛的应用。 Intel提出了另外一种MESI协议的变种,即MESIF协议,该协议与MOESI协议有较大的不同,也远比MOESI协议复杂,该协议由Intel的QPI(QuickPath Interconnect)技术引入,其主要目的是解决“基于点到点的全互连处理器系统”的Cache共享一致性问题,而不是“基于共享总线的处理器系统”的Cache共享一致性问题。 在基于点到点互连的NUMA(Non-Uniform Memroy Architecture)处理器系统中,包含多个子处理器系统,这些子处理器系统由多个CPU组成。如果这个处理器系统需要进行全机Cache共享一致性,该处理器系统也被称为ccNUMA(Cache Cohenrent NUMA)处理器系统。MESIF协议主要解决ccNUMA处理器结构的Cache共享一致性问题,这种结构通常使用目录表,而不使用总线监听处理Cache的共享一致性。 MESIF协议引入了一个F(Forware)状态。在ccNUMA处理器系统中,可能在多个处理器的Cache中存在相同的数据副本,在这些数据副本中,只有一个Cache行的状态为F,其他Cache行的状态都为S。Cache行的状态位为F时,Cache中的数据与存储器一致。 当一个数据请求方读取这个数据副本时,只有状态为F的Cache行,可以将数据副本转发给数据请求方,而状态位为S的Cache不能转发数据副本。从而MESIF协议有效解决了在ccNUMA处理器结构中,所有状态位为S的Cache同时转发数据副本给数据请求方,而造成的数据拥塞。 在ccNUMA处理器系统中,如果状态位为F的数据副本,被其他CPU拷贝时,F状态位将会被迁移,新建的数据副本的状态位将为F,而老的数据副本的状态位将改变为S。当状态位为F的Cache行被改写后,ccNUMA处理器系统需要首先Invalidate状态位为S其他的Cache行,之后将Cache行的状态更新为M。 独立地研究MESIF协议并没有太大意义,该协议由Boxboro-EX处理器系统 引入,目前Intel并没有公开Boxboro-EX处理器系统的详细设计文档。MESIF协议仅是解决该处理器系统中Cache一致性的一个功能,该功能的详细实现与QPI的Protocal Layer相关,QPI由多个层次组成,而Protocal Layer是QPI的最高层。 对MESIF协议QPI互连技术有兴趣的读者,可以在深入理解“基于目录表的Cache一致性协议”的基础上,阅读Robert A. Maddox, Gurbir Singh and Robert J. Safranek合著的书籍“Weaving High Performance Multiprocessor Fabric”以了解该协议的实现过程和与QPI互连技术相关的背景知识。 值得注意的是,MESIF协议解决主要的问题是ccNUMA架构中SMP子系统与SMP子系统之间Cache一致性。而在SMP处理器系统中,依然需要使用传统的MESI协议。Nehelem EX处理器也可以使用MOESI协议进一步优化SMP系统使用的Cache一致性协议,但是并没有使用该协议。 为简化起见,本章假设处理器系统使用MESI协议进行Cache共享一致性,而不是MOESI协议或者MESIF协议。 2 HIT#和HITM#信号 在SMP处理器系统中,每一个CPU都使用HIT#和HITM#信号反映HOST主桥访问的地址是否在各自的Cache中命中。当HOST主桥访问存储器时,CPU将驱动HITM#和HIT#信号,其描述如表3‑1所示。 表 3‑1 HITM#和HIT#信号的含义 HITM# HIT# 描述 1 1 表示HOST主桥访问的地址没有在CPU的Cache中命中。 1 0 表示HOST主桥访问的地址在CPU的Cache中命中,而且Cache的状态为S(Shared)或者E(Exclusive),即Cache中的数据与存储器的数据一致。 0 1 表示HOST主桥访问的地址在CPU的Cache中命中,而且Cache的状态为M(Modified),即Cache中的数据与存储器的数据不一致,在Cache中保存最新的数据拷贝。 0 0 MESI协议规定这种情况不允许出现,但是在有些处理器系统中仍然使用了这种状态,表示暂时没有获得是否在Cache命中的信息,需要等待几拍后重试。 HIT#和HITM#信号是FSB中非常重要的两个信号,各个CPU的HIT#和HITM#信号通过“线与方式”直接相连 。而在一个实际FSB中,还包括许多信号,本节并不会详细介绍这些信号。 3 Cache一致性协议中使用的Agent 在处理器系统中,与Cache一致性相关的Agent如下所示。 Request Agent。FSB总线事务的发起设备。在本节中,Request Agent特指HOST主桥。实际上在FSB总线上的其他设备也可以成为Request Agent,但这些Request Agent并不是本节的研究重点。Request Agent需要进行总线仲裁后,才能使用FSB,在多数处理器的FSB中,需要对地址总线与数据总线分别进行仲裁。 Snoop Agents。FSB总线事务的监听设备。Snoop Agents为CPU,在一个SMP处理器系统中,有多个CPU共享同一个FSB,此时这些CPU都是这条FSB上的Snoop Agents。Snoop Agents监听FSB上的存储器读写事务,并判断这些总线事务访问的地址是否在Cache中命中。Snoop Agents通过HIT#和HITM#信号向FSB通知Cache命中的结果。在某些情况下,Snoop Agents需要将Cache中的数据回写到存储器,同时为Request Agent提供数据。 Response Agent。FSB总线事务的目标设备。在本节中,Response Agent特指存储器控制器。Response Agent根据Snoop Agents提供的监听结果,决定如何接收数据或者向Request Agent设备提供数据。在多数情况下,当前数据访问没有在Snoop Agents中命中时,Response Agent需要提供数据,此外Snoop Agents有时需要将数据回写到Response Agent中。 4 FSB的总线事务 一个FSB的总线事务由多个阶段组成,包括Request Phase、Snoop Phase、Response Phase和Data Phase。目前在多数高端处理器中,FSB支持流水操作,即在同一个时间段内,不同的阶段可以重叠,如图3‑6所示。 在一个实际的FSB中,一个总线事务还可能包含Arbitration Phase和Error Phase。而本节仅讲述图3‑6中所示的4个基本阶段。 Request Phase。Request Agent在获得FSB的地址总线的使用权后,在该阶段将访问数据区域的地址和总线事务类型发送到FSB上。 Snoop Phase。Snoop Agents根据访问数据区域在Cache中的命中情况,使用HIT#和HITM#信号,向其他Agents通知Cache一致性的结果。有时Snoop Agent需要将数据回写到存储器。 Reponse Phase。Response Agent根据Request和Snoop Phase提供的信号,可以要求Request Agent重试(Retry),或者Response Agent延时处理(Defer)当前总线事务。在FSB总线事务的各个阶段中,该步骤的处理过程最为复杂。本章将在下文结合PCI设备的DMA读写执行过程,说明该阶段的实现原理。 Data Phase。一些不传递数据的FSB总线事务不包含该阶段。该阶段用来进行数据传递,包括Request Agent向Response Agent写入数据;Response Agent为Request Agent提供数据;和Snoop Agent将数据回写到Response Agent。 下文将使用本小节中的概念,描述在PCI总线中,与Cache相关的总线事务,并讲述相关的FSB的操作流程。 Boxboro-EX处理器系统由多个Nehalem EX处理器组成,而Nehalem EX处理器由两个SMP处理器系统组成,一个SMP处理器系统由4个CPU组成,而每一个CPU具有2个线程。其中SMP处理器系统之间使用QPI进行连接,而在一个SMP处理器内部的各个CPU仍然使用FSB连接。 HIT#和HITM#信号是Open Drain(开漏)信号,Open Drain信号可以直接相连,而不用使用逻辑门。
  • 热度 20
    2013-4-17 13:55
    1121 次阅读|
    0 个评论
    PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使能DEVSEL#信号,认领这个总线事务。 如果PCI总线上的所有设备都不能通过地址译码,认领这个总线事务时,这条总线的“负向译码”设备将认领这个总线事务,如果在这条PCI总线上没有“负向译码”设备,该总线事务的发起者将使用Master Abort总线周期结束当前PCI总线事务。 3.2.1 PCI 设备的正向译码与负向译码 如上文所示PCI设备使用“地址译码”方式接收存储器读写总线请求。在PCI总线中定义了两种“地址译码”方式,一个是正向译码,一个是负向译码。 我们仍以图3‑2所示的处理器系统为例,说明数据传送使用的寻址方法。当HOST主桥通过存储器或者I/O读写总线事务访问其下所有PCI设备时,PCI总线0下的所有PCI设备都将对出现在地址周期中的PCI总线地址进行译码。如果这个地址在某个PCI设备的BAR空间中命中时,这个PCI设备将接收这个PCI总线请求。这个过程也被称为PCI总线的正向译码,这种方式也是大多数PCI设备所采用的译码方式。 但是在PCI总线上的某些设备,如PCI-to-(E)ISA桥并不使用正向译码接收来自PCI总线的请求,PCI-to-ISA桥在处理器系统中的位置如图1‑1所示。PCI总线0上的总线事务在三个时钟周期后,没有得到任何PCI设备响应时(即总线请求的PCI总线地址不在这些设备的BAR空间中),PCI-to-ISA桥将被动地接收这个数据请求。这个过程被称为PCI总线的负向译码。可以进行负向译码的设备也被称为负向译码设备。 在PCI总线中,除了PCI-to-(E)ISA桥可以作为负向译码设备,PCI桥也可以作为负向译码设备,但是PCI桥并不是在任何时候都可以作为负向译码设备。在绝大多数情况下,PCI桥无论是处理“来自上游总线”,还是处理“来自下游总线”的总线事务时,都使用正向译码方式,但是在某些特殊应用中,PCI桥也可以作为负向译码设备。 如笔记本在连接Dock插座时,也使用了PCI桥。因为在大多数情况下,笔记本与Dock插座是分离使用的,而且Dock插座上连接的设备多为慢速设备,此时用于连接Dock插座的PCI桥使用负向译码。Dock插座在笔记本系统中的位置如图3‑3所示。 当笔记本与Dock建立连接之后,如果处理器需要访问Dock中的外部设备时,Dock中的PCI桥将首先使用负向译码方式接收PCI总线事务,之后将这个PCI总线事务转发到Dock的PCI总线中,然后再访问相应的PCI设备。 在Dock中使用负向译码PCI桥的优点是,该桥管理的设备并不参与处理器系统对PCI总线的枚举过程。当笔记本插入到Dock之后,系统软件并不需要重新枚举Dock中的设备并为这些设备分配系统资源,而仅需要使用负向译码PCI桥管理好其下的设备即可,从而极大降低了Dock对系统软件的影响。 当HOST处理器访问Dock中的设备时,负向译码PCI桥,将首先接管这些存储器读写总线事务,然后发送到Dock设备中。值得注意的是,在许多笔记本的Dock实现中,并没有使用负向译码PCI桥,而使用PCI-to-ISA桥。 PCI总线规定使用负向译码的PCI桥,其Base Class Code寄存器为0x06,Sub Class Code寄存器为0x04,而Interface寄存器为0x01;使用正向译码方式的PCI桥的Interface寄存器为0x00。系统软件(E2PROM)在初始化Interface寄存器时务必注意这个细节。 综上所述,在PCI总线中有两种负向译码设备,PCI-to-E(ISA)桥和PCI桥。但是PCI桥并不是在任何时候都是负向译码设备,只有PCI桥连接Dock插座时,PCI桥的Primary Bus才使用负向译码方式。而这个PCI桥的Secondary Bus在接收Dock设备的请求时仍然使用正向译码方式。 PCI桥使用的正向译码方式与PCI设备使用的正向译码方式有所不同。如图3‑4所示,当一个总线事务是从PCI桥的Primary Bus到Secondary Bus时,PCI桥使用的正向译码方式与PCI设备使用的方式类似。如果该总线事务使用的地址在PCI桥任意一个Memory Base窗口 命中时,该PCI桥将使用正向译码方式接收该总线事务,并根据实际情况决定是否将这个总线事务转发到Secondary Bus。 当一个总线事务是从PCI桥的Secondary Bus到Primary Bus时,如果该总线事务使用的地址没有在PCI桥所有的Memory Base窗口命中时,表明当前总线事务不是访问该PCI桥管理的PCI子树中的设备,因此PCI桥将接收当前总线事务,并根据实际情况决定是否将这个总线事务转发到Primary Bus。 以图3‑2为例,当PCI设备11访问主存储器空间时,首先将存储器读写总线事务发送到PCI总线1上,而这个存储器地址显然不会在PCI总线1的任何PCI设备的BAR空间中,此时PCI桥1将认领这个PCI总线的数据请求,并将这个总线事务转发到PCI总线0上。最后HOST主桥将接收这个总线事务,并将PCI总线地址转换为存储器域的地址,与主存储器进行读写操作。 值得注意的是,PCI总线并没有规定HOST主桥使用正向还是负向译码方式接收这个存储器读写总线事务,但是绝大多数HOST主桥使用正向译码方式接收来自下游的存储器读写总线事务。在PowerPC处理器中,如果当前存储器读写总线事务使用的地址在Inbound窗口内时,HOST主桥将接收这个总线事务,并将其转换为存储器域的读写总线事务,与主存储器进行数据交换。 3.3.2 处理器到PCI设备的数据传送 下文以图3‑2所示的处理器系统为例,说明处理器向PCI设备11进行存储器写的数据传送过程。处理器向PCI设备进行读过程与写过程略有区别,因为存储器写使用Posted方式,而存储器读使用Non-Posted方式,但是存储器读使用的地址译码方式与存储器写类似,因此本节对处理器向PCI设备进行存储器读的过程不做进一步介绍。 PCI设备11在PCI总线域的地址范围是0x7300-0000~0x73FF-FFFF。这段空间在存储器域中对应的地址范围是0xF300-0000~0xF3FF-FFFF。下文我们假设处理器使用存储器写指令,访问0xF300-0008这个存储器地址,其步骤如下。 (1) 存储器域将0xF300-0008这个地址发向HOST主桥,0xF000-0000~0xF7FF-FFFF这段地址已经由HOST主桥映射到PCI总线域地址空间,所以HOST主桥认为这是一个对PCI设备的访问。因此HOST主桥将首先接管这个存储器写请求。 (2) HOST主桥将存储器域的地址0xF300-0008转换为PCI总线域的地址0x7300-0008,并通过总线仲裁获得PCI总线0的使用权,启动PCI存储器写周期,并将这个存储器写总线事务发送到PCI总线0上。值得注意的是,这个存储器读写总线事务使用的地址为0x7300-0008,而不是0xF300-0008。 (3) PCI总线0的PCI桥1发现0x7300-0008在自己管理的地址范围内,于是接管这个存储器写请求,并通过总线仲裁逻辑获得PCI总线1的使用权,并将这个请求转发到PCI总线1上。 (4) PCI总线1的PCI设备11发现0x7300-0008在自己的BAR0寄存器中命中,于是接收这个PCI写请求,并完成存储器写总线事务。 3.2.3 PCI设备的DMA操作 下文以图3‑2所示的处理器系统为例,说明PCI设备11向存储器进行DMA写的数据传送过程。PCI设备的DMA写使用Posted方式而DMA读使用Non-Posted方式。本节不介绍PCI设备进行DMA读的过程,而将这部分内容留给读者分析。 假定PCI设备11需要将一组数据,发送到0x1000-0000~0x1000-FFFF这段存储器域的地址空间中。由上文所述,存储器域的0x0000-0000~0x7FFF-FFFF这段存储器空间与PCI总线域的0x8000-0000~0xFFFF-FFFF这段PCI总线地址空间对应。 PCI设备11并不能直接操作0x1000-0000~0x1000-FFFF这段存储器域的地址空间,PCI设备11需要对PCI总线域的地址空间0x9000-0000~0x9000-FFFF进行写操作,因为PCI总线地址空间0x9000-0000~0x9000-FFFF已经被HOST主桥映射到0x1000-0000~0x1000-FFFF这段存储器域。这个DMA写具体的操作流程如下。 (1) 首先PCI设备11通过总线仲裁逻辑获得PCI总线1的使用权,之后将存储器写总线事务发送到PCI总线1上。值得注意的是,这个存储器写总线事务的目的地址是PCI总线域的地址空间0x9000-0000~0x9000-FFFF,这个地址是主存储器在PCI总线域的地址映像。 (2) PCI总线1上的设备将进行地址译码,确定这个写请求是不是发送到自己的BAR空间,在PCI总线1上的设备除了PCI设备11之外,还有PCI桥2和PCI桥1。 (3) 首先PCI桥1、2和PCI设备11对这个地址同时进行正向译码。PCI桥1发现这个PCI地址并不在自己管理的PCI总线地址范围之内,因为PCI桥片1所管理的PCI总线地址空间为0x7000-0000~0x73FF-FFFF。此时PCI桥1将接收这个存储器写总线事务,因为PCI桥1所管理的PCI总线地址范围并不包含当前存储器写总线事务的地址,所以其下所有PCI设备都不可能接收这个存储器写总线事务。 (4) PCI桥1发现自己并不能处理当前这个存储器写总线事务,则将这个存储器写总线事务转发到上游总线。PCI桥1首先通过总线仲裁逻辑获得PCI总线0的使用权后,然后将这个总线事务转发到PCI总线0。 (5) HOST主桥发现0x9000-0000~0x9000-FFFF这段PCI总线地址空间与存储器域的存储器地址空间0x1000-0000~0x1000-FFFF对应,于是将这段PCI总线地址空间转换成为存储器域的存储器地址空间,并完成对这段存储器的写操作。 (6) 存储器控制器将从HOST主桥接收数据,并将其写入到主存储器。 PCI设备间的数据传递与PCI设备到存储器的数据传送大体类似。我们以PCI设备11将数据传递到PCI设备42为例说明这个转递过程。我们假定PCI设备11将一组数据发送到PCI设备42的PCI总线地址0x7500-0000~0x7500-FFFF这段地址空间中。这个过程与PCI设备11将数据发送到存储器的第1~5步基本类似,只是第5、6步不同。PCI设备11将数据发送到PCI设备42的第5、6步如下所示。 (1) PCI总线0发现其下的设备PCI桥4能够处理来自PCI总线0的数据请求,则PCI桥4将接管这个PCI写请求,并通过总线仲裁逻辑获得PCI总线4的使用权,之后将这个存储器写请求发向PCI总线4。此时HOST主桥不会接收当前存储器写总线事务,因为0x7500-0000~0x7500-FFFF这段地址空间并不是HOST主桥管理的地址范围。 (2) PCI总线4的PCI设备42将接收这个存储器写请求,并完成这个PCI存储器写请求总线事务。 PCI总线树内的数据传送始终都在PCI总线域中进行,因此不存在不同域之间的地址转换,因此PCI设备11向PCI设备42进行数据传递时,并不会进行PCI总线地址空间到存储器地址空间的转换。 3.2.4 PCI桥的Combining、Merging和Collapsing 由上文所述,PCI设备间的数据传递有时将通过PCI桥。在某些情况下,PCI桥可以合并一些数据传递,以提高数据传递的效率。PCI桥可以采用Combining、Merging和Collapsing三种方式,优化数据通过PCI桥的效率。 1 Combining PCI桥可以将接收到的多个存储器写总线事务合并为一个突发存储器写总线事务。PCI桥进行这种Combining操作时需要注意数据传送的“顺序”。当PCI桥接收到一组物理地址连续的存储器写访问时,如对PCI设备的某段空间的DW1、2和4进行存储器写访问时,PCI桥可以将这组访问转化为一个对DW1~4的突发存储器写访问,并使用字节使能信号C/BE #进行控制,其过程如下所示。 PCI桥将在数据周期1中,置C/BE #信号为有效表示传递数据DW1;在数据周期2中,置C/BE #信号为有效表示传递数据DW2;在数据周期3中,置C/BE #信号为无效表示在这个周期中所传递的数据无效,从而跳过DW3;并在数据周期4中,置C/BE #信号为有效表示传递数据DW4。 目标设备将最终按照发送端的顺序,接收DW1、DW2和DW4,采用这种方法在不改变传送序的前提下,提高了数据的传送效率。值得注意的是,有些HOST主桥也提供这种Combining方式,合并多次数据访问。如果目标设备不支持突发传送方式,该设备可以使用Disconnect周期,终止突发传送,此时PCI桥/HOST主桥可以使用多个存储器写总线事务分别传送DW1、DW2和DW4,而不会影响数据传送。 如果PCI桥收到“乱序”的存储器写访问,如对PCI设备的某段空间的DW4、3和1进行存储器写访问时,PCI桥不能将这组访问转化为一个对DW1~4的突发存储器写访问,此时PCI桥必须使用三个存储器写总线事务转发这些存储器写访问。 2 Merge PCI桥可以将收到的多个对同一个DW地址的Byte、Word进行的存储器写总线事务,合并为一个对这个DW地址的存储器写总线事务。PCI规范并没有要求这些对Byte、Word进行的存储器写在一个DW的边界之内,但是建议PCI桥仅处理这种情况。本节也仅介绍在这种情况下,PCI桥的处理过程。 PCI规范允许PCI桥进行Merge操作的存储器区域必须是可预读的,而可预读的存储器区域必须支持这种Merge操作。Merge操作可以不考虑访问顺序,可以将对Byte0、Byte1、Byte3的存储器访问合并为一个DW,也可以将对Byte3、Byte1、Byte0的存储器访问合并为一个DW。在这种情况下,PCI总线事务仅需屏蔽与Byte2相关的字节使能信号C/BE2#即可。 如果PCI设备对Byte1进行存储器写、然后再对Byte1、Byte2、Byte3进行存储器写时,PCI桥不能将这两组存储器写合并为一次对DW进行存储器写操作。但是PCI桥可以合并后一组存储器写,即首先对Byte1进行存储器写,然后合并后一组存储器写(Byte1、Byte2和Byte3)为一个DW写,并屏蔽相应的C/BE0#信号。Combining与Merge操作之间没有直接联系,PCI桥可以同时支持这两种方式,也可以支持任何一种方式。 3 Collapsing Collapsing指PCI桥可以将对同一个地址进行的Byte、Word和DW存储器写总线事务合并为一个存储器写操作。使用PCI桥的Collapsing方式是,具有某些条件限制,在多数情况下,PCI桥不能使用Collapsing方式合并多个存储器写总线事务。 当PCI桥收到一个对“DW地址X”的Byte3进行的存储器写总线事务,之后又收到一个对“DW地址X”的Byte、Word或者DW存储器写总线事务时,而且后一个对DW地址X进行的存储器写仍然包含Byte3时,如果PCI桥支持Collapsing方式,就可以将这两个存储器写合并为一个存储器写。 PCI桥在绝大多数情况下不能支持这种方式,因为很少有PCI设备支持这种数据合并方式。通常情况下,对PCI设备的同一地址的两次写操作代表不同的含义,因此PCI桥不能使用Collapsing方式将这两次写操作合并。PCI规范仅是提出了Collapsing方式的概念,几乎没有PCI桥支持这种数据合并方式。 PCI桥除了具有Memory Base窗口外,还有I/O Base窗口和Prefetchable Memory Base窗口。
相关资源