原创 双机通信在CPCI总线上的实现

2009-9-19 20:48 1341 4 4 分类: MCU/ 嵌入式
作者:    时间:2007-06-28    来源: 
 
       摘 要:介绍了pcibridge的工作原理,基于地址映射机制提出了sbc(singleboardcomputer)间直接内存访问的新方案。该方案可将板间通信效率提高6倍以上,并可服务于各种高层应用。

关键词:cpci总线地址映射pcibridge单板计算机性能优化

  在电信、电力、国防等应用领域中,经常要求其所用设备有极高的实时性。当需要在各个设备间进行大容量的信息交换时,传统的网络包交换模式已不能很好地满足实时性的要求。而借助于cpci总线,两个设备可以互访对方的内存,具有传输速度快、传输容量大和高可靠性等特点,非常适合大容量的信息传递。国家数字交换系统工程技术研究中心承担的国家863计划项目——“中国第三代移动通信系统”cdma2000系统集成就选择基于cpci总线的多sbc平台。各个sbc间的通信效率直接决定了整个系统性能的高低。目前常用的实时操作系统如vxworks、lynx等,都针对cpci总线实现了消息队列,可用于sbc间的消息通信。但vxworks、lynx中消息传递的实现方式很不灵活,一般是通过在一个特定的sbc(通常为systemboard)中开启一块共享内存,其他各个sbc(通常为nonsystemboard)通过对共享内存的读写交换信息;每完成一次两个nonsystemsbc间的信息交换,都要进行一次pci读写操作,效率不高。另外vxworks、lynx中的消息长度都有一个最大值,当要进行大数据量(如1gb的内存数据库)的信息传输时,操作系统提供消息传递机制也无能为力。而以上这些问题,都可以通过任意两个sbc间的直接内存访问得到解决。本文首先介绍了pcibridge的工作原理;然后以motorola公司提供的cpx8000系列工控机为例,讨论了两个sbc是如何基于背板(backplane)上的cpci总线,并利用pcibridge的地址映射机制,通过互访内存的方式最终实现双机通信;最后介绍了实际应用时应注意的性能优化问题。

1pcibridge的工作原理

  在简单的计算机系统中,其拥有的外部设备较少,单级总线结构便能满足系统的需要。但是由于单个pci总线可支持的pci设备数量有电气限制,对拥有大量外设的计算机系统而言,单级总线结构已不能满足系统的要求,因此便产生了桥接设备。通过pci-to-pcibridge可扩展出新的pci总线,通过pci-to-isabridge可扩展出isa总线。借助pcibridge这些特殊的pci设备,系统中各级总线被粘和在一起,使整个系统成为一个有机整体。

  每个pci设备都有自己的pcii/o空间、pci内存空间和pci配置空间(configurationspace)。pci设备的设备驱动程序对pci配置空间进行初始化设置后,各个智能控制器如cpu、dma控制器等,可以对pci设备的pcii/o空间、pci内存空间进行访问。在图1中,cpu若要访问网卡,首先会在pcibus0上生成一个物理地址,这个地址经pci-to-pcibridge的过滤及转换后,在pcibus1上产生一pcibus地址,网卡通过地址译码,响应对这个地址的访问。

2007062717011_72953.gif

图1基于pci的系统

  从这个过程可以了解到,pci-to-pcibridge有两种基本的功能:
  (1)地址映射功能。虽然同是对网卡进行访问,但pcibus0与pcibus1上的地址意义是不同的。两个地址分属各自的地址空间,通过pci-to-pcibridge实现两个地址的映射。根据这两个地址是否相同,可将pci-to-pcibridge区分为两种类型:
  ·pci-to-pcitransparentbridge。pcibridge不对pcibus0上的地址进行转换,直接将其映射到pcibus1上。pcibus0与pcibus1上的地址是相同的。
  ·pci-to-pcinontransparentbridge。pcibus0上的地址必须经过pcibridge的转换,才能映射到pcibus1上。pcibus0与pcibus1上的地址是不同的。
  (2)地址过滤功能。pcibridge在把pcibus0上的地址向下游总线(isabus、pcibus1)传递时,具有选择性。在图1中,cpu在pcibus0上所产生的地址,只有对scsi和
  ethernet的访问,pci-to-pcibridge才予以接收;而对于pcibus0的其他地址,pci-to-pcibridge均不予响应。每一个pcibridge所响应的地址范围,可形象地称其为此pcibridge的地址窗口,只有当上游总线的地址落进pcibridge的地址窗口中,pcibridge才响应此地址并向下游总线传递。

2双机通信的具体实现

  本节以motorola公司提供的cpx8000系列工控机为例,介绍了如何通过cpci总线实现双机间的通信。如图2所示,两个sbc通过背板上的cpci总线实现了物理上的连接。如果两个sbc能够互相访问对方的内存,就可实现两者间的数据交流。以系统处理机板(systemprocessorboard,又称主机板)访问非系统处理机板(non-systemprocessorboard,又称子机板)内存为例,介绍双机通信的具体实现。本方案已在lynx及vxworks实时操作系统上实现。

  在图2中,主机板cpu若要访问子机板中的1mb内存单元,必须将这块内存映射到主机板cpu的虚拟地址空间中,可以通过对主机板、子机板、主机板与子机板的接口配置来达到目的。此1mb的内存单元可被映射到不同的地址空间(如cpu虚拟地址空间、物理地址空间、本地pci地址空间、系统cpci地址空间等),映射地址也各不相同。在图2中,对于此1mb内存的起始单元在不同地址空间中的映射地址,分别用符号a1、a2、…a7表示。

2007062717011_96612.gif
图2数据通信原理图

2.1子机板的配置
  (1)调用内核内存分配函数申请1mb的内核虚拟地址空间,得到申请空间的开始地址a7。
  (2)根据操作系统的内存映射关系,得到虚拟地址a7的物理映射地址a6。
  (3)ravenasic是一个host-to-pcibridge,因为processorbus不是一个标准总线,所以通过raven将其转换为pci总线,以挂接各类pci设备。cpu和raven一起构成了一组套片(chipset),配合使用。根据raven的设置,获得物理地址a6在localpcibus的映射地址a5。
  (4)21554是一pci-to-pcinontransparentbridge,并可进行双向数据传递。通过其内部的两个配置寄存器,将其地址窗口的大小设为1mb;地址窗口的起始地址在localpcibus端设为a5。

2.2主机板的配置
  (1)申请大小1mb的内核虚拟地址空间,得到其开始地址a1。
  (2)根据操作系统的内存映射关系,得到虚拟地址a1的物理映射地址a2。
  (3)根据raven的设置,得到物理地址a2在localpcibus上的映射地址a3。
  (4)21154是一pci-to-pcitransparentbridge,它也可以在两个方向上进行数据访问。设置其内部的两个配置寄存器,将其地址窗口的大小设为1mb;地址窗口的起始地址设置为a3。由于21154的透明性,地址a3与其在systemcpcibus端的映射地址a4的值是相同的。

2.3主机板与子机板的接口配置
  在主机板端对子机板进行配置,设置21554的配置寄存器,将其在systemcpcibus端的地址窗口开始地址设为a4。由于在localpcibus端的地址窗口起始地址已设为a5,所以将地址a4映射到了地址a5。可以看到,由于21554的非透明性,使主机板与子机板的地址空间相互隔离,各自可独立分配,并在systemcpcibus级实现了对接。在主机板cpu看来,整个子机板与主机板网卡一样,都是挂在主机板localpcibus下的一个外设。对子机板的访问与对主机板网卡的访问方式是一样的,没有什么不同。

2.4地址转换流程
  当所有的配置完成后,主机板cpu只对地址a1进行读写操作,便可实现对子机板1mb内存起始单元的访问;对1mb内存中其他单元的访问,只要将地址a1加上相应的偏移量即可。通过下面的地址转换流程,可以清楚地看到各级地址是如何通过一级级映射,最终命中指定单元的。

  主机板cpu给出虚拟内存访问地址a1→主机板物理地址a2→主机板localpcibus地址a3→systemcpcibus地址a4→子机板localpcibus地址a5→子机板物理地址a6→经falconmemorycontroller译码后,选中所申请的1mb内存的起始单元。
  从上述介绍可以看出,要想实现双机的内存互访,关键是要进行正确的地址映射。当要实现多个sbc间的相互访问时,地址的映射会更复杂,需要对操作系统的地址空间分配、各个sbc的pci-to-pcibridge设置、systemcpcibus地址空间分配等进行通盘考虑。

2007062717011_43251.gif
图3在两sbc间进行读操作时的时间图

2007062717011_79946.gif
图4在两sbc间进行写操作时的时间图

3性能优化

  图3、图4是用vmetro的总线分析仪截获的数据。分别是在两个sbc间进行读写访问时,连续进行100byte传输的时间图。

  从图3可以看出,每进行一次4byte的读操作,要花费956.8+4×149.5+179.4=1734.2ns,这相当于1734.2ns/29.9ns=58pciclockcycles。

  从图4可以看到,第一个4byte的写操作花费了159.5ns,接着是两次猝发传送,随后一个4byte写操作花费了119.6ns。进行一次4byte的写操作平均花费(159.5ns+2×29.9ns+119.6ns)/(4×29.9ns)=11pciclockcycles。

  对比读写两种访问方式可以看出,写操作比读操作的效率要高得多。这主要有以下一些原因:
  (1)当pci上的一个主设备发起对一个目标设备的访问时,读和写操作的完成时间差别很大。目前的pci设备中一般都有一个用于存储器写的转发(post)缓冲器。若要进行写操作(如图2中主机板对子机板的写操作),主设备只需将其写缓冲区数据复制到目标设备的转发缓冲器中,便认为操作完成。例如在图2中,主机板的raven只要将数据发给21154,便认为写操作完成,后续的数据传输由21154驱动完成。可以看到,写操作在目的总线上(子机板的processbus)完成之前可以先在源总线上(主机板的localpcibus)完成,实际上是寄存器对寄存器的操作。而要实现一个读操作,则必须经过存储器本身的访问和各级pci接口的逻辑延迟才可完成。与写操作相比,读操作在源总线上完成之前必须先在目的总线上完成,这导致了读操作的效率很低。

  (2)从图3、图4中可以看到,pci设备还可进行写操作的猝发操作,但读操作则无法进行。这是由于猝发操作只有在前一事务是写事务时才能实现。猝发传送取消了frame#、ad、c/be#、irdy#、trdy#、devsel#等总线信号的周转周期,实现了每一个pciclockcycle进行一次数据传送。

  (3)猝发传送操作不可能无限制地进行下去。连续进行猝发传送的次数与转发缓冲器的大小、latencytimer的取值、总线的繁忙状况都有关系。

  由于以上原因,在两个sbc间进行数据传送时,应该采用如下方式:
  (1)提供数据的sbc应将数据直接写到消费数据的sbc内存中;而不是提供者将数据放在本地内存,再由消费者经过pci读操作来实现。也就是说,总是进行pci写操作。

  (2)当需要在多个sbc间进行数据互传时,要合理地设置latencytimer的取值,以使各sbc公平使用pci总线资源。

  考虑两个子机板间的通信实现。若采用操作系统提供的消息传递机制,数据提供者必须先将数据写到主机板,数据消费者再从主机板读取数据。对一个4byte的数据传输来说,平均要花费58+11=69pciclockcycles。若采用本文提供的方法,提供数据的sbc将数据直接写到消费数据的(接上页)sbc内存中,则传输一个4byte的数据,平均只需11pciclockcycles。可知,后者比前者快了69/11≈6.3倍,极大提高了传输效率。

参考文献
1motorola.mcp750seriessingleboardcomputerprogrammer’sreferenceguide.motorola,2001
2motorola.compactpcisingleboardcomputerprogrammer’sreferenceguide.motorola,2001
3intel.21554pci-to-pcibridgeforembeddedapplicationshardwarereferencemanual.
intel,1998
4intel.21154pci-to-pcibridgeconfigurationapplicationnote.intel,1998
5windriver.vxworksprogrammer′sguide.windriversys-temsinc,1998
6lynx.lynxdevicedriverservicemanual.lynx,2000
7t.shanley,d.anderson.pcisystemarchitecture(4thedition).usa:addisonwesley
longman,1999


show_label.gif标签:  双机通信 CPCI 总线
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条