基于VxWorks的网卡驱动设计

2010-04-03 00:59王景刚邓如玉杨小平
中国新技术新产品 2010年14期
关键词:网络设备驱动程序网卡

王景刚 邓如玉 杨小平

(1、哈尔滨工程大学自动化学院,黑龙江 哈尔滨150001 2、哈尔滨工程大学自动化学院,黑龙江 哈尔滨150001 3、武昌造船厂,湖北 武汉430060)

引言

VxWorks是一个具有微内核、可裁剪的高性能强实时操作系统,它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。我校研制的综合导航显控台采用VxWorks操作系统,它作为船舶导航系统的核心设备实时为指挥系统、驾控系统等提供各种信息。当需要更改海图模块硬盘中一些及时需要修改的数据、程序等信息时,为避免拆卸设备,可以通过网络传输来解决上述问题。本文以Intel82557网卡为例,提出了基于VxWorks的网络设备驱动程序的开发方法和实现流程。

1 VxWorks的网络结构

VxWorks提供了与其他TCP/IP网络系统间"透明"的存取方式、BSD Socket兼用的编程接口,远程过程调用(RPC),远程文件存取等。网络驱动程序和上层网络协议栈可以有两种实现形式:BSD方式和MUX方式。在VxWorks中,MUX与END(增强的网络驱动程序)合称SENS驱动(可裁剪增强型网络驱动)。网卡驱动程序的层次结构使网卡驱动程序的实现和移植更加方便。而且VxWorks为编写网卡增强型驱动程序(SENS)提供了很好的接口和规范。图1是VxWorks的网络系统。

2 END驱动概述

2.1 MUX与END

VxWorks网络协议栈可以分为以下几层:应用层、传输层、IP层、MUX层、数据链路层和物理层。如图2所示。

从图2看出,与其他TCP/IP协议相比Vx-Works网络协议栈增加一层MUX层。MUX层是VxWorks为方便在网络接口硬件上实现多种协议而增加的一层。它主要用于管理底层的多种硬件的设备驱动,向上层不同协议提供统一的接口,降低了上层协议与底层物理硬件的藕合,使得网络驱动和上层协议彼此保持独立,既方便在现有硬件基础上实现新的上层协议,也利于用新的硬件支持原有的上层协议。

MUX与END的交互是通过提供一套可供底层调用接口服务来实现的,实现END驱动必须遵循这套接口关系。如图3所示。

图3中右边框中列出的函数是驱动需要实现的函数,供MUX层调用在必要的时间调用,如当上层使用该网卡发送数据时,MUX会调用该网卡END驱动提供的Send函数,将数据提交给网卡芯片硬件。

2.2 缓冲池数据结构

网络设备驱动与上层协议进行数据交换需要相应的内存缓冲,并且管理这些缓冲也需要相应的函数。VxWorks提供了netBufLib函数库用于创建和管理网络设备用到的内存缓冲池,网络设备驱动可以直接使用也可以在此基础上设计自己特定的内存缓冲池。数据以簇的形式保存,数据结构mBlks(内存块)和clBlks(簇块)形成的数据链结构则用于指定各个簇。

在clBlk之上是mBlk结构。该结构存储一个到clBlk的连接,也可以存储一个到另一个mBlk的连接。通过mBlk的连接,可以引用任意数量的数据,如图4所示。

3 END驱动实现

3.1 END设备驱动程序装载过程

END设备驱动程序装载过程实际上是分三个步骤完成的。即指定END设备、装载END设备和启动END设备。

3.1.1 指定END设备

网络设备的驱动程序安装时通过修改相应的BSP实现。在修改BSP之前,首先看一下BSP中的END设备驱动程序入口表END_TBL_ENTRY的结构。在BSP的configNet.h文件中定义着END_TBL_ENTRY结构的数组endDevTbl[],其数据结构如下所示。

该数组描述了系统中的所有网络设备的装载函数入口点及其相关参数。将网络设备驱动程序的装载函数rt8185lEndLoad()入口点及相关参数添加到网络设备表endDevTbl[]中,而后在config.h中加入"#define INCLUDE_FEI_EN D"以使系统准备初始化MUX并通过MUX装载网络设备驱动程序。

在VxWorks网络驱动程序的编程规范中,为了系统的高移植性、兼容性和可裁剪型等,通常在configNet.h文件中对系统支持的INTEL82557网络设备定义一些宏,其编写宏程序如下所示。

3.1.2 装载及启动END设备

装载及启动END设备的系统函数主要用到以下几个:

(1).muxDevLoad()

该函数装载指定设备的驱动程序装载函数。如果要装载END设备,系统必须调用muxDevLoad()函数。

(2).muxDevStart()启动设备函数

(3).muxBind()

muxBind()可以将协议绑定到指定的END设备上。其调用过程是系统调用ipAttach()函数,而该函数调用muxBind()函数,绑定协议堆栈到MUX上的一个指定的网络接口。当一个网络接口被关闭时,ipAttach()函数将释放网络接口所关联的TCP/IP堆栈模块。

装载及启动END设备驱动程序的流程如下:

使用指定的END设备驱动程序的BSP引导VxWorks系统时,在引导过程中,系统将执行任务tUsrRoot来完成如下各项:(1)初始化网络任务的工作队列;(2)创建tNetTask任务来处理网络任务工作队列的条目;(3)调用muxDevLoad()装载指定的网络驱动程序;(4)调用muxDevStart()启动指定的网络驱动程序。

tUsrRoot任务调用MUX设备装载函数muxDevLoad()和设备启动函数muxDevStart(),通过这两个函数来装载和启动设备驱动程序。

muxDevLoad()函数会根据网络设备表end-DevTbl[]中的定义逐一调用各网络设备的装载函数,其中这个函数是muxDevLoad()的一个输入参数。muxDevStart()函数也会根据endDevTbl[]逐一调用网络设备所定义的设备开始函数。至此MUX的初始化以及END驱动程序的初始化工作已经完成。但是网络设备还是不可以使用,因为还需要将协议绑定到指定的END指定的设备上,这一步需要用muxBind()函数实现。

在VxWorks中,系统通过usrRoot()函数调用usrNetInit()函数完成MUX的初始化、装载网络设备表endDevTbl[]中描述的所有设备并将IP协议绑定到网络引导设备上等工作。

网络设备驱动程序的安装过程即图5所示的网络初始化顺序。

3.2 发送数据

在VxWorks网络系统中,发送数据的流程如图6。

通过对图6分析,主要包含以下几个处理。

(1)用户调用write()函数,通过套接字访问网络。(2)网络协议拷贝需要发送的数据到网络缓区中,并调用协议驱动程序的发送程序。(3)协议驱动程序调用muxSend()启动发送循环。(4)muxSend()通过调用send()回调函数,把缓冲区传递给END。(5)数据发送程序把数据拷贝到设备缓冲区中,并把它放置到设备的发送队列中。(6)当产生发送中断时,驱动程序的中断服务程序调度程序丢弃已发送的数据包,彻底清理发送队列。

3.3 接收数据

在VxWorks网络系统中,接收数据的流程如图7。

通过对图7进行分析,它主要包含以下几个处理。(1)设备接收到数据包后直接把数据存放到预先分配的簇中。(2)当接收到中断时,驱动程序的中断服务程序调度任务级接收程序进行如下操作。①clBlk结构和簇连接;mBlk和clBlk连接;最后构成缓冲区。②通过调用receiveRtn()函数,把缓冲区传递给更高级别的协议。(3)muxReceive()调用协议的stackRcvRtn()函数,把成列的缓冲区传递给应用。用户使用read()函数,通过套接字访问网络中的成列缓冲区

3.4 驱动程序的中断处理

中断处理函数RT8185L INT()处理设备中断。根据中断状态调用相应的中断处理程序,如接收终端程序、发送中断程序等。当网络接口产生中断时,系统调用中断服务程序。为了将终端阻塞减到最小,中断驱动程序只处理那些需要最小时间的工作,把其他耗时的任务排列到网络任务的工作队列中。为了排列任务级的包接收处理工作,网络驱动程序中断服务程序必须调用netJobAdd()函数。在调用netJobAdd()函数时,应当指定任务级处理数据包的驱动程序入口。然后由netJobAdd()把函数指派到网络系统任务--tNetTask的工作队列中。VxWorks通过tNetTask处理任务级的网络处理。

tNetTask调用队列中处理程序如下:(1)包接收程序:把接收到的数据包上传到网络缓冲区的堆栈中,通过一个调用上传给MUX。(2)释放所有发送帧程序:程序调用netClFree()函数释放发送缓冲区中所有已经发送的数据帧。

4 结束语

本文分析了RT8185L网卡驱动程序在VxWorks操作系统下的实现。在网卡驱动的设计开发过程中,着重说明网卡驱动在结构、在整个系统中的位置,中断处理,收发包存储空间分配等。RT8185L网卡驱动程序应用于我校综合导航显控台,有重要的现实意义。由于主控器内部的差异,其他网卡在初始化、接收数据和发送数据方面会不同,但是在其他方面,可以参考上述驱动程序。

[1]周启平、张扬,VxWorks下设备驱动程序及BSP开发指南.[M]中国电力出版社.2004.

[2]孔祥营、张保山、俞烈彬,VxWorks驱动及分布式编程.

[M]中国电力出版社.2007.

[3]Wind River Systems,Inc.VxWorks Network Protocol

Toolkit Users Guide[K].California:Wind River,1999.

[4]王守林、苏建华,VxWorks下PCI网卡驱动程序结构与实现.[J]工业控制计算机.2005

[5]景琦,基于VxWorks的设备驱动和网络通信.[D]西安科技大学.2006.

猜你喜欢
网络设备驱动程序网卡
在DDS 中间件上实现双冗余网卡切换的方法
一种基于C# 的网络设备自动化登录工具的研制
Server 2016网卡组合模式
计算机硬件设备驱动程序分析
读编往来
基于列车监测网络设备的射频功放模块设计
基于MPC8280的CPU单元与内部总线驱动程序设计
基于三层交换技术架构数字化校园网络设备的配置与管理