支持linux的硬件抽象层的虚拟网卡设计方法

文档序号:6427301阅读:165来源:国知局
专利名称:支持linux 的硬件抽象层的虚拟网卡设计方法
技术领域
本发明属于嵌入式系统设计领域,具体涉及支持Iinux的硬件抽象层中虚拟网卡设备的设计方法。
背景技术
硬件抽象层(简称HAL)旨在对驱动框架分层,将设备无关部分和设备相关部分分开。以网络设备为例,通过设计一个公共的、抽象的虚拟网络设备,将原先具体设备的驱动分成两层。虚拟设备之上(即客户操作系统,简称Guest OS)属于设备无关部分,而虚拟设备与具体设备之间(即虚拟机监控器,简称VMM)则属于设备相关部分。设备无关部分在各个网络设备之间是通用的,且可以被复用。当为新的网络设备设计驱动时,只需改写设备相关部分,即重写虚拟网络设备与物理网络设备之间的映射。本发明将虚拟网络设备与具体设备之间的映射放在VMM中实现,而不是在Linux 中,这样使得linux (Guest OS)屏蔽具体的硬件细节,硬件细节全部在VMM得到处理,而 Iinux作为Guest 0S,只操作虚拟的设备。通过硬件抽象层中对虚拟网卡的设计,可以将一个物理网卡映射为多个虚拟网卡,从而使得多个Guest OS可以在桥接的情况下,各使用一个虚拟网卡,同时连接网络,接收及发送网络包。其具体结构框架见图1,图中的Guest OS代表Linux操作系统。现有的流行虚拟化方案有VMware和Xen,他们均针对网络设备进行了虚拟化。前者主要应用于全虚拟化方案,即运行不经修改的Guest 0S,对原网络设备驱动可不加修改的应用于虚拟机环境中;后者采用分离驱动模型,即多个客户操作系中一个作为domain 0,具有较高优先级,并直接复用已有网络驱动使用网络设备,其余客户操作系统通过向 domain 0申请网络服务来上网。但他们均应用于PC、服务器领域,而本专利主要应用于嵌入式领域,并同前者相比具有较低的性能损耗、易于移植的特点。

发明内容
本发明的目的在于提供一种支持Iinux的硬件抽象层的虚拟网卡设计方法。通过虚拟网卡设备,多个客户操作系统能够同时进行网络操作。另外,硬件抽象层的分层设计减少了网卡设备驱动移植的工作量。为了达到上述目的,本发明采用以下技术方案予以实现通过将虚拟网卡中网络数据包抽象为特定的数据结构,并以链表的方式组织,然后通过消息和中断注入机制分别实现网络包的发送和接收过程(见图2)。(1)虚拟网卡中网络数据包的组织每个虚拟网卡中网络数据包在硬件抽象层端被抽象为一个结构体,其所包含的 Ien字段和addr字段分别代表数据包的长度及其在内存中的地址。由该结构体相连接的链表表示由网络设备发送或接收的一系列数据包。当数据包在HAL层中传递时,仅需传送其 addr字段,并据此实现数据在客户操作系统与硬件缓冲区之间的拷贝。图3显示虚拟网络设备的数据包组织形式,其中两个环形链表分别代表暂存发送和接收的虚拟网卡中网络数据包结构体,实线和虚线分别代表发送和接收网络包的过程。(2)虚拟网卡中网络数据包的存储管理虚拟网卡中网络数据包在客户操作系统(Iinux)中以结构体sk_buff表示,其网络数据位于sk_buff_ > data所指向的内存地址中。对于客户操作系统中的每个sk_buff, 都由HAL端虚拟网卡中网络数据包链表的一个元素的索引。虚拟网卡中网络数据包(sk_ buff)在客户操作系统中创建和释放,对应HAL端虚拟网卡中网络数据包链表元素的增加和删除。通过该方式,HAL端不进行虚拟网卡中网络数据包空间的分配与释放,相应的工作由客户操作系统完成。当需要发送网络包时,只需要把sk_buff- > data (即上文的addr字段)传递给HAL,并由后者将该指针指向的内存空间拷贝至硬件缓冲区中,完成发送操作, 接着由客户操作系统将网络包(sk_buff)的空间释放。当接收网络包时,客户操作系统创建预先分配固定大小负载空间的sk_buff,并由HAL将接收到的网络数据拷贝至该负载空间中(sk_buff_ > data,即上文的addr字段)。该过程参考图5。(3)客户操作系统的网络包发送过程每个客户操作系统在硬件抽象层中对应一个网络发送实时任务。当需要发送网络数据时,将数据映射进HAL端的虚拟网卡中网络数据包链表,封装发送消息内容,进而将消息传递给实时任务。该任务收到消息后被唤醒并调度执行,读取数据包链表中的一个元素, 根据其中的addr字段将数据拷贝到物理网卡缓冲区,设置相应寄存器后,完成发送任务。 客户操作系统接着被通知释放该虚拟网卡中网络数据包空间。(3)客户操作系统的网络包接收过程a)物理网卡接收到数据包时,会触发相应中断,调用网络包接收中断服务程序。该服务程序首先验证网络包是否有效,如有效则从客户操作系统内核取出一个空的数据包链表元素。如链表元素取出过程失败,则将物理网卡中的数据取出,存入临时缓冲区,不向客户操作系统传递。否则转入b)。b)将物理网卡中的数据取出,存入网络数据链表元素的addr字段所代表的内存处,并向客户操作系统注入网络包接收中断,即设置其虚拟中断标志为1。接着转到C)。c)客户操作系统被调度执行时,首先处理已触发的虚拟中断。在调用相应的网络虚拟中断服务程序时,会通过网络接收数据包链表依次处理每个从VMM端发送来的数据包,将其传递到更高层的网络协议栈进行处理。每个包(即链表中的每个元素)处理完成后,均需要为该元素分配一段新的负载空间。本发明设计了支持Iinux的硬件抽象层的虚拟网络设备,抽象化网络包数据组织结构,并通过消息和中断注入机制实现虚拟网卡中网络数据包的发送和接收。


图1为两个Guest OS通过硬件抽象层中的虚拟网络设备桥接方式上网;图2为网络包的发送和接收过程示意图;图3为抽象后的虚拟网卡中网络数据包的组织形式示意图;图4为虚拟网卡中网络数据包链表在初始化时的组织形式;图5虚拟网卡中网络数据包链表在发送和接收包时的组织形式;
图6为虚拟网络设备驱动层次模型示意图。
具体实施例方式下面结合附图对本发明做进一步详细描述参见图1-6,网络设备虚拟化技术主要体现在数据包的组织、发送、接收过程。(1)虚拟网卡中网络数据包的组织客户操作系统利用虚拟网络设备进行网络数据的接收和发送是通过虚拟网卡中网络数据包链表实现的,该链表中的每个元素描述一个数据包,元素的Ien字段和addr字段分别代表数据包的长度和其在内存中的地址。该数据包的数据存放客户操作系统内核中,当数据包进行转移时,一般仅传递其addr字段。在客户操作系统间虚拟网卡中网络数据包发送和接收时,需要相应的系统间虚拟网卡中网络数据包链表数据结构,若一个客户操作系统需要向另一个发送数据包时,需要将数据包的内存地址和长度字段写入链表中的空白元素。另一个客户操作系统从该链表中取出一个元素,读出其数据包地址,并据此拷贝至该客户操作系统内核中。(2)虚拟网卡中网络数据包的存储管理考虑到网络包数据量大,网络传输频繁,需要减少不必要的内存拷贝。虚拟网卡中网络数据包在客户操作系统(Iinux)中创建和存储,以结构体sk_buff表示,其网络数据位于Sk_buff->data所指向的内存地址中(该地址同样位于客户操作系统)。当需要发送网络包时,只需要把sk_buff- > data(即上文的addr字段)传递给HAL,并由后者将该指针指向的内存拷贝至硬件缓冲区中;当接收网络包时,客户操作系统创建预先分配固定大小负载空间的sk_buff,并由HAL将接收到的网络数据拷贝至Iinux的sk_buff- > data(即上文的addr字段)中。这使得HAL利用虚拟网卡中网络数据包链表作为网络发送或接收包的中介,在避免额外拷贝的情况下实现网络操作(如图5所示)。a)网络发送数据包的存储管理发送缓冲区链表中的每个元素(unit)被初始化为空(如图4上)。当Iinux需要发送网络包时(如图5上),将其创建的带网络数据的sk_buff通过tx_write_index指针写入一个unit,接着HAL被通知需要发送网络包,通过tx_read_index指针取得当前unit 的addr字段(即sk_bUff->data),将该字段处的内容拷贝至硬件网卡缓冲区中。最后通知Iinux发送已完成,客户操作系统接着通过tx_release_index指针将已读过的unit所指向的sk_buff销毁,并将unit重新置为空。b)网络接收数据包的存储管理接收缓冲区链表中的每个元素被初始化为指向一个预先分配带固定内存大小负载空间的sk_buff (如图4下)。当虚拟网卡中网络数据包到达时,触发硬件中断。该中断服务程序会向接收缓冲区链表申请一个新的元素(利用rx_write_index指针),将硬件接收到的网络数据专递到接收缓冲区链表元素(unit)的addr字段所指向的Iinux内存地址, 并通知客户操作系统收到虚拟网卡中网络数据包。Iinux读取收到的虚拟网卡中网络数据包(利用rx_read_index),并将其传递给上层网络协议栈进行处理。在处理的过程中,unit 对应的sk_buff会被释放,此时需要重新为unit分配一个带固定内存大小负载空间的sk_ buff (图 5 下)。
(3)虚拟设备初始化过程虚拟网络设备的模块将在客户操作系统针对外设的初始化时加载,并调用相应函数进行与硬件无关的初始化工作。接着向HAL层发送消息,要求进行与网卡硬件相关的初始化,该消息会唤醒与该客户操作系统在HAL层对应的网络实时任务。在任务中检查物理网络设备启动标识,如果该标志显示尚未启动,则调用相应的函数完成初始化工作,否则直接退出。(4)数据包发送a)要发送的数据包经过TCP/IP封装后,首先暂停内核与驱动程序间数据传递,准备发送数据包。将该数据包在内存中的地址和长度信息存入从链表中的一个空数据包结构体,转入b)。b)向HAL中与虚拟网卡中网络数据包发送相关的任务发送虚拟网卡中网络数据包消息,设置该消息的类型为“服务请求”,任务类型为“网络数据发送”,附加参数为网络包目的地类型,这可通过对比虚拟网卡中网络数据包的目的MAC地址和已知的MAC地址得到, 转入c)。c)消息发送后,等待相应的响应消息。若没有立即得到响应,则将该Iinux进程阻塞;否则将该虚拟网卡中网络数据包释放,并重新进行内核一驱动程序间数据传递,继续发送新的数据包。d)在b)中发送的消息唤醒HAL中与网络数据发送相关的实时任务,该任务验证消息的任务类型为“网络数据发送”,接着,根据附加参数,选择将数据包发送到外部网络或者其他客户操作系统中。当数据包需要发送至外部网络时,从客户操作系统获取要发送数据包的内存地址和长度,利用该信息将网络数据拷贝至网卡硬件缓冲区,并设置相应的寄存器完成发送请求。当数据包发送至其他客户操作系统时,其操作见(6)。完成发送操作后, 向Guest OS发送响应消息。接着,该实时任务等待数据包发送的请求消息,此时会将自身阻塞。(5)数据包接收a)当接收到虚拟网卡中网络数据包时,物理网卡触发硬件中断,此时转入VMM的网络接收数据中断服务程序。b)该服务程序通过对网卡接收到的数据进行有效性验证,并通过比较数据包的 MAC地址判断向哪一个客户操作系统发送。如果向当前Guest OS发送数据包,那么向该客户操作系统申请一个空的数据包结构体,并将接收到的数据包拷贝到该结构体addr字段对应的内存地址处,同时向客户操作系统注入一次网络接收中断。如果向被阻塞的客户操作系发送数据包,其具体操作见(6)。c)当客户操作系统作为一个任务被调度执行时,会首先处理被注入的中断,这包括执行客户操作系统的网络接收中断服务程序。该服务程序会通过网络接收数据包链表依次处理每个从HAL发送来的数据包,识别其发送目标,并传递到更高层的网络协议层进行处理。每个包处理完成后,均需要为对应的接收数据包链表中的元素申请一段新的内存空间。(6)客户操作系统间数据包的发送和接收a)在HAL端接收到客户操作系统的发送虚拟网卡中网络数据包请求(见(4)的d)步骤),识别其消息类型为广播包或特意向其他某个客户操作系统发送数据包。此时将要发送的数据包中的数据拷贝至操作系统间虚拟网卡中网络数据包链表中的一个空的元素,并通过信号量向另外某个客户操作系统发送网络包到达的消息。转入b)。b)网络包接收实时任务在接收到消息后被唤醒,进而调度执行,它会从操作系统间网络数据链表读取一个元素。接着从Guest OS内核取出一个空的数据包结构体,将元素中的数据包内容拷贝到数据包结构体addr字段在内存中的地址。转入c)。c)向需要接收数据包的Guest OS注入网络接收中断,该客户操作系统进而读取该数据包并进行TCP/IP协议栈解析。通过试验对本发明的虚拟网络设备的效率进行了验证,具体方法如下本试验主要采用ftp下载大量数据的方法计算网络速率。首先在mini6410开发板上运行Iinux操作系统,利用ftp工具分别下载1M、2M、4M、8M、16M、32M大小的文件,依次计算其下载速度。接着在同样的开发板上运行基于虚拟网络设备的客户操作系统(Iinux), 同样利用ftp下载从IM到32M大小不同的文件,并计算得相应的网络速度。最后,将这两次下载速度进行对比。实验结果表明,虚拟后的网络设备运行效率在最差情况下是虚拟前的94%,证明虚拟化过程造成的额外开销不大。以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施方式
仅限于此,对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单的推演或替换,都应当视为属于本发明由所提交的权利要求书确定专利保护范围。
权利要求
1.支持Iinux的硬件抽象层的虚拟网卡设计方法,其特征在于所述设计方法包括虚拟网卡中网络数据包的组织、虚拟网卡中网络数据包的存储管理、客户操作系统的网络包发送过程和客户操作系统的网络包接收过程。
2.如权利要求1所述支持Iinux的硬件抽象层的虚拟网卡设计方法,其特征在于所述虚拟网卡中网络数据包的组织按照如下步骤进行,每个虚拟网卡中网络数据包在硬件抽象层端被抽象为一个结构体,其所包含的Ien字段和addr字段分别代表虚拟网卡中网络数据包长度和其在内存中的地址;由该结构体相连接的链表表示由网络设备发送或接收的一系列数据包;当数据包在HAL中传递时,仅需传送其addr字段,并据此实现数据在客户操作系统与硬件缓冲区之间的拷贝。
3.如权利要求1所述支持Iinux的硬件抽象层的虚拟网卡设计方法,其特征在于所述虚拟网卡中网络数据包的存储管理按照如下步骤进行,虚拟网卡中网络数据包在客户操作系统Iinux中以结构体sk_buff表示,其网络数据位于sk_buff_ > data所指向的内存地址中;对于客户操作系统中的每个sk_buff,都由HAL端虚拟网卡中网络数据包链表的一个元素的索引;虚拟网卡中网络数据包sk_buff在客户操作系统中创建和释放,对应HAL端虚拟网卡中网络数据包链表元素的增加和删除;通过该方式,HAL端不进行虚拟网卡中网络数据包空间的分配与释放,相应的工作由客户操作系统完成;每当需要发送网络包时,只需要把sk_buff- > data,即上文的addr字段传递给HAL,并由后者将该指针指向的内存拷贝至硬件缓冲区中,发送完成后由客户操作系统将网络包sk_buff的空间释放;当接收网络包时,客户操作系统创建预先分配固定大小负载空间的sk_buff,并由HAL将接收到的网络数据拷贝至Iinux的sk_buff- > data,即上文的addr字段中。
4.如权利要求1所述支持Iinux的硬件抽象层的虚拟网卡设计方法,其特征在于所述客户操作系统的网络包发送过程按照如下步骤进行,每个客户操作系统在硬件抽象层对应一个网络发送实时任务,当需要发送网络数据时,将数据映射进HAL端的虚拟网卡中网络数据包链表,封装发送消息,进而将消息传递给实时任务;该任务收到消息后被唤醒并调度执行时,读取数据包链表中的一个元素,根据其中的addr字段将数据拷贝到物理网卡缓冲区,设置相应寄存器后,完成发送任务;接着客户操作系统被通知将该虚拟网卡中网络数据包释放。
5.如权利要求1所述支持Iinux的硬件抽象层的虚拟网卡设计方法,其特征在于所述客户操作系统的网络包接收过程按照如下步骤进行,(1)物理网卡接收到的数据包时,会触发相应中断,调用网络包接收中断服务程序;该服务程序会确定网络包发送的目标客户操作系统,并从该客户操作系统取出一个空的数据包链表元素,如失败,将物理网卡中的数据取出至临时缓冲区,不向客户操作系统传递;否则转入⑴;(2)将物理网卡中的数据取出,存入网络数据链表元素的addr字段所代表的内存处, 并向客户操作系统注入网络包接收中断,设置其虚拟中断标志位;(3)客户操作系统被调度执行时,会处理网络接收虚拟中断;在该中断的服务程序中,依次处理每个从VMM端发送来的数据包,并将其传递至更高层次的网络协议栈进行处理。
全文摘要
本发明公开了一种支持linux的硬件抽象层的虚拟网卡设计方法,所述设计方法包括虚拟网卡中网络数据包的组织、虚拟网卡中网络数据包的存储管理、客户操作系统的网络包发送过程和客户操作系统的网络包接收过程。本发明通过虚拟网卡设备,多个客户操作系统能够同时进行网络操作。另外,硬件抽象层的分层设计减少了网卡设备驱动移植的工作量。设计了支持linux的硬件抽象层的虚拟网络设备,抽象化网络包数据组织结构,并通过消息和中断注入机制实现虚拟网卡中网络数据包的发送和接收。
文档编号G06F9/455GK102404253SQ20111017593
公开日2012年4月4日 申请日期2011年6月28日 优先权日2011年6月28日
发明者冯升, 李博良, 李国辉, 李铁强, 梅魁志 申请人:西安交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1