双机通信在CPCI总线上的实现
时间:12-05
来源:互联网
点击:
2.1 子机板的配置
(1)调用内核内存分配函数申请1MB的内核虚拟地址空间,得到申请空间的开始地址A7。
(2)根据操作系统的内存映射关系,得到虚拟地址A7的物理映射地址A6。
(3)Raven ASIC是一个Host-to-PCI Bridge,因为Processor Bus不是一个标准总线,所以通过Raven将其转换为PCI总线,以挂接各类PCI设备。CPU和Raven一起构成了一组套片(chipset),配合使用。根据Raven的设置,获得物理地址A6在Local PCI Bus的映射地址A5。
(4)21554是一PCI-to-PCI Non Transparent Bridge,并可进行双向数据传递。通过其内部的两个配置寄存器,将其地址窗口的大小设为1MB;地址窗口的起始地址在Local PCI Bus端设为A5。
2.2 主机板的配置
(1)申请大小1MB的内核虚拟地址空间,得到其开始地址A1。
(2)根据操作系统的内存映射关系,得到虚拟地址A1的物理映射地址A2。
(3)根据Raven的设置,得到物理地址A2在Local PCI Bus上的映射地址A3。
(4)21154是一PCI-to-PCI Transparent Bridge,它也可以在两个方向上进行数据访问。设置其内部的两个配置寄存器,将其地址窗口的大小设为1MB;地址窗口的起始地址设置为A3。由于21154的透明性,地址A3与其在System CPCI Bus端的映射地址A4的值是相同的。
2.3 主机板与子机板的接口配置
在主机板端对子机板进行配置,设置21554的配置寄存器,将其在System CPCI Bus端的地址窗口开始地址设为A4。由于在Local PCI Bus端的地址窗口起始地址已设为A5,所以将地址A4映射到了地址A5。可以看到,由于21554的非透明性,使主机板与子机板的地址空间相互隔离,各自可独立分配,并在System CPCI Bus级实现了对接。在主机板CPU看来,整个子机板与主机板网卡一样,都是挂在主机板Local PCI Bus下的一个外设。对子机板的访问与对主机板网卡的访问方式是一样的,没有什么不同。
2.4 地址转换流程
当所有的配置完成后,主机板CPU只对地址A1进行读写操作,便可实现对子机板1MB内存起始单元的访问;对1MB内存中其他单元的访问,只要将地址A1加上相应的偏移量即可。通过下面的地址转换流程,可以清楚地看到各级地址是如何通过一级级映射,最终命中指定单元的。
主机板CPU给出虚拟内存访问地址A1→主机板物理地址A2→主机板Local PCI Bus地址A3→System CPCI Bus地址A4→子机板Local PCI Bus地址A5→子机板物理地址A6→经Falcon Memory Controller译码后,选中所申请的1MB内存的起始单元。
从上述介绍可以看出,要想实现双机的内存互访,关键是要进行正确的地址映射。当要实现多个SBC间的相互访问时,地址的映射会更复杂,需要对操作系统的地址空间分配、各个SBC的PCI-to-PCI Bridge设置、System CPCI Bus地址空间分配等进行通盘考虑。
?图3 在两SBC间进行读操作时的时间图
图4 在两SBC间进行写操作时的时间图
3 性能优化
图3、图4是用VMETRO的总线分析仪截获的数据。分别是在两个SBC间进行读写访问时,连续进行100 Byte传输的时间图。
从图3可以看出,每进行一次4Byte的读操作,要花费956.8+4×149.5+179.4=1734.2ns,这相当于1734.2ns/29.9ns=58 PCI clock cycles。
从图4可以看到,第一个4Byte的写操作花费了159.5ns,接着是两次猝发传送,随后一个4Byte写操作花费了119.6ns。进行一次4Byte的写操作平均花费(159.5ns+2×29.9ns+119.6ns)/(4×29.9ns)=11 PCI clock cycles。
对比读写两种访问方式可以看出,写操作比读操作的效率要高得多。这主要有以下一些原因:
(1)当PCI上的一个主设备发起对一个目标设备的访问时,读和写操作的完成时间差别很大。目前的PCI设备中一般都有一个用于存储器写的转发(post)缓冲器。若要进行写操作(如图2中主机板对子机板的写操作),主设备只需将其写缓冲区数据复制到目标设备的转发缓冲器中,便认为操作完成。例如在图2中,主机板的Raven只要将数据发给21154,便认为写操作完成,后续的数据传输由21154驱动完成。可以看到,写操作在目的总线上(子机板的Process Bus)完成之前可以先在源总线上(主机板的Local PCI Bus)完成,实际上是寄存器对寄存器的操作。而要实现一个读操作,则必须经过存储器本身的访问和各级PCI接口的逻辑延迟才可完成。与写操作相比,读操作在源总线上完成之前必须先在目的总线上完成,这导致了读操作的效率很低。(2)从图3、图4中可以看到,PCI设备还可进行写操作的猝发操作,但读操作则无法进行。这是由于猝发操作只有在前一事务是写事务时才能实现。猝发传送取消了FRAME#、AD、C/BE#、IRDY#、TRDY#、DEVSEL#等总线信号的周转周期,实现了每一个PCI clock cycle进行一次数据传送。 (3)猝发传送操作不可能无限制地进行下去。连续进行猝发传送的次数与转发缓冲器的大小、Latency Timer的取值、总线的繁忙状况都有关系。
由于以上原因,在两个SBC间进行数据传送时,应该采用如下方式: (1)提供数据的SBC应将数据直接写到消费数据的SBC内存中;而不是提供者将数据放在本地内存,再由消费者经过PCI读操作来实现。也就是说,总是进行PCI写操作。(2)当需要在多个SBC间进行数据互传时,要合理地设置Latency Timer的取值,以使各SBC公平使用PCI总线资源。考虑两个子机板间的通信实现。若采用操作系统提供的消息传递机制,数据提供者必须先将数据写到主机板,数据消费者再从主机板读取数据。对一个4 Byte的数据传输来说,平均要花费58+11=69 PCI clock cycles。若采用本文提供的方法,提供数据的SBC将数据直接写到消费数据的(接上页) SBC内存中,则传输一个4 Byte的数据,平均只需11 PCI clock cycles。可知,后者比前者快了69/11≈6.3倍,极大提高了传输效率。
- 热插拔和缓冲I2C总线 (04-14)
- PCIe总线何时突破Unix服务器坚冰(02-03)
- TMS320VC5402 HPI接口与PCI总线接口设计(04-12)
- 基于Nios II的I2C总线接口的实现(04-09)
- 双口RAM CY7C026在高速数据采集系统中的应用(04-12)
- 计算机在新型多电机同步系统中的应用(07-08)