SylixOS网络开发(三)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月26日19:50:37 评论 1,156

1. 概述

本篇章节介绍SylixOS网络驱动不使用零拷贝时的数据是如何传递的。在阅读本篇文章的时候,大家脑海里一定要记住以下这张图:

SylixOS网络开发(三)

这张图只是对上一章节中的网络数据流图做了一点小修改。

2. 发送数据

我们之前说过,协议栈通过transmit方法来通知驱动进行数据发送,我们来看一下这个方法的函数原型:

/* netdev transmit a packet, and if success return 0 or return -1. */
 int  (*transmit)(struct netdev *netdev, struct pbuf *p);

可以看出这个函数的第二个参数是一个pbuf指针,驱动中通过pbuf就可以拿到要发送数据的缓冲区地址和大小,然后将数据复制到驱动中的DMA缓冲区,随后设置硬件进行数据发送。

这里需要注意的是协议栈中传递下来的pbuf中的数据缓冲区是带cache的,并且物理地址是连续的,同时物理地址和虚拟地址也是一一对应的。

在trasmit方法调用完后,发送用的pbuf会被协议栈回收。

3. 接收数据

系统通过receive方法接收数据并通知协议栈来处理解析数据,receive方法的函数原型如下:

/* netdev receive a packet, system will call this function receive a packet. */
  void (*receive)(struct netdev *netdev, int (*input)(struct netdev *, struct pbuf *));

从函数原型中可以看出,receive方法中第二个参数是一个Input方法,网络驱动就是通过这个方法来通知协议栈来处理接收到的数据,这个方法在网络协议栈初始化的过程中已经被实现,驱动中要做的工作就是进行调用即可。

我们再来看看input方法的第二个参数,是一个pbuf的指针,那么这个pbuf是哪里来的呢,是驱动中传进来的。也就是说驱动需要调用协议栈提供的接口来申请获得一个pbuf,然后将DMA缓冲区中的有效数据复制到pbuf中的缓冲区中,最后调用input方法同坐协议栈处理接收到的数据。

在协议栈处理完数据之后,会将接收用的pbuf进行回收。

也就是在不使用零拷贝的网络驱动中,发送和接收都不需要关心pbuf何时释放,因为这是由协议栈负责的。

gewenbin
  • 本文由 发表于 2020年12月26日19:50:37
  • 转载请务必保留本文链接:http://www.databusworld.cn/9844.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: