APP下载

基于1553B总线的IP网络设计与实现

2011-01-23王若龙张善从

计算机工程与设计 2011年2期
关键词:驱动程序内核以太网

王若龙, 张善从

(1.中国科学院光电研究院,北京100190;2.中国科学院研究生院,北京100049)

0 引 言

MIL-STD-1553B总线是在20世纪70年代末为适应飞机的发展由美国提出的飞机内部电子系统连网标准。它是一种规定了“时分制命令/响应式的多路数据传输总线”网络的硬件和软件的技术要求,作为一种理想的实时通信总线,MILSTD-1553B总线具有1Mbps的传输速度,由总线控制器(BC)进行控制和管理总线上所有终端的数据传输。

1553B总线具有较高的可靠性和灵活性,广泛应用于军事、航空航天系统,比如飞机、军舰、卫星以及国际空间站等。随着我国通信卫星,深空探测和载人航天等项目的开展,1553B总线技术在国内航天领域的应用也日益广泛。航天产品的地检设备往往需要具有1553B总线数据访问功能。为了方便数据的传输和共享,一般会在这些设备上开发基于TCP/IP网络的应用软件。同时,对于底层为1553B总线的分层网络系统而言,实现各层间数据在网络层的共享十分重要。

本文阐述了在Linux操作系统下,使用1553B协议的PCI接口卡,通过开发网络设备驱动程序实现基于1553B总线的TCP/IP网络。该实现方案不仅有效的提高了1553B总线的灵活性和可扩展性,而且使得1553B总线终端可以与以太网的网络结点进行数据通信。

1 1553 B接口卡的硬件设计

1.1 硬件结构

PCI总线是当今普遍使用在桌面以及更大型计算机系统上的外设总线,而且该总线在Linux内核中得到非常好的支持。该系统使用运行Linux操作系统的个人计算机作为硬件基础,设计并开发基于PCI总线接口的1553B协议的板卡,不仅可以有效利用操作系统的支持,而且提高了1553B设备的通用性。

1553B总线接口卡主要包括1553B总线通道、1553B总线控制器、控制逻辑单元、PCI总线控制器和PCI配置用存储芯片等部分。系统框图如图1所示。

图1 1553B协议接口卡系统

1.2 PCI总线接口实现

PCI总线接口采用PLX技术公司的PCI 9052协议芯片,该芯片是一款功能强大、使用灵活的PCI总线控制器接口芯片。PCI 9052兼容PCI v2.1规范,运行于PCI目标设备下,其突发传输速率可以达到132Mbps。芯片内部具有用于读写的FIFO,并且该芯片支持8、16和32位宽的局部总线,这些特性使得PCI 9052芯片满足1553B总线的数据通信需求。

1.3 1553总线接口实现

1553B总线接口控制单元采用成熟的1553B协议芯片——DDC公司的BU61580。该芯片完全集成了1553A/B Notice2,芯片可配置成远程终端(RT)、总线控制器(BC)或者总线监视器(MT),芯片内部包含4K的RAM空间。

该芯片具有以下主要特性:

(1)BC自动重试;

(2)BC消息传输时间可编程;

(3)BC消息帧自动重复;

(4)BC可编程响应超时;

(5)RT单消息、双缓冲、循环缓冲可选的数据缓存;

(6)RT子地址可编程BUSY位。

上述特性说明使用 BU61580芯片可以方便灵活的实现1553B总线协议,主要的功能设置都可以通过软件实现。该芯片的总线通道可以采用直接耦合和变压器耦合两种方式,提高了板卡的兼容性和可靠性。

1.4 接口逻辑实现

接口控制逻辑单元采用Xilinx公司的XC95114芯片实现,该芯片具有充足的逻辑资源和大量寄存器,主要实现总线接口芯片PCI 9052和1553B协议芯片BU 61580之间的握手、片选、配置等逻辑控制。

2 Linux2.6内核及驱动模型

Linux操作系统是在Internet上发展起来的,其在网络方面具有良好的性能以及丰富的产品和网络分析工具,而且它还可以方便的将主机配置成具有路由功能。虽然Linux2.4内核仍被广泛应用,但是自从2003年Linux2.6.0发布至今,2.6版本的内核已经十分稳定,并且相对于2.4版本的内核有相当大的改进。内核在设备驱动方面增加了不少新功能,并且在sysfs文件系统、模块文件格式、模块使用计数、模块加载和卸载函数的定义等做了改进。

本文采用了基于Linux2.6.29内核的Fedora系统作为软件开发平台,该版本内核对网络设备和PCI设备驱动的接口和变量又做了进一步的封装。

2.1 PCI驱动模型

PCI总线具有的平台无关特性使得PCI广泛应用于IA-32、Alpha、PowerPC、SPARC64和 IA-64等众多系统中。PCI设备在系统的引导阶段由引导程序和操作系统自动完成对系统中所有PCI设备的配置,当PCI设备的驱动程序被挂载的时候,其内存和I/O区域已经被映射到了处理器的地址空间。

Linux内核使用两个重要的结构体描述 PCI总线系统。pci_bus用于描述PCI总线,pci_dev用于描述PCI设备。由于PCI只是一种总线,其作为一种控制功能设备的手段而存在。因此,PCI设备的驱动程序应至少包括PCI驱动和设备驱动两部分。Linux内核使用pci_driver结构体定义PCI驱动,该结构体中包含PCI设备的加载/删除、挂起/恢复等接口函数。PCI总线系统的3个主要结构体在Linux内核中的层次结构和相互关系如图2所示。

pci_bus结构体中的pci_ops类型的指针ops指向该PCI总线所使用的配置空间访问操作。pci_ops结构体中包含read和write两种操作可用于读写PCI配置空间,根据这两个函数的参数可以定位到PCI总线上相应的PCI逻辑设备。Linux内核提供了具体的配置空间操作接口 pci_read_config_byte(word/dword)和pci_write_config_byte(word/dword),可以方便的实现配置空间的字节、字和双字的操作。如果驱动程序还不能获得pci_dev对象,内核提供了使用pci_bus对象作为参数的另外一对读写接口,pci_bus_read_config_byte(word/dword)和pci_bus_write_config_byte(word/dword)。

2.2 网络设备驱动模型

在Linux系统中,网络设备不同于字符设备和块设备,它作为一种独立的特殊设备而存在,并且系统内核提供了一系列专属于它们的操作接口。

Linux内核中的网络设备驱动被设计成完全与协议无关,网络驱动程序通常不需要分析上层协议的数据,只简单的把这些数据作为其有效载荷数据进行传输。Linux系统对网络设备驱动进行的分层结构如图3所示。

(1)协议接口层通过dev_queue_xmit()函数发送网络层的数据,硬件接收到的数据通过netif_rx()函数传到网络层,二者均以sk_buff结构体作为参数,这一层有效地将网络协议和具体设备进行了隔离。

(2)设备接口层使用net_device结构体描述了具体的网络设备属性和各种回调接口,系统将通过该结构体调用驱动功能层提供的各功能函数。

(3)驱动功能层主要完成数据包的发送和接收,比如net_device_ops结构体中的ndo_start_xmit()用于将数据包写入具体的网络设备。

(4)设备与媒介层表示了具体的数据传输载体,对于Linux系统而言,这个载体既可以是一个物理的网络设备,也可以是一个在计算机内存中构造的完全虚拟的设备。对于本文来说则包含1553B总线终端和相关的芯片操作接口。

图2 PCI总线层次结构

图3 Linux网络设备驱动程序的分层结构

另外,数据包的接收由硬件中断引起,在中断处理函数中读取硬件接收的数据,并通过dev_alloc_skb()申请一个sk_buff结构体,将数据放入该结构中,通过协议接口层的netif_rx()将其传递给上层协议。

3 接口卡驱动程序开发

TCP/IP网络互连协议属于对等的开放式网络协议,它不仅平等对待所有网络节点,而且不依赖于互连设备的实现细节。MIL-STD-1553B总线属于高可靠性的仲裁机制总线,所有的数据传输服务都由BC(BusController)来控制的,这意味着1553B总线并非对等式的网络协议,但这并不阻碍在1553B总线上实现IP网络数据的传输。

通过编写驱动程序使1553B接口卡变成Linux系统下的网络设备,通过软件控制1553B协议芯片将网络层的数据包封装进1553B消息帧完成传输。Linux内核的网络驱动中具有专门为以太网提供支持的通用接口,以太网接口上使用的tcpdump等网络分析工具也有助于驱动程序的开发和使用。所以本文采用以太网模型开发1553B接口卡驱动。驱动程序共分为三层,由上到下依次为PCI驱动层,以太网驱动层,硬件接口层。

3.1 PCI驱动程序开发

1553B接口卡通过PCI总线接入计算机系统,因此PCI驱动是实现设计方案的基础。定义一个pci_driver类型的全局对象,至少初始化对象中的name、id_table、probe和remove成员。在module_init()指定的驱动模块装载函数中通过调用pci_register_driver()注册pci_driver类型的全局对象。系统将会执行对象中的probe指针所设定的探测函数,驱动程序需要在该函数内实现PCI相关的初始化,并注册以太网设备。

module_exit()指定的模块删除函数调用 pci_unregister_driver()对已注册的pci_driver对象注销时,系统将会执行pci_driver对象的remove指针所设定的删除函数,驱动程序需要在该函数内完成删除模块前的资源释放,并注销以太网设备,PCI层驱动的加载和删除的控制流如图4和图5所示。

图4 PCI驱动装载

图5 PCI驱动删除

3.2 以太网驱动开发

PCI驱动层使用alloc_etherdev()动态的申请以太网设备对象,并通过register_netdev()函数注册该设备对象时将引起对象中的ndo_init成员所设定的回调函数的执行,驱动程序需要在该函数内完成网络驱动层的初始化,比如net_device_ops中的设备操作函数指针、header_ops中的以太网帧头操作函数指针的赋值,中断申请和用于互斥访问的自旋锁的初始化,以及调用硬件操作接口对硬件芯片的初始化。

当删除接口卡驱动模块时,由PCI驱动层调用unregister_netdev()函数注销以太网设备对象。对象的注销会引起对象中的ndo_uninit()函数执行,在该函数内释放中断等系统资源,并关闭1553B通道,停止芯片工作。

1553B接口卡区别于以太网设备的地方在于数据的发送和接收。1553B协议芯片要求将要发送的数据写入片内RAM,之后需要等到下一次中断的发生才能真正完成数据的传输,这期间如果写入新的数据将会造成覆盖,也就要求数据的发送和接收都在中断里执行。为了避免数据的覆盖可以在驱动中维护一个发送队列链表,将来自网络层的数据包添加到链表的尾部,每次中断从链表头部提取数据写入芯片。

1553B协议芯片要求以子地址为数据传输的一个单位,每个子地址一次最多可以传输64Bytes。但是,该实现中并没有将网络设备的MTU设定为64B,因为这会大大降低数据传输的吞吐率。如果使用n(0

另外,真正的以太网卡只要在初始化时正确填写了net_device对象的addr和addrlen成员,协议层就会自动使用ARP协议进行IP地址和硬件地址的转换。但是1553B接口卡的硬件地址不同于以太网,但是仍然使用以太网头区分总线上不同的终端。驱动中需要包含一张表格用于保存总线上所有终端的RT地址和以太网地址的对应关系,在header_ops的create()函数中查询该表用于确定数据包的目的RT地址,该函数在数据发送函数ndo_start_xmit()之前被用于建立硬件头。

图6 物理帧控制字

3.3 硬件接口开发

数据的发送和接收最终都要通过 1553B协议芯片BU61580实现,BU61580的操作函数向以太网驱动层提供高效可靠的硬件操作接口。操作接口函数除基本的寄存器和RAM区读写函数ReadRegister/WriteRegister,ReadRam/WriteRam分为BC和RT两个部分,分别完成终端的初始化、发送数据的写入、读取接收数据、1553B消息定义、帧定义等。

本文的实现中设置BC和RT的中断模式为帧中断,RT使用服务请求模式,当有数据传输时主动请求获得总线时间。另外,减小BC的帧传输时间可以提高总线数据传输的吞吐率,同时又要满足每条总线消息的最小传输时间 (本文设置为1000us)。

4 测试与分析

搭建测试系统如图7所示,其中Computer是一台带有以太网卡的计算机。GateWay是一台装有传统以太网卡和1553B接口卡的计算机,1553B接口卡通过耦合器接入1553B总线,作为 BC同时运行所开发的以太网驱动。而计算机 RT11和RT1都装有1553B接口卡,都最为1553B总线的远程终端,并且只在RT11上运行所开发的以太网驱动。

图7 测试系统框架(静态分配IP地址)

RT11和GateWay两台计算机之间使用ping程序测试,并使用tcpdump抓取网卡数据输出如图8所示。GateWay计算机上通过命令#route add–net 192.168.11.0 netmask 255.255.255.0添加一条路由表项,并运行命令#echo 1>/proc/sys/net/ipv4/ip_forward使得来自1553B总线上的数据包可以由GateWay进行路由转发。RT11和DesktopComputer之间使用ping程序的测试数据如图9所示。

开发基于TCP/IP的应用程序,对GateWay(server)和RT11(client)进行网络性能的测试,结果显示基于1553B总线的IP网络的平均数据吞吐率为40KBps。增加用于某一方向上数据传输的子地址数量,还可以提高该方向的数据吞吐率。

图8 1553B总线内互连测试

该实现方案的数据吞吐率没有达到1553B总线的最大数据传输速率,主要是因为在中断处理程序中首先要停止BU61580芯片,然后处理RAM中的所有数据,完成后再启动芯片继续工作,并且在每条消息的数据中增加了2个字节的物理帧控制字,消耗了一定的总线时间。

5 结束语

本文介绍了一种基于1553B总线的IP网络实现方法。在Linux2.6操作系统下,通过对1553B接口卡开发以太网驱动的方法实现了1553B消息对IP数据包的封装和传输。使用该系统可以开发基于以太网的各种应用程序,并且可以实现与以太网等其它网络的互连。

通过设置收发数据所使用的子地址数量还可以控制网络的上下行带宽,甚至可以保留一定数量的子地址用于传统的1553B消息的传输。Linux系统中丰富的网络数据分析工具均可用于该系统。

[1] 刑秀琴,姚竹亭.基于1553B总线的通信接口及其应用[J].中北大学学报(自然科学版),2007,28(1):91-94.

[2] Ben Truitt R,Edward Sanchez,Michael Garis.Using open networking standards over MIL-STD-1553 networks[J].IEEE A&E Systems Magazine,2005,20(3):29-34.

[3] PCI 9052 data book version 2.1[S].2008.

[4] ACE/Mini-ACE series BC/RT/MT advanced communication engine integrate 1553 terminal user's guide[S].2003.

[5] 邰全亲,傅岚,杨京松.基于以太网的1553B仿真测试设备设计[J].计算机测量与控制,2008,16(11):1559-1560.

[6] 林宇,赵玮,尚智,等.基于PCI总线的MIL-STD-1553B板卡设计[J].控制工程,2005(5):82-87.

[7] 林生,范冰冰,张奇支,等.计算机网络与因特网[M].北京:机械工业出版社,2009.

[8] 宋宝华.Linux设备驱动开发祥解[M].北京:人民邮电出版社.2008.

[9] 魏永明,耿岳,钟书毅.Linux设备驱动程序[M].北京:中国电力出版社,2006.

[10]Sreekrishnan Venkateswaran.Essential Linux device drivers[M].London:Prentice Hall,2008.

猜你喜欢

驱动程序内核以太网
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
基于1500以太网养猪场的智能饲喂控制系统的设计与实现
阻止Windows Update更新驱动程序
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
谈实时以太网EtherCAT技术在变电站自动化中的应用
浅谈EPON与工业以太网在贵遵高速公路中的应用
万兆以太网在连徐高速公路通信系统改造中的应用