反射内存RFM2G的学习与使用

摘要
1、介绍
2、安装
3、使用

摘要:
因项目需要使用反射内存实现数据在不同计算机快速共享,开始学习和使用反射内存。之前没有接触过,小白就开始在网上收集资料,然并没有找到太多有用的资料,大多是反射内存的基本介绍。于是转到官网下载资料,同事也提供了两块很久之前购买的反射内存卡,学习就这样开始了。

1、介绍
反射内存集成在反射内存卡上,我们使用的是PCI总线的反射内存卡PCI5565,还有PCIE和其它总线类型的反射内存卡,原理差不多。在两台计算机的PCI插槽插两块反射内存卡,然后通过光纤连接。常见的反射内存卡大小有128M和256M的,当在A卡的地址0x10000写入数据,就会触发数据通过光纤写入到B卡相同的地址,从而实现数据的共享。
反射内存的组网主要有环状和星状,所谓环状就是A卡的出口光纤连接B卡的入口,B卡的出口光纤连接C卡的入口,以此类推,最后一张卡的出口光纤再连接A卡的入口。当环网中任何一张卡的数据发生变更都会传输到下一张卡,最后回到它自身结束传递。所谓星状是指使用反射内存Hub设备做数据的转发,类似一台交换机,从而达到星状网络里所有卡上相同内存地址空间的数据一致。

2、安装
安装包括硬件安装和软件的安装。
硬件安装就是把反射内存卡插入到计算机的PCI插槽,然后通过光纤连接两张卡。
(1) 首先需要确认你的计算机是否有PCI插槽,可以打开机箱查看主板上有没有预留PCI插槽。
(2) 设置反射内存卡上的S1和S2值,S1和S2都是8位的开关,例如S1的第一位开关控制反射内存是否打开冗余模式,第二位控制是否打
开高性能开关,第三位和第四位一起控制需要使用的反射内存空间的大小,等等。默认S1的设置全部是OFF,建议开始就使用默认
设置就好了。 S2用来设置当前反射内存卡的NodeID, 全网的反射内存卡需要NodeID唯一,不能重复。所以同一个反射内存网
络最多支持256块反射内存卡。
反射内存RFM2G的学习与使用_第1张图片 (3) 插入反射内存卡,连接光纤。这里需要注意四点:
1)如上图反射内存卡最左边的卡板可能和机箱PCI插卡处不匹配,无法插入,可以用螺丝刀把卡板拆除直接插卡。
2)反射内存卡的插针可能会比机箱的PCI插槽宽,只要能插入就可以,多余插针没插入没关系。
3)插卡前计算机要关机断电,防止静电。
4)光纤连接的时候要保证出口线接入口线,入口线接出口线。

软件安装就是安装反射内存卡的驱动程序。可以到官网(www.abaco.com)下载驱动程序,解压后结果如下图:
反射内存RFM2G的学习与使用_第2张图片
api:反射内存api接口文件
diags: 官方提供的反射内存命令行程序,也是通过调用API接口实现的,可以通过这个程序以命令的方式查询,执行反射内存数据。
driver: 驱动程序代码
include: 驱动程序头文件
samples: 官方提供的测试样例,包含发数据,收数据和map反射内存数据到本地内存空间三个文件。可以直接make -f Makefile* 后执行。
rfm2g_load:安装驱动后会调用这个脚本创建设备文件,加载驱动ko文件等。
具体安装直接参考上面的install文件,只需执行 # make install 即可。

这里有两点需要注意
1)当前从官网下载到的驱动程序最高版本是R09, 其支持的最高linux内核版本是 3.x ,所以当你的linux内核版本高于3.x,那在安装的时候大
概率会报错。可以直接在网上搜索错误信息,解决问题。报错的原因一般是不同linux内核头文件和宏定义有变更,导致驱动程序代码编
译失败。例如我使用的debian系统的内核是4.9.0-9,编译报struct access f->f_dentry->d_inode was replaced by accessor function,
需要用使用file_inode(f)替换掉f->f_dentry->d_inode。
2)可以联系反射内存的技术支持获取最新的驱动程序,前不久技术支持反馈给我一个最新的驱动程序,版本是R10, 其支持的最高linux
内核版本是4.12. 我的debian环境安装这个驱动直接成功了,但另一个RedHat服务器内核是4.18的,安装还是遇到了问题,只能自己
解决。

3、使用
可以把反射内存当作一个文件,使用时需要先打开反射内存,然后往某个规划好的地址写固定大小的数据,这时数据会从本地内存IO到
反射内存,此处的IO有两张模式:DMA和PIO,DMA模式是不需要计算机CPU的参与直接通过PCI总线把数据IO到反射内存,PIO需要
CPU参与。故一般推荐使用DMA模式传输。然后这些数据会在几十微秒内通过光纤传输到下一个反射内存结点,很快整个反射内存网络
节点都会收到数据,但可能并不是所有节点都需要这份数据,这里你可以通过发送事件来通知需要这份数据的节点去读取数据。接收数
据的节点读取对应地址固定大小的数据,这样就完成了两个节点数据的快速交换。
具体到项目中的使用,可以把之前需要使用socket通信的地方改换成反射内存通信。在代码中include驱动程序中的头文件和实现代码即
可使用对应的API函数。

后话:
我们当前的使用还比较简单,还没有嵌入到项目中使用。在使用反射内存测试时,发现有一张卡的数据会有一两位值发生跳变并且
DMA模式也打不开。咨询了国内的技术支持,然他们也解决不了,当前正在联系国外的技术支持,老外的效率相当的慢。。。
后面有进展和新的问题,我再更新 ~

你可能感兴趣的:(linux,c++,c语言)