首页> 中国专利> 基于嵌入式系统的网络交互体系及网络交互方法

基于嵌入式系统的网络交互体系及网络交互方法

摘要

本发明公开了一种基于嵌入式系统的网络交互体系及网络交互方法,所述的网络交互体系包括:用户态中的网络接口、网络驱动、用户态网络协议栈以及第一IO接口;第二IO接口以及驱动接口;核心态中的内核网络协议栈、虚拟网络驱动以及虚拟字符设备驱动;以及,共享内存。所述的网络交互方法包括以下步骤:初始化;以及:当消息携带由用户态网络协议栈执行的通用命令时,消息的接收与发送;当消息携带由内核网络协议栈执行的通用命令时,消息的接收与发送。本发明将用户态的网络驱动与内核网络协议栈进行衔接,实现了传统网络应用程序也能在用户态网络驱动下使用,优化了网络通讯的性能。

著录项

  • 公开/公告号CN102662910A

    专利类型发明专利

  • 公开/公告日2012-09-12

    原文格式PDF

  • 申请/专利权人 浙江大学;

    申请/专利号CN201210081358.2

  • 发明设计人 王总辉;陈文智;黄大鹏;

    申请日2012-03-23

  • 分类号G06F15/173;

  • 代理机构杭州天勤知识产权代理有限公司;

  • 代理人胡红娟

  • 地址 310027 浙江省杭州市西湖区浙大路38号

  • 入库时间 2023-12-18 06:28:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-10-15

    授权

    授权

  • 2012-11-07

    实质审查的生效 IPC(主分类):G06F15/173 申请日:20120323

    实质审查的生效

  • 2012-09-12

    公开

    公开

说明书

技术领域

本发明涉及嵌入式系统,特别涉及一种基于嵌入式系统的网络交互体 系及网络交互方法。

背景技术

当前计算机系统发展的趋势是体积的减小,于是便出现了掌上电脑和 与之适应的嵌入式系统。嵌入式系统为一种计算机操作系统,当其运行在 如掌上电脑一类的计算机上,往往具有实时系统的特征,但嵌入式系统在 体积、内存容量以及电源等方面受到限制。这就要求操作系统和应用程序 必须有效地对内存进行管理。由于嵌入式系统一般不使用虚拟储存技术, 开发人员往往仅能对有限的物理内存做适应开发。

现有技术的处理器或处理器核能够在两种模式下运行,即内核态和用 户态。当嵌入式系统通过系统调用进入内核态时,处理器执行内核代码。 完成嵌入式系统的一些功能。当嵌入式系统进入内核态时,应用程序的上 下文将从当前执行的处理器或处理内核上切换出去,即现有技术的嵌入式 系统采用了“上下文切换”来支持内核态与用户态的切换。这种上下文切 换机制带来了许多物理内存上的开销,尤其是对于一些操作系统密集型应 用,若频繁进行上下文切换对性能有较大的影响,降低嵌入式系统的运行 速度。

为了在嵌入式系统的网络交互方面克服上述问题,当前的许多嵌入式 系统已将网络驱动及网络协议栈从内核态实现变为在用户态实现,一般的 网络应用程序可通过修改其内部代码以支持网络协议栈,其基于的网络交 互体系包括:

网络接口;

实现于用户态的网络驱动,将消息读取至网络接口;

实现于用户态的网络协议栈,包括多个特定的网络协议层;

IO接口,被安排用于从网络应用程序接收消息与向网络应用程序传 递消息;所述的消息为携带为由特定网络协议层执行的通用命令。

这种将网络驱动以及网络协议栈实现在用户态的嵌入式系统能够在 很大程度上减少了内核态与用户态之间的上下文切换,缩短了数据的传递 路径,并且提高了网络交互性能,嵌入式系统的内存也得到了有效的利用。

但此种嵌入式系统的网络驱动无法与内核网络协议栈衔接。由于一些 网络应用程序(包括网络调试工具)无法修改其内部代码,故仅支持内核 协议栈,网络驱动无法直接与这些网络应用程序进行数据交换。因此,这 种将网络驱动以及网络协议栈实现在用户态的嵌入式系统会导致部分网 络应用程序无法使用。

发明内容

本发明的目的在于提供一种基于嵌入式系统的网络交互体系及网络 交互方法,能够对用户态网络驱动与内核网络协议栈进行衔接,实现了仅 支持内核网络协议栈的网络应用程序也能在用户态网络驱动场景下使用, 该类型的嵌入式系统得到了普适。

一种基于嵌入式系统的网络交互体系,所述的嵌入式系统能够通过系 统调用进入用户态以及内核态,所述的网络交互体系包括:

用户态中的网络接口、网络驱动、用户态网络协议栈以及第一IO接 口;第二IO接口以及驱动接口;

核心态中的内核网络协议栈、虚拟网络驱动以及虚拟字符设备驱动; 以及,

共享内存;

所述的第一IO接口以及第二接口用于从网络应用程序接收消息以及 向网络应用程序传递消息;其中,通过第一IO接口进行交互的消息携带 由用户态网络协议栈的特定网络协议层执行的通用命令,通过第二IO接 口进行交互的消息携带由内核网络协议栈的特定网络协议层执行的通用 命令;

所述的用户态网络协议栈,处理用于执行的通用命令,依据通用命令 生成由网络驱动执行的特定命令;

所述的内核网络协议栈,处理用于执行的通用命令,依据通用命令生 成由虚拟网络驱动执行的特定命令;

虚拟网络驱动,执行内核网络协议栈的特定命令,访问内核网络协议 栈并实现共享内存与内核网络协议栈之间的消息交互;

驱动接口,访问共享内存并实现网络驱动与共享内存之间的消息交互; 以及,

虚拟字符设备驱动,用于向驱动接口提供内核态的控制接口以及将所 述的共享内存映射至用户态的地址空间。

下面介绍本发明的优选技术方案。

具体地,所述的第二IO接口为套接字接口。

进一步地,所述的共享内存被组织成循环缓冲区,并采用无锁的方式 进行读写。

进一步地,所述的驱动接口通过调用vn_put函数以及vn_get函数读取 共享内存中的数据。

进一步地,虚拟字符设备驱动的控制接口包括ioctl接口以及mmap接 口。

一种利用如上所述网络交互体系实现的网络交互方法,包括以下步骤:

(1)对网络交互体系的初始化,加载虚拟络驱动以及虚拟字符设备驱 动,建立共享内存;

(2)当所述的消息携带由用户态网络协议栈执行的通用命令,消息的 接收或发送包括步骤:

在网络接口或第一IO接口中载入消息;

读取所述的消息;

基于所述的消息,对网络驱动以及用户态网络协议栈发起操作;

向网络应用程序发送消息或从网络应用程序传送消息,并在完成操作 时在网络接口或第一IO接口中载入响应;以及,

读取所述的响应;

(3)当所述的消息携带由内核网络协议栈执行的通用命令,消息的 接收或发送包括步骤:

在网络接口或第二IO接口中载入消息;

读取所述的消息;

基于所述的消息,对网络驱动、驱动接口、共享内存、虚拟网络驱动 以及内核网络协议栈发起操作;

向网络应用程序发送消息或从网络应用程序传送消息,并在完成操作 时在网络接口或第二IO接口中载入响应;以及,

读取所述的响应。

在步骤(1)中,所述的建立共享内存,包括步骤:

(1.1)申请两段各512个页面大小的空间,计算出每个页的页框号, 将这些页全设置成为保留页;

(1.2)网络驱动通过驱动接口控制所述的虚拟字符设备驱动,将所述 两段空间映射到用户态的地址空间。

进一步地,所述的共享内存包括发送缓冲区以及接收缓冲区,在步骤 (3)中,

所述的向网络应用程序发送消息,包括步骤:

网络驱动调用驱动接口检查共享内存的接收缓冲区是否满,若满则丢 包,不满则通过驱动接口将消息发送至接收缓冲区;以及,

内核网络协议栈调用虚拟网络驱动轮询接收缓冲区,通过虚拟网络驱 动读取接收缓冲区内的消息并与网络应用程序进行消息交互;

所述的从网络应用程序传送消息,包括步骤:

内核网络协议栈调用虚拟网络驱动检查共享内存的发送缓冲区是否 满,若满则丢包,不满则通过虚拟网络驱动将消息放入共享内存的发送缓 冲区;以及,

网络驱动调用驱动接口轮询发送缓冲区,通过驱动接口读取发送缓冲 区内的消息并与网络接口进行消息交互。

更进一步地,所述的轮询包括步骤:

a、在共享内存上建立工作队列;

b、将轮询任务放入到工作队列;

c、检查共享内存的缓冲区是否为空,如果未空则一直读取消息;如 果共享内存的缓冲区为空,则将轮询任务放入工作队列等待指定的时间。

为了将网络驱动收到的消息传递给内核网络协议栈(即消息的接收) 或将内核上层网络协议栈需要发送的网络消息包传递给用户态网络驱动 程序(即消息的发送),首先得有一种内核态与用户态的通讯方式。

由于传统的内核态与用户态通讯方式是系统调用,频繁地系统调用会 带来频繁的上下文切换,带来较大的性能损失,另外由于内核态和用户态 地址空间的不同,通过系统调用的方式在两态间传递消息必须进行消息拷 贝,这又会带来性能损失,为了避免这些性能损失,采用建立共享内存的 方式实现内核态与用户态的通讯,大大减少了系统调用的次数与消息的拷 贝次数。同时,为了优化共享内存,可将所述的共享内存组织为一循环缓 冲区,并采用无锁方式进行读写,能够避免使用互斥锁带来的开销。但这 种读写方式必须使用轮询方式来查看缓冲区是否为满或为空。

但一般的轮询由于一直检测缓冲区会导致CPU负荷过重,造成很大 的性能损失。因此,本发明在传统的轮询方式上进行优化,在缓冲区的读 取端读端若有消息则移植读取,直到缓冲区空,即将读取操作放入至一个 工作队列等候,并在指定的时间间隔后重启读取操作,这时缓冲区若有新 的消息则开始读消息;若此时缓冲区再空,则再次将读取操作放入工作队 列中等待指定的时间,这样就避免了持续读取操作带来的CPU性能开销。

实现内核态与用户态之间的通讯需要将消息与上层网络协议栈衔接 起来,通过虚拟网络驱动能够实现内核网络协议栈与用户态网络驱动的消 息交互:虚拟网络驱动可按网络驱动模型编写,实现消息的收发。

虚拟字符设备驱动实现了对系统控制,包括建立共享内存,用户态网 络驱动可通过操作该虚拟字符设备驱动对应的设备文件对系统进行控制, 如ioctl以及mmap,建立的共享内存申请分配也是通过该字符设备驱动的 mmap方法实现。

本发明能够在网络驱动下实现内核网络功能,基于传统套接字的网络 应用程序能够在用户态网络驱动下执行,同时保证很高的性能;本发明将 用户态的网络接口与内核网络协议栈进行衔接,实现了传统网络应用程序 也能在用户态网络驱动下使用,并且优化了网络通讯的性能。

附图说明

图1是本发明网络交互体系的结构示意图;

图2是本发明网络交互方法的流程示意图;

图3是本发明网络交互方法中消息接收流程示意图;

图4是本发明网络交互方法中消息发送流程示意图。

具体实施方式

下面结合附图详细介绍本发明的具体实施方式。

一种基于嵌入式系统的网络交互体系,如图1所示,包括系统用户态 中的网络接口、网络驱动、第一IO接口、第二IO接口、驱动接口以及用 户态网络协议栈,系统内核态中的虚拟字符设备驱动、虚拟网络驱动以及 内核网络协议栈,共享内存。

所述的用户态网络协议栈以及内核网络协议栈均包括多个特定的网 络协议层。

由于绝大部分的网络应用程序(下称一类网络应用程序)支持用户态 网络协议栈,且实现于用户态的网络驱动能直接访问用户态网络协议栈, 因此,所述的网络交互体系在一类网络应用程序的网络交互中能够在用户 态直接实现网络应用程序的网络交互过程,具体地,网络交互体系包括:

第一IO接口,用于从一类网络应用程序接收消息以及向一类网络应 用程序传递消息;所述的消息携带由用户态网络协议栈的特定网络协议层 执行的通用命令;

用户态网络协议栈,处理用于执行的通用命令,依据通用命令生成由 网络驱动执行的特定命令;

网络驱动,执行用户态网络协议栈的特定命令,访问用户态网络协议 栈并实现网络接口与网络协议栈之间的消息交互。

在用户态的网络应用程序中,存在部分的网络应用程序(下称二类网 络应用程序)仅支持内核网络协议栈,且实现于用户态的网络驱动不能直 接访问内核网络协议栈,因此,所述的网络交互体系在二类网络应用程序 的网络交互中须在内核态实现网络应用程序的网络交互过程。具体地,网 络交互体系包括:

第二IO接口,用于从二类网络应用程序接收消息以及向二类网络应 用程序传递消息;所述的消息携带由内核网络协议栈的特定网络协议层执 行的通用命令;

内核网络协议栈,处理用于执行的通用命令,依据通用命令生成由虚 拟网络驱动执行的特定命令;

虚拟网络驱动,执行内核网络协议栈的特定命令,访问内核网络协议 栈并实现共享内存与内核网络协议栈之间的消息交互;

驱动接口,访问共享内存并实现网络驱动与共享内存之间的消息交 互;以及,

虚拟字符设备驱动,用于向驱动接口提供内核态的控制接口以及将所 述的共享内存映射至用户态的地址空间。

所述的共享内存由两块内存构成,一块用于作为发送缓冲区,另一块 用于作为接收缓冲区。两块缓冲区均被组织成循环缓冲区,并采用无锁的 方式进行读写,这样能够避免使用互斥锁带来的开销。以共享内存的方式 实现内核态与用户态的通信,能够大大减少系统调用的次数与数据的拷贝 次数。

所述的第二IO接口为套接字接口。为了实现网络应用程序与内核网 络协议栈进行消息交互,创建一个套接字接口,并设置套接字接口的设置 通讯类型(如TCP、UDP、广播等)。在网络应用程序与内核网络协议栈 进行消息交互时,调用send、recv等用户态套接字库函数进行消息交互。

在本实施例中,由于用户态的网络驱动无法对网络交互体系内核态的 部分进行控制,也无法直接对共享内存进行访问,因此本体系首先设置了 驱动接口,能够实现网络驱动对共享内存中数据的读写。

更为具体地,由于网络驱动需对体系数据传递的控制,驱动接口具体 需实现如下功能:

1、为网络驱动提供操作共享内存的方法,包括通过该驱动接口执行 vn_put函数以及vn_get函数,其中,vn_put函数实现了将数据写入接收缓 冲区的功能,vn_get函数实现了将数据从发送缓冲区读取的功能;

2、系统初始化,即在网络驱动运行时,对内核态中虚拟网络驱动以 及虚拟字符设备驱动的程序加载;包括通过该驱动接口执行vn_init函数, 其中,vn_init函数实现了系统的初始化,配置共享内存的在用户空间的 mac地址,即将共享内存映射至用户态的地址,并发送开始收发命令字。

3、封装屏蔽共享内存的内部细节。

由于驱动接口无法直接调用内核态中的文件,为了实现驱动接口的上 述功能并进一步完善上述功能,本体系还于内核态设置了虚拟字符设备驱 动。

虚拟字符设备驱动用于向驱动接口提供内核态的控制接口以及将所 述的共享内存映射至用户态的地址空间;通过驱动接口以及虚拟字符设备 驱动,实现于用户态的网络驱动能够对内核态中相应的文件进行读写特定 操作并能够在内核态中触发执行表1所示函数功能。

表1函数及其执行功能

  函数名   功能   vn_cdev_open(open)   赋值私用数据指针   vn_cdev_exit(release)   无   vn_cdev_ioctl(ioctl)   提供ioctl功能   vn_cdev_mmap(mmap)   提供内存映射功能

其中,对驱动接口提供的控制接口,包括ioctl接口以及mmap接口, 分别实现对vn_cdev_ioctl函数的调用以及vn_cdev_mmap函数的调用;实 现的功能如下:

一、vn_cdev_ioctl函数,在此处实现了3个控制命令字,即:

VN_IOC_START:开始数据收发;

VN_IOC_STOP:暂停数据收发;以及,

VN_IOC_MAPDIR:选择mmap函数指定的内存块。

二、mmap函数,调用remap_pfn_range函数将之前初始化时申请的 内存空间映射到用户态的地址空间中,从而实现共享内存。

虚拟网络驱动主要负责将内核网络协议与共享内存衔接起来,执行内 核网络协议栈的特定命令,访问内核网络协议栈并实现共享内存与内核网 络协议栈之间的消息交互,使得网络驱动能够间接地访问内核网络协议 栈,实现一个虚拟的网络接口。通过用户态网络配置工具ifconfig、vconfig 等可以对该虚拟网络驱动进行配置,该虚拟驱动按照传统网络设备模型编 写,具体实现函数如表2所示。

表2虚拟网络驱动的实现函数

一种利用了上述网络交互体系的网络交互方法,实现了网络应用程序 与网络之间的消息交互过程,如图2所示,包括消息的接收以及消息的发 送,包括以下步骤:

(1)对网络交互体系的初始化,加载虚拟络驱动以及虚拟字符设备 驱动,建立共享内存;

(2)当所述的消息携带由用户态网络协议栈执行的通用命令,消息 的接收或发送包括步骤:

在网络接口或第一IO接口中载入消息;

读取所述的消息;

基于所述的消息,对网络驱动以及用户态网络协议栈发起操作;

向网络应用程序发送消息或从网络应用程序传送消息,并在完成操作 时在网络接口或第一IO接口中载入响应;以及,

读取所述的响应;

(3)当所述的消息携带由内核网络协议栈执行的通用命令,消息的 接收或发送包括步骤:

在网络接口或第二IO接口中载入消息;

读取所述的消息;

基于所述的消息,对网络驱动、驱动接口、共享内存、虚拟网络驱动 以及内核网络协议栈发起操作;

向网络应用程序发送消息或从网络应用程序传送消息,并在完成操作 时在网络接口或第二IO接口中载入响应;以及,

读取所述的响应。

进一步地,在步骤(1)中,所述的建立共享内存,包括步骤:

(1.1)申请两段各512个页面大小的空间,计算出每个页的页框号, 将这些页全设置成为保留页;

(1.2)网络驱动通过驱动接口控制所述的虚拟字符设备驱动,将所述 两段空间映射到用户态的地址空间。

更为具体地,共享内存的建立即内存分配的过程进一步包括:

对网络交互体系的初始化,调用get_free_pages申请两段各512个页 面大小的空间,分别名为rx_buff和tx_buff;

调用virt_to_page计算出每个页的页框号,对每个页调用 SetPageReserved,将这些页全设置成为保留页;

网络驱动通过驱动接口调用map函数,继而调用了虚拟字符设备驱动 提供的mmap函数,将这两段内存映射到用户态的地址空间。

进一步地,所述的共享内存包括发送缓冲区以及接收缓冲区,在步骤 (3)中,

所述的向网络应用程序发送消息,包括步骤:

网络驱动调用驱动接口检查共享内存的接收缓冲区是否满,若满则丢 包,不满则通过驱动接口将消息发送至接收缓冲区;以及,

内核网络协议栈调用虚拟网络驱动轮询接收缓冲区,通过虚拟网络驱 动读取接收缓冲区内的消息并与网络应用程序进行消息交互;

所述的从网络应用程序传送消息,包括步骤:

内核网络协议栈调用虚拟网络驱动检查共享内存的发送缓冲区是否 满,若满则丢包,不满则通过虚拟网络驱动将消息放入共享内存的发送缓 冲区;以及,

网络驱动调用驱动接口轮询发送缓冲区,通过驱动接口读取发送缓冲 区内的消息并与网络接口进行消息交互。

所述的消息在本实施例即为指定MAC地址或者广播包(即一般意义 上的数据包);

向网络应用程序发送消息,即消息的接收,采用经优化的轮询方式, 当接收缓冲区中有数据,虚拟网络驱动则不断地从接收缓冲区中取出数 据,提交给内核网络协议栈,当接收缓冲区空时,将接收例程放入等待队 列,等待指定时间后重启接收例程,具体可如图3所示,图3所述的数据 接收流程中,等待的指定时间为4ms。

从网络应用程序传送消息,即消息的发送,进一步包括:在内核网络 协议栈需要发送数据时,调用vn_ndev_tx,该函数将检查发送缓冲区是否 已满,不满则将数据拷贝到缓冲区中,满了则丢弃该数据包;当发送缓冲 区中有数据,用户态网络驱动则不断地从发送缓冲区中取出数据发送,当 接收缓冲区空时,将发送例程放入等待队列,等待指定时间后重启发送例 程,具体可如图4所示,图4所述的数据发送流程中,等待的指定时间为 1ms。

更进一步地,轮询的实现是通过将轮询任务放入到工作队列中实现 的,包括步骤:

a、在共享内存上建立工作队列;

b、将轮询任务放入到工作队列;

c、检查共享内存的缓冲区是否为空,如果未空则一直读取消息;如 果共享内存的缓冲区为空,则将轮询任务放入工作队列等待指定的时间。

具体实现方式如下:

首先,将轮询任务放入到工作队列;

调用create_singlethread_workqueue建立一个工作队列wq,创建一个 任务poll_work,通过INIT_WORK函数将该任务与轮询函数vn_ndev_poll 绑定起来;最后,通过调用queue_delayed_work将该任务提交给工作队列 wq,该任务将在指定的jiffies之后执行。

其次,检查接收缓冲区是否有数据包,如果有则一直读数据包,直到 接收缓冲区空,并将轮询任务放入到工作队列等候;如果接收缓冲区为空, 则将轮询任务放入工作队列等待指定的时间。

在轮询函数vn_ndev_poll中,该函数首先检查接收缓冲区是否为空, 不为空则调用vn_ndev_do_poll接收数据包,然后调用queue_delayed_work 将自身任务poll_work提交给工作队列。这样轮询函数就能按一定的时间 间隔不断的被执行,这样也就实现了轮询。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号