梅 涛,黄堡垒,徐晓光
(中航工业西安计算技术研究所 基础软件室,陕西 西安 710068)
嵌入式系统网卡驱动模型设计与实现
梅涛,黄堡垒,徐晓光
(中航工业西安计算技术研究所 基础软件室,陕西 西安710068)
摘要以嵌入式系统下网卡驱动的功能为出发点,提出了一种嵌入式系统下网卡驱动设计模型,通过在网络协议层与网卡驱动之间增加一个网卡驱动功能抽象中间层,有效地隔离上层网络协议与底层具体的网卡驱动,使得驱动实现的细节对上层协议透明。中间层作为网卡驱动的抽象层,在提供网卡驱动控制服务的同时,可实现网络层协议与驱动之间的交互;有效地简化网卡驱动的设计工作。通过在合适的平台上进行验证和测试,实验结果证明该模型能有效指导嵌入式系统网卡驱动的设计,网卡驱动能正确,可靠地工作,网络通信功能正常。
关键词嵌入式系统;网卡驱动模型;设计与实现
随着物联网[1]、可穿戴设备[2]的发展,嵌入式设备中支持以太网通信已成为必然趋势,客观上要求各嵌入式操作系统支持TCP/IP网络协议栈功能。各种嵌入式操作系统的使用,以及众多硬件平台的出现,嵌入式领域对网络协议栈的需求日趋复杂。嵌入式系统开发人员面临种类繁多的网络硬件平台需进行驱动的适配。本文以嵌入式系统下网卡驱动的功能为出发点,提出一种网卡驱动开发模型;选择相应的硬件和软件平台,对网卡驱动开发模型进行验证,并对设计的驱动进行的测试,结果证明该模型能够正确有效地指导嵌入式系统网卡驱动的设计。
1网卡驱动模型
网卡驱动实现链路层与网络层之间的信息传递功能。并通过网卡驱动实现对以太网控制器的初始化,实现对网卡设备的控制,进而实现数据转发的工作。网络驱动模型定义,如图1所示。
图1 嵌入式系统网络驱动结构
网络协议驱动提供基于上层协议所需的通信、控制接口,能处理上层协议的数据和控制命令,并将数据和控制命令发送给底层的设备驱动。在网络协议驱动与网卡设备驱动之间,增加了一个驱动功能抽象中间层,该层提供网卡驱动与协议驱动之间的交互功能。
1.1网卡设备与驱动功能抽象层
驱动功能抽象层(下文简称中间层)是网络设备控制和通信功能的抽象集合,为网络协议和驱动程序提供了一套通用的编程接口;该功能位于链路层和网络层之间。通过该层可屏蔽网络协议对底层具体网络设备的感知,中间层相当于上层协议与网络驱动程序之间的管道,通过该层,上层网络协议可与不同的网络设备驱动交互。中间层的加入有效隔离了网络设备驱动和上层的网络协议,中间层屏蔽了底层网络设备的差异性和上层网络组件的特殊性,降低了增加网络设备的和扩展网络组件的复杂性。
中间层实现对具体网络驱动的封装。同时为下层具体的网卡驱动提供交互的入口。中间层提供的功能是通用网卡驱动功能的一个集合,主要实现数据和控制命令的交互。该层的目的是为了隔离上层协议(如TCP/IP协议)与底层驱动之间的直接相关性,将具体的驱动与上层协议经过隔离,简化驱动的设计。中间层负责层管理网络协议与底层驱动程序之间的通信,使数据发送和接收变得简单。
1.2驱动和协议层数据管理
网络设备使用缓冲区描述符组织所需的数据缓冲空间。在设备驱动初始化时,分配接收和发送缓冲区。当接收数据包时,首先把数据存放在设备的接收缓冲区,然后将缓冲区传递给中间层。当发送数据时,首先包发送缓冲区的数据复制到设备的发送缓冲区中,再将缓冲区放置到发送队列中,启动数据发送过程,数据发送完成后将数据缓冲区归还给内存池。
网络中通常使用链式结构管理网络数据。数据链上的每个节点包含一个给定大小的数据块,数据块由一个控制节点进行索引。数据块的控制节点形成一个数据链,一个数据链表示一个有效的网络数据包[3],通过链头节点构成网络中数据包的链。网卡驱动初始化时,通过控制节点为数据节点分配空间;在初始化网卡数据缓冲时,为数据节点分配的空间,并与网卡驱动使用的缓冲空间进行关联。网络数据包的组织形式,如图2所示。
图2 网络数据包结构图
在网络通信过程中存在多种大小的数据块,不同的数据包可能使用不同的数据块。不同大小的数据块使网络数据包的组织更加灵活;但在具体的网络设备驱动设计中,通常使用统一的数据块大小,从而简化网卡驱动的开发。同一个数据块可能会被多个数据包引用,当数据块对应的控制节点中引用计数[4]为0时,才能释放对应的数据块空间。
2网卡驱动实现
网卡驱动主要实现以下功能模块:(1)向系统中注册网络设备;(2)网络设备空间初始化;(3)网络数据收发处理;(4)网络设备启动。
2.1网卡设备注册
在设备初始化过程中,系统查找 “网络设备配置表”的全局数据结构。该表定义了当前系统中配置的网络设备的相关信息,包括设备编号,设备驱动入口,设备初始参数串等信息。
网络设备配置表结构定义如下:
typedef struct nd_tbl_entry
{
int unit;/* 设备单元号 */
ND_OBJ* (*LoadFunc) (char*,void*);/* 设备驱动入口. */
char* LoadString;/* 设备初始化参数串. */
void* ndParam;/* 驱动参数指针 */
BOOL processed;/* 设备初始化标志 */
char ndRes[5];
} ND_TBL_ENTRY;
其中,ND_OBJ表示网卡设备对象数据结构,为网卡设备通用结构[5],一个节点代表网卡设备链的一个设备。具体的网卡设备,通过在设备结构定义中引用该结构,实现具体设备驱动与上层协议的关联。不同的网卡设备对应的“网络设备配置”参数可能不尽相同。初始化时根据配置表中的信息,逐个完成具体设备的解析。
网卡设备的注册,另外一个主要工作完成网卡驱动操作表的注册。网卡驱动操作表数据结构定义如下:
typedef struct net_funcs
{
STATUS (*start) (ND_OBJ*);
STATUS (*stop) (ND_OBJ*);
STATUS (*unload) (ND_OBJ*);
int (*ioctl) (ND_OBJ*,int,caddr_t);
STATUS (*send) (ND_OBJ*,PKT*);
STATUS (*mCastAddrAdd) (ND_OBJ*,char*);
STATUS (*mCastAddrDel) (ND_OBJ*,char*);
STATUS (*mCastAddrGet) (ND_OBJ*,MULTI_TABLE*);
STATUS (*pollSend) (ND_OBJ*,PKT*);
STATUS (*pollRcv) (ND_OBJ*,PKT*);
M_BLK_ID (*formAddress) (PKT*,PKT*,PKT*,BOOL);
STATUS (*packetDataGet) (PKT*,LL_HDR_INFO *);
STATUS (*addrGet) (PKT*,PKT*,PKT*,PKT*,PKT*);
int (*endBind) (void*,void*,void*,long);
} NET_FUNCS;
根据上述定义,网络驱动操作表分为如下4类:(1)设备控制服务,包括网卡设备启动、停止、卸载服务以及IO控制服务;(2)网卡数据转发服务,包括数据发送服务;以及轮询方式下数据发送和接收服务;(3)支持多播的服务,包括为网卡增加、删除多播地址的服务,获取多播地址的服务;(4)其他支持服务,包括以太网地址操作相关服务,构造以太网地址,获取以太网数据包头指针,获取以太网数据包的地址等服务。
其中,第(4)类服务,不同的协议类型对应的服务不尽相同。若基于以太网通信,网络层协议提供了缺省的服务,网卡驱动直接使用相关服务即可。根据使用过程中网卡设备的实际情况,可以灵活的配置网卡的驱动操作表。若网卡使用中断方式进行通信,则在驱动操作表中无需提供轮询操作的服务。不使用多播时,亦可不提供多播支持服务等。
当完成设备的加载和设备驱动操作表的注册工作,网卡设备的注册过程基本完成。同时,设备注册过程中还需完成网卡设备MAC[6]层和PHY[7]的初始化工作。由于网卡设备MAC层和PHY的初始化工作主要与网卡硬件直接相关,需参考网卡硬件手册,在此不再赘述。
2.2网卡设备空间初始化
网卡设备空间初始化工作完成网卡缓冲所需空间的分配和初始化工作。网卡的数据传输通过DMA完成,DMA操作对象是网卡设备缓冲描述符。描述符用于指定MAC数据帧的缓冲地址,每个描述符最多可指定两个缓冲地址,缓冲大小有严格的限制,一个描述符不能容纳一帧的数据时,需使用多个描述符。描述符的组织结构有如下两种方式:(1)环形缓冲组织结构;(2)链式缓冲组织结构[8]。环形缓冲的组织结构,如图3所示。
图3 网卡缓冲环形结构
链式缓冲组织结构如图4所示。
图4 网卡缓冲链式结构
网卡设备空间初始化时,根据具体使用方式,完成网卡设备缓冲描述符的分配,并为对应的缓冲分配数据存储空间。为简化网卡驱动设计,通常在网卡驱动中仅使用相同大小的缓冲空间,构建设备缓冲区。
设备缓冲的分配和初始化完成后需要实现网卡设备缓冲获取和释放的机制。在获取缓冲时,要保证对缓冲空间访问的互斥性,确保没有其他任务同时操作当前的缓冲。释放不再使用的缓冲时,确保没有其他任务继续使用当前缓冲空间。网卡设备空间初始化,还包括网卡驱动数据结构所需空间的分配和初始等工作。
2.3网卡数据处理
网卡数据处理主要完成数据接收和发送工作。
(1)数据接收过程。网卡将收到的数据存放到接收缓冲中,然后将数据转发给上层协议,数据接收过程如图5所示。
图5 网卡驱动接收数据模型
数据接收过程,驱动完成如下工作:1)将数据存放到设备的接收缓冲,获取当前空闲的缓冲,存放收到的数据帧;2)将数据上传给上层协议,包括数据包结构的调整,驱动需根据上层协议栈定义的格式组织数据包。
驱动在数据上传的过程中,弱直接复制数据到上层协议,将伴随一次数据的复制操作,导致网卡接收效率降低。通常直接将网卡设备所需的接收缓冲指向上层协议使用的数据缓冲,通过缓冲地址的传递,减少数据的复制操作,提高数据传输效率;
(2)数据发送过程。该过程较简单,将上层协议发送的数据,复制到网卡的发送缓冲中,启动发送操作,将数据发送出去,更新网卡的设备状态,然后回收发送缓冲。发送过程如图6所示。
图6 网卡驱动数据发送模型
在数据发送过程中,也存在一次数据复制操作,为提高网卡数据发送效率,直接将网卡的发送缓冲指向上层协议的数据缓冲,通过缓冲地址的传递,减少一次数据复制的过程。
数据发送过程中,驱动需保证数据操作的互斥性,在操作网卡发送缓冲时,需要保证当前操作是独立的,防止数据被破坏。在驱动实现中一般通过加锁的方式,提供数据操作的独立性。获取网卡的发送缓冲时,需先获取对应的互斥锁,才能进行后续的操作。在数据发送完成后,需要回收发送缓冲;
(3)数据处理方式。根据网卡处理数据触发机制的不同,分为中断方式和轮询方式两种。
中断方式下,网卡数据的收发均通过中断触发。当发送数据时,将数据复制到网卡的发送缓冲中,启动发送,数据发送完成后,产生发送完成中断,更新网卡的设备状态,完成数据发送过程。当有数据到达时,触发网卡的数据接收中断,中断处理服务进行数据的接收,更新网卡的状态;然后上传数据,完成一次数据接收中断处理。
轮询方式下,处理器定时去查询网卡的状态寄存器,当有数据发送时,启动轮询发送服务,将数据发送出去,然后更新网卡的状态,回收发送缓冲,完成一次发送过程。如果有数据到达,启动轮询方式下的数据接收,给协议上传数据,完成一次轮询数据接收过程。
相对于轮询方式,频繁查询网卡的状态,浪费大量的处理器时间;中断方式网卡的数据处理效率较高。在实时性要求较高的环境下,通常使用中断方式。当然,如果数据量较小,但数据达到频率高,轮询方式可能更合适。因此,选择那种数据处理方式,需要根据实际使用情况进行抉择。
2.4启动网卡设备
当前述工作均已完成,此时网卡驱动的基本功能便已实现,网卡设备也已处于就绪状态,可以启动设备开始工作。启动网卡设备,主要实现网卡状态的设置和检查工作,包括设备缓冲初始化完成的检查,PHY状态的检查等;中断方式下,使能网卡的中断,正确连接网卡的中断服务程序;然后将网卡置于正常工作模式。
3验证与测试
为验证模型的可用性和正确性,选择了PowerPC 8640[9]单核处理器作为功能验证的目标硬件平台,该平台集成了一款Motorola生产的10/100 M自适应以太网控制器;选择某型嵌入式实时操作系统作为驱动功能验证的软件环境。实验中实现了基于中断方式的驱动操作表;通过在系统中分配一块IO空间,作为网卡所需的缓冲空间,完成设备空间初始化以及MAC层和PHY层的初始化工作;当网卡初始化工作完成之后,通过设备启动服务启动网卡。将验证平台作为目标端,与之进行以太网通信测试的是一台PC机。测试环境如图7所示。
图7 网络测试环境
测试过程中主要进行了黑盒测试和压力测试。黑盒测试主要验证网卡根据输入能获得正确的输出;压力测试主要验证网卡驱动工作的稳定性。黑盒测试通过读写网卡相关寄存器的方式进行验证。验证时机包括数据帧到达,中断发生时网卡寄存器状态的变化。黑盒测试结果证明网卡能准确响应各种命令请求,网卡工作正常。压力测试选择基于UDP/TCP协议的以太网通信案例。测试过程在PC机端通过网络抓包工具wireShark[10]进行数据捕获,通过对比抓包获取的数据与发送数据内容,以验证网卡驱动数据通信功能是否可靠。基于UDP、TCP协议的通信测试结果,如图8和图9所示。
图8 基于UDP的通信测试结果
图9 基于TCP的通信测试结果
基于UDP/TCP的通信测试,实验结果证明网卡数据收发工作正确,以太网通信过程稳定,网卡驱动数据处理功能正确可靠,网卡工作正常。
4结束语
本文介绍了一种嵌入式系统中网卡驱动的设计模型。该模型通过在具体的网卡设备驱动与上层网络协议之间引入网卡驱动功能抽象层,通过该层能有效隔离上层的网络协议与底层具体的网络设备。网卡驱动功能抽象层作为网卡驱动功能集合,提供了一种上层协议与底层驱动交互的机制,使得底层设备的变化对上层协议透明,简化了嵌入式系统中网卡驱动设计发的复杂度,为嵌入式系统下网卡驱动的开发提供了参考。同时,通过选择实际的验证测试平台,验证该模型的可用性和正确性。根据实际的验证测试结果,证明该模型能够正确有效的指导嵌入式系统下网卡驱动的设计与实现。
参考文献
[1]Jaydip Sen.Internet of things:application and challenges in technology and standardization[J].Wireless Personal Communication,An International Joumal,2011,58(2):49-69.
[2]Pedro Castillejo.An internet of things approach for managing smart service provided by wearable device[J/OL].(2014-06-15)[2015-07-20]http://dx.doi.org/10.1155/2013/190813,2013.
[3]John Ray.TCP/IP开发使用手册[M].北京:机械工业出版社,1999.
[4]Shahriyar R,Blackburn S M,Yang X,et al.Taking off the gloves with reference counting immix[C].Indianapolis,USA:in Proceedings of the 24th ACM SIGPLAN conference on Object Oriented Programming Systems,Languages and Applications,2013.
[5]曹桂平.VxWorks设备驱动开发详解[M].北京:电子工业出版社,2011.
[6]IEEE-SA.IEEE Standard for ethernet,IEEE 802.3[S].USA:IEEE,2012.
[7]IEEE-SA.Local and metropolitan area network standards,IEEE 802.2[S].USA:IEEE,1998.
[8]樊东东,莫澜.Linux内核源码剖析—TCP/IP实现:上册[M].北京:机械工业出版社,2011.
[9]Freescale Inc.MPC8640D microprocessor family user’s manual[M].USA:Freescale Inc,2010.
[10]Free Software Foundation,Inc.Wireshark user’s guide[M].USA:Free Software Foundation,Inc 2004.
Design and Realization of Network Driver Model in Embedded System
MEI Tao,HUANG Baolei,XU Xiaoguang
(Software Research Room,Aeronautical Computing Technique Research Institute,Xi’an 710068,China)
AbstractA model of network driver in embedded system is proposed with emphasis on its function.There is an abstract mid-layer between the network protocols and network drivers,which separates the upper layer network protocols from network drivers effectively,thus making concrete network drivers detail transparent to network protocols.The mid-layer is an abstract layer of network driver,which supports driver function abstraction while supporting command exchange between the network protocols upper layer and drivers.The cost of network driver designing is decreased because of the mid-layer.The validation and testing experiments are carried out.The results show that of network drivers in embedded system designed based on this model work correctly and reliably with normal network communication.
Keywordsembedded system;model of network driver;design and realization
中图分类号TP316.2
文献标识码A
文章编号1007-7820(2016)04-111-05
doi:10.16180/j.cnki.issn1007-7820.2016.04.029
作者简介:梅涛(1984—),男,硕士,工程师。研究方向:嵌入式实时操作系统和网络。
基金项目:工信部民用飞机专项科研基金资助项目(MJ-S-2012-05)
收稿日期:2015- 08- 19