基于以上分析,我们选用CPCI总线作为分布式系统的数据通信平台。CPCI总线技术是PCI总线技术和成熟的欧式卡组装技术的结合,在电气、逻辑和软件功能方面,它与PCI标准完全兼容,又突破了PCI标准4个插槽的限制,相较于VME总线模块价位低,具有开放性、易于扩展、高密度等优点,同时达到99.999%的高可用性。采用CPCI总线技术以及硬件接口设计规范,能运用其多模块插卡式的设计优点,支持多业务的分布式处理,并实现模块化数据处理单元的无缝连接,为分布式数据交换提供高速、可靠的保证,非常适合作为分布式系统业务处理通信平台,也适于在通信及嵌入式系统中的广泛应用[2-4]。
本文给出一种基于CPCI总线的通信系统设计,系统采用分布式网络架构,支持多种分组交换业务的处理及数据交互。文章首先给出系统结构及原理设计,并针对分布式业务处理模块跨总线通信的难点,提出基于“抽屉机制”的报文存储和地址信息维护策略,描述了数据无干扰传输等关键技术的实现,最后给出技术总结和展望。
2. 系统总体设计
2.1 系统结构特点
我们所设计的分布式系统结构如图1所示。系统中不同设备板卡独立对相应业务数据进行处理,将其转化为统一的IP数据进行互通,并维护各自的路由表独立完成数据转发。系统将与特定业务网络的接口分布到各种设备板卡中进行标准的接入信道适配,并将各类网络数据分布到各板卡进行处理和转发,实现了集中配置与分布式接入和数据处理的完美结合。
在CPCI分布总线架构中,背板为总线交换提供物理连接、电路保证,背板上系统插槽提供总线仲裁、时钟分配和背板上各板卡重新启动等功能;外设插槽上可安放简单的接口板、智能从属装置或总线控制装置[2,3]。每块CPCI板卡均有处理器和嵌入式实时系统,处理器采用Motorola的PowerPC-860,同时采用PLX公司的9054和9056 PCI桥芯片在PowerPC-860和CPCI总线之间架起一条高效稳定的传输桥梁。PLX 9054/9056芯片实现了CPCI主控设备的功能,支持PCI2.2规程,简化了对连接PowerPC的设计,兼容性较好,很容易扩展成66MHz时钟及64bit的PCI总线,特别是PLX 9056内嵌总线仲裁器,能减小系统规模,使系统更稳定[5]。
图1 数据通信系统结构图
2.2系统资源共享与信息互通
系统采用基于CPCI的单总线多处理器/多操作系统的分布式架构,系统中各块板卡均拥有独立的CPU和操作系统、地址和内存空间以及独立的I/O和中断,可独立完成数据操作,每块板卡可看作一台计算机主机。分布式系统形成的拓扑结构为一个全连通的网络,网络中每个节点都能够直接访问其它节点;从CPCI总线传输的角度看,所有插槽上的板卡都是对等的,都能够充当master主动发起总线传输。针对这种基于总线的分布式架构,我们设计了跨总线的内存访问机制,将系统中其它板卡的系统内存或者设备内存(比如内存扩展卡)映射到本地地址空间,然后以与系统内存相同的方式访问被映射的内存,这样每块板卡都能够访问到总线上其他板卡的内存资源了。
2.3统一规范的访问接口
异构网络通过标准信道适配接入分布式系统,语音、X.25、串口数据等非IP数据经由数据适配模块转换成IP数据,系统中各板卡的嵌入式实时系统对数据进行处理和交互。各种异构网络挂接在嵌入式系统中相应网络设备上,网络设备驱动调用CPCI总线驱动提供的统一接口实现实时系统与总线之间的数据传输。发送数据时,网络设备驱动通过总线驱动控制桥芯片进行地址转换、数据转发、中断产生等工作,生成相应的总线操作将数据送往总线;接收数据时,总线驱动响应中断,接收总线上相应地址段的数据,在中断服务程序中进行数据解析、地址转换、数据转发、其他中断产生等操作。我们采用Linux操作系统,其网络系统主要是基于UNIX的socket机制,系统协议栈和驱动程序之间通过专门的数据结构(sk_buff)传递数据。实时系统内核与CPCI总线间数据传输流程如图2所示:
图2 数据传输流程图
3. 关键技术
3.1 报文存储的“抽屉机制”
系统中各板卡共用一条CPCI总线,我们提出基于“抽屉机制”的报文存储策略,以保证板卡间数据无干扰传输。在板卡加入系统的初始化阶段,系统板为总线上每块板卡分配独立的PCI总线地址区间,其他板卡向其发送数据时将数据写往指定地址区域。一块板卡会接收来自不同板卡的数据,为避免各板卡往同一基址发送数据所引起的干扰,同一板卡地址区域内又为其他板卡分配大小相同的独立读写空间,我们将它命名为“抽屉”。这样来自某板卡的数据会被送到其对应“抽屉”,每次数据依序存放而非覆盖,以保证板卡数据处理时间。当数据长度超出抽屉剩余空间时,则似环状buffer从头开始存放。“抽屉机制”如图3所示,左边方块代表总线上不同板卡,右边则是PCI总线地址空间。板卡B对应地址范围从a点到e点,其中ab点之间空间仅用于板卡A向B进行数据传送,bc点之间空间仅用于板卡C向B进行数据传送,以此类推。
图3 板卡数据接收“抽屉”
基于这种报文存储机制,我们定义几种地址表来维护数据传输相关地址信息。系统板上维护有静态的基址表,记载为每个卡槽上板卡预先分配的基址。所有板卡上都维护有板卡地址映射表和传输地址偏移表。板卡地址映射表为一个结构数组,数组中各项分别代表一个卡槽,里面包含板卡名称、卡槽号、基址和地址范围等地址信息以供数据传输时配置所用,其数据结构如下:
typedef struct _BUS_ADDR_MAPPING_INFO{
char board_name[BOARD_NAME_LENGTH];
int slot_number;
unsigned long base_addr;
unsigned long range;
}BUS_AddrMapping_Info, *P_BUS_AddrMapping_Info;
传输地址偏移表为一无符号整型数组,用于记录板卡间数据传输时各板卡的地址偏移,初值均为零,每次传输完毕,接收板卡的地址偏移就增加当次数据传输长度,当地址空间不足以存放即将传输的数据时,则将偏移地址设为零,重新从区域起始处写入。其数据结构定义如下:
u32 current_offset_table[NUM_OF_SLOT] = {0,0,0,0,0,0,0,0};
3.2 数据传输实现
我们定义了一种数据结构IPH(Internal Packet Header),包含数据类型、长度、来源卡槽号等属性,在传输数据前作为包头对报文进行封装,以便接收方解析包头后能根据数据业务类型区分处理。主要IPH类型有板卡配置信息,端口注册信息,路由信息,未知数据类型等。定义数据结构iph_attr区别不同IPH_info类型,位于数据包首,其数据结构如下:
typedef struct _IPH_ATTR {
u32 board_id; /*from which board*/
int iph_type; /*datagram type*/
unsigned long length; /*datagram length(without IPH)*/
}IPH_ATTR, *P_IPH_ATTR;
针对各种类型IPH信息又分别定义不同数据结构,在数据包头中依次存放于iph_attr结构之后。
发送数据时,对数据进行IPH封装,根据前述的板卡地址映射表选择目的PCI地址,再调用总线接口函数完成数据传输。发送方通过写接收板卡桥芯片的mailbox寄存器,将传输地址及数据长度信息通知接收方,产生中断触发接收。PLX桥芯片支持local总线对PCI总线的直接访问,它有8个mailbox寄存器,前四个能产生中断,每个mailbox32位,传输地址和数据长度信息分别使用mailbox i 和mailbox i+4配合工作,这样接收方收到两个参数时会产生一次中断,进行数据接收[5]。这种机制使接收处理具有四个服务窗口,提高了系统吞吐量。
接收板卡PLX芯片的mailbox被写入参数即产生本地中断检查 “抽屉”,产生中断前,数据实际上已被发到目标板卡上了。中断服务程序为接收端维护一个数据队列,它读取mailbox中的信息,分析地址找到相应数据并交由底半处理。底半解析数据包的IPH分辨数据类型,若为配置、端口、路由等信息则进行相应配置,若为数据信息则进行处理或转发。
综上所述,系统通过 “抽屉机制”和对几种地址表的维护完成了各板卡之间PCI地址空间的映射,板卡将数据写往映射地址空间即能通过总线将数据传输到目标板卡上,实现了板卡的跨总线内存访问;自定义IPH数据包头来区分数据类型协助数据信息管理,完成了路由维护,转发引擎的逻辑功能,实现了数据的无干扰传输与有效通信管理。
4. 总结及展望
本文作者创新点为:给出了一种基于CPCI的分布式系统设计,同时提出了基于“抽屉机制”的报文存储机制和地址信息维护策略。文章所述的基于CPCI的分布式系统,可达到64bit总线宽度、264MB/s的峰值带宽,系统中各主机能独立完成数据处理及通信,能够承载语音、数据多种业务,用户还可通过用户接入板与语音业务板所连的PSTN网和数据业务板所连Internet进行数据通信,在通信、军事等领域有着较大的应用前景。为使本通信系统更具大规模实用价值,未来的工作包括:
(1) 实现一套易操作的远程管理系统,以便完成通信业务的监控,调配;
(2) 设计支持更多业务类型的CPCI接口板卡,如xDSL,H.264等;
(3) 在外界干扰较大情况下,通过严格的性能测试以证明系统能够满足电信级的业务需求。