摘 要: 针对PC104结构SCM/DETH双端口以太网卡设计实现了一个基于VxWorks系统的智能双冗余网络驱动,在驱动程序中实现了网络通信故障诊断及网卡间智能切换等功能。通过对智能双冗余驱动进行性能测试,验证了设计的正确性和有效性。

关键词: VxWorks操作系统 冗余备份 网络接口卡 网卡驱动

  随着网络技术的成熟,具有价格低廉、连接方便等优点的以太网已成为各种控制系统接口互连的主要媒介。它作为一种通用网络数据通信系统,在全球计算机网络领域已经得到了广泛的应用。随着现代舰船信息化程度的不断提高,以太网技术也开始应用于现代舰船信息系统中,不但要求信息传输速度快,抗干扰能力强,还要求网络具有高稳定性和高可靠性,在网络局部故障或受损时,全系统不至于瘫痪失效。

  冗余设计作为一种提高系统可靠性的有效方法,已经得到了广泛的应用。对于网络系统中的单个节点,常常需要对网卡进行双冗余备份,即每个节点都采用两个网络接口,中间用两个集线器或交换机互连,当正常通信的网卡或线路出现故障时该节点能自动地切换到备份网卡进行通信。

  目前大多数操作系统(如Windows、Unix、Linux等)都支持多网卡,但均非冗余设计,每块网卡都有独立的物理地址和IP地址,以独立的形式供应用系统使用。要实现真正的智能双冗余网络系统,必须自行设计专用的网络驱动程序,以透明的形式提交高层应用系统使用,使系统感觉不到双网卡的存在。本文使用盛博公司PC104结构SCM/DETH型10M双端口以太网卡,设计实现了基于VxWorks的智能双冗余网络驱动。

1 VxWorks系统网络驱动原理

1.1 VxWorks系统简介

  VxWorks操作系统是美国风河公司(Wind River System)推出的一款运行在目标机上的高性能、可裁减的嵌入式强实时操作系统。操作系统包括了进程管理、存储管理、设备管理、文件系统管理、网络协议及系统应用等几个部分,只占用了很小的存储空间,并可高度裁减,保证了系统能以较高的效率运行。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。

  VxWorks主要有以下特点:

  • 具有高度可剪裁的操作系统微内核Wind;
  • 具有比较优秀的网络处理能力,适用于多种物理介质的TCP/IP协议族支持;
  • 具有极其丰富的BSP,支持多处理器系统,最多可以支持20个CPU;
  • 具有友好的开发调试环境,便于操作、配置和应用程序的开发调试;
  • 具有较好的兼容性,支持POSIX1003.1b;
  • 支持多种开发和运行环境。支持C语言、C++语言以及JAVA虚拟机。
1.2 VxWorks系统网络驱动原理

  VxWorks中支持两种类型的网络设备驱动程序——BSD4.3网络驱动程序和可裁减的增强型网络堆栈SENS(Scalable Enhanced Networks Stack)。BSD4.3标准提供了网络设备驱动程序与IP协议的紧密结合,而SENS协议栈提供了可替换的网络设备驱动程序,即增强型网络驱动程序END(Enhanced Networks Driver)。

  SENS模型包含三个部分:协议驱动程序、多元接口层(MUX)和END型网络驱动。它独立于硬件设备接口,将网络设备驱动程序细化,使开发者可以专注于驱动程序(END驱动)本身的开发。本文设计实现的智能双冗余驱动即是一个符合SENS模型标准的END型网络驱动。在END型网络驱动中主要实现网卡设备的装载,网络芯片的初始化,网络报文接收及发送等功能。在系统启动后,操作系统通过网卡加载函数调用到END型网络驱动,在加载过程中完成网络芯片的初始化、内存池的分配、网卡设备控制结构的填写等操作,最后通过指针传递的方式将网卡设备控制结构和13个网卡操纵函数提交给MUX层,供上层系统操作网卡工作时使用。

2 智能双冗余驱动程序实现

2.1 智能双冗余驱动实现原理

  智能双冗余驱动的实现原理如图1所示,虚线框内为智能双冗余驱动。在VxWorks系统启动时,首先要遍历配置文件confignet.h中的网卡设备表endDevTbl[ ],设备表中包含双端口网卡上两个网卡的地址及中断等配置参数;然后,系统会调用sysDethEnd.c中的sysDethEndLoad(…)函数,将两个网卡的配置参数以函数入口参数的形式传递给智能双冗余驱动的装载函数dethEndLoad(…);装载函数为每个网卡设备创建一个控制结构,对入口配置参数进行解析,并为每个网卡设备分配一块内存空间,用系统的配置要求初始化两个网卡,同时填写好网卡设备的控制结构;最后,智能双冗余驱动将主通道网卡设备的控制结构指针提交给MUX层,并发起网络故障诊断定时器任务和网络故障诊断任务。

VxWorks Dual Redundant Network

  网络故障诊断定时器任务配合网络故障诊断任务执行,使用看门狗定时器Watchdog timer完成1ms定时,每定时1次释放1次二进制信号量sem_netDiagnose;网络故障诊断任务循环等待接收信号量sem_netDiagnose,取到信号量后立即判断主通道网卡设备的端口状态(连接/非连接),当端口处于连接状态时,任务循环等待下次信号量,当端口处于非连接状态时,网络故障诊断任务交换主通道与备用通道的控制结构内容,备用通道网卡设备变为主通道网卡设备开始工作,但对于上层应用来说,网卡的控制结构并没有改变。

2.2 网卡设备控制结构

  在智能双冗余网卡驱动中使用一个控制数据结构控制一块网卡设备,控制结构中包含网卡的中断向量、I/O基址、总线类型、介质类型、物理地址等特性信息。这些信息有的在网卡设备表endDevTbl[ ]中,在系统启动过程中作为驱动装载函数的参数传递到驱动中;有的保存在网卡的PROM中,在网卡驱动程序初始化时,将这些特性参数写入网卡控制结构。

  智能双冗余网卡驱动中定义了一个控制单网卡设备的控制结构,如下所示:


  typedef struct ne2000_device 
  { 
  …… 
  int    unit;       /*网卡单元号*/ 
  int    ilevel;      /*中断优先级*/ 
  int    byteAccess;    /*字节存储模式*/ 
  ULONG   base;       /*基地址*/ 
  int    offset;      /*内存对齐偏移量*/ 
  volatile ULONG  imask;   /*中断屏蔽码*/ 
  UCHAR   enetAddr[6];   /*网卡物理地址*/ 
  …… 
  } DETHEND_DEVICE;

  驱动中创建了两个网卡设备控制结构分别控制两块网卡。上层应用通过操作网卡控制结构从而实现对网卡的各种操作。

2.3 网络通信故障诊断方法

  要实现网络端口的智能切换,实现网卡间冗余备份的功能,首要前提就是需要诊断出当前工作的网卡是否网络通信故障。任何一种网络芯片都提供连接状态自动诊断功能,通过在网络芯片的某个寄存器的相应位置0或置1来表示该网卡连接正常还是连接错误。它所检测的依据是网卡是否连通,也就是从本机网络端口到网线另一端的网络端口整个通路是否连通,它能检测出网线断开、网络接口松动及故障等错误。

  本文使用的SEM/DETH双端口以太网卡采用两块RTL8019AS网络芯片,该网络芯片的寄存器组采用分页存储方式,共分为4页,都映射到16个I/O地址空间上。其中,第3页CONFIG0寄存器的B2位表示网卡连接状态自动诊断结果,当该位为1时表示连接错误,为0时表示连接正常。智能双冗余驱动的网络故障诊断任务判断网卡连接状态的代码如下:



  setting=sysInByte(pDrvCtrl->base); /*读取命令寄存器状态*/ 
  sysOutByte(pDrvCtrl->base,(0xc0|setting));/*选择第3页寄存器组*/ 
  if(sysInByte(pDrvCtrl->base+CONFIG0_REG) & 0x04)/*网络连接错误*/ 
  { …… }
2.4 单物理地址实现

  要使两块网卡实现智能双冗余备份,它们必须有相同的物理地址和IP地址。否则,当由其中一个网卡切换到另一个网卡上时,如果IP地址发生变化,系统将无法正常接收、发送数据;如果IP地址不发生变化而仅仅物理地址发生变化,虽然网卡切换后,系统仍可以正常接收、发送数据,但由于物理地址发生变化,将引起协议栈中ARP绑定表的变化,重新对应ARP绑定表中IP地址与网卡物理地址的关系,则延长了两个网卡之间的切换时间。

  系统的IP地址存在于系统的网络协议栈中,在系统启动后与网卡进行绑定。由于本文设计实现的智能双冗余驱动对于应用系统和协议栈来说呈现单网卡的特征,网卡之间的切换只在驱动程序中完成,所以,当发生网卡切换时,系统的IP地址并不发生变化。

  对于网卡的物理地址来说,通常每块网卡有一个全世界范围内惟一的物理地址,它保存在网卡的PROM中。网卡初始化时,要从PROM中读出物理地址,把它存放在适当的寄存器和数据结构中,对外来说,寄存器和数据结构中的数值就是这块网卡的物理地址。在智能双冗余驱动程序中,当驱动程序初始化时只读取一块网卡PROM中的物理地址,然后把这个地址写入两块网卡的对应物理地址寄存器和数据结构变量pDrvCtrl中,这样,两块网卡对外就具有统一的物理地址了。因为驱动程序自始至终只有一块网卡处于激活状态,另一块作为备份,因此不会发生同一个网络上两个物理地址相同出现冲突这种现象。

3 性能测试

3.1 测试方法

  针对本文设计、实现的双端口网卡智能双冗余驱动进行性能测试。将智能双冗余驱动编译到VxWorks操作系统中,使用带有SEM/DETH双端口以太网卡的计算机做目标机,使用两根网线把目标机连接到交换机上。目标机应用程序以40次/秒的速率向外发送UDP广播报文。采用普通PC机作为主机系统,运行Windows2000操作系统,使用sniffer Pro工具进行网络监控。

3.2 测试结果及分析

  测试结果如图2所示,横坐标代表报文数,纵坐标代表主机接收到的目标机UDP广播报文中两个连续UDP报文之间的间隔时间(单位为秒)。由图2可以看到,由于目标机正常工作状态下是以40次/秒的速率广播发送UDP网络报文的,所以每两个报文之间的时间间隔大部分为25ms左右。在图2中出现了8次主机接收到的广播报文时间间隔为100ms左右的情况,这是由于在目标机端进行了8次网卡切换,在网卡切换过程中出现了报文丢失现象。

VxWorks Dual Redundant Network Test Result

  由测试结果看,本文设计实现的智能双冗余驱动能够很好地实现双端口网卡冗余备份的功能,在检测到主通道网卡设备连接错误时可以切换到备用通道继续进行网络通信,并且可以在两块网卡之间循环切换;同时,该驱动对上层用户透明,呈现单网卡的特性,完全在驱动中实现网卡间的冗余备份。

  本文设计实现了一个基于VxWorks的双端口网卡智能双冗余驱动,在驱动中实现了网络通信故障诊断和网卡间智能切换功能,对上层应用呈现单网卡特性。通过对设计实现的智能双冗余驱动进行性能测试,验证了设计的正确性和有效性,但通过测试结果也可以看到,在网卡切换过程中还存在切换时间较长的问题,有待进一步研究。