文档章节

SylixOS 网络零拷贝技术

SeanWoo
 SeanWoo
发布于 2017/09/11 10:53
字数 984
阅读 11
收藏 0

SylixOS 网络零拷贝技术


1. 网络零拷贝介绍

网络零拷贝技术指的是在数据报文从网络设备到用户程序传递的过程中,一种减少数据拷贝次数,减少系统调用,实现CPU的零参与,从而减轻 CPU负载的技术。

1.1 SylixOS网络现状

SylixOS网络使用的是Lwip协议栈,其数据报文从网络设备到用户程序只需要一次拷贝即可实现。产生这次拷贝的原因是数据报文从网络设备往协议栈传输时,数据格式不一样。网络协议栈需要专门的数据结构(pbuf)来管理报文,而设备层只会将数据本身存放在一块内存缓冲区中。

1.2 SylixOS零拷贝技术使用前提

SylixOS目前版本已经支持网络零拷贝,但这只适用于x86架构的CPU。主要原因是使用零拷贝技术后,网络协议栈对报文数据的管理并不会使用cache。这种方式在ARM等架构上使用时,协议栈需要对报文不停的访问,但由于没有cache,因此访问效率反而会降低。

2. 网络零拷贝技术实现

2.1 不使用零拷贝的报文接收流程

  不使用零拷贝的数据接收流程如图 2‑1 所示。

这里写图片描述

                  图 2‑1 不使用零拷贝接收

不使用零拷贝时,报文从网络设备到用户应用程序,只会进行一次拷贝操作,这一次拷贝操作位于网卡驱动中,即网络设备在接收到DMA搬运的数据报文时,会将报文的内容拷贝到协议栈支持的数据管理结构(pbuf)中。如图 2‑1 ,拷贝后的报文位于Lwip协议栈管理的内存区内。

拷贝完成后,协议栈会对pbuf管理的报文做各种分析,最后,通过IPC(进程通信方式)与用户程序进行交互。使用IPC就可以不进行数据拷贝,应用程序通过信号量、消息邮箱等机制去通知协议栈,让协议栈进行对应的处理。

2.2 使用零拷贝的报文接收流程

   使用零拷贝接收流程如图 2‑2 所示。

这里写图片描述

                  图 2‑2 使用零拷贝接收

SylixOS里零拷贝是将报文从驱动往协议栈传送的一次拷贝也省去。实现的思路是让协议栈可以直接使用驱动收到的网络数据。因此,驱动代码需要将用于接收网络报文的数据结构换成协议栈数据管理的结构,即换成pbuf类型。实现的方式是将原本驱动中描述符指向的buf地址换成pbuf结构里payload指针指向的内容即可。

主要实现流程如下:

  • 驱动需要创建一块大的零拷贝pbuf内存池(zc_pool),后续的报文接收的pbuf都从零拷贝pbuf池子里分配;

  • 驱动初始化描述符时,不调用DMAmalloc去分配一块物理地址,而是从上一步分配的零拷贝池子里获取一个零拷贝的pbuf,然后将pbuf所指向的内存地址赋值给DMA接收描述符;

  • 此后,网卡接收处理函数不需要再做拷贝,而是直接将收到报文的描述符对应的pbuf传到协议栈,同时按照上一步的方法,给这个完成接收的描述符分配一个新的零拷贝pbuf。

    由于上述申请的零拷贝pbuf类型是custom_pbuf类型,因此经过上述操作后,协议栈对接收到的pbuf进行释放操作时,会调用零拷贝对应的释放函数。

© 著作权归作者所有

共有 人打赏支持
上一篇: 链接脚本分析
下一篇: Lwip IP包分片重组
SeanWoo
粉丝 1
博文 13
码字总数 15838
作品 0
南京
私信 提问
SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich
05/15
0
0
SylixOS上EtherCAT实现

1 EtherCAT开源协议栈介绍 目前常见开源的主站代码为RT-LAB开发的SOEM(Simple OpenSource EtherCAT Master)和EtherLab的the IgH EtherCAT® Master,SylixOS对两者都支持。其中IgH作为常用的...

Jackstraw瑞
2017/11/01
0
0
SylixOS 支持多核 RISC-V 处理器

2018年3月31日,SiFive 发布全球首款多核全功能 RISC-V 处理器:FU540,此款处理器也是全球第一颗有能力运行标准 Linux 的 CPU。 22天后,SylixOS 成功在 FU540 真机上运行起来,成为全球第一...

翼辉信息
04/22
0
0
SylixOS调试方法详解——性能分析

1. SylixOS调试方法介绍 SylixOS实现了一个功能强大的调试stub(桩),可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。目前RealEvo-IDE既支持自动推送调试、也支持传...

Esc120
06/26
0
0
SylixOS线程堆栈大小浅析

目录 1. SylixOS线程、线程栈介绍 1 1.1 线程的介绍 1 1.2 线程栈的介绍 1 2. SylixOS线程栈大小的分配 1 2.1 线程、线程栈相关属性的设置 2 2.2 线程栈大小 2 2.3 线程堆栈警戒区 3 3. 总结...

Esc120
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小白带你认识netty(二)之netty服务端启动(上)

上一章 中的标准netty启动代码中,ServerBootstrap到底是如何启动的呢?这一章我们来瞅下。 server.group(bossGroup, workGroup);server.channel(NioServerSocketChannel.class).optio...

天空小小
35分钟前
1
0
聊聊storm trident batch的分流与聚合

序 本文主要研究一下storm trident batch的分流与聚合 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout) .p......

go4it
昨天
3
0
3分钟总结Mybatis别名

1.系统内置别名: 把类型全小写(resultType/paramType) 2.给某个类起别名 2.1 alias=”自定义” <typeAliases> <typeAlias type="com.bjsxt.pojo.People" alias="peo"/> </typeAli......

KingFightingAn
昨天
2
0
JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
昨天
8
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部