1. 前言
    网卡驱动里,CPU和MAC控制器都需要对DMA描述符空间进行读取或者写入。DMA描述符空间又会采用到CACHE和零拷贝技术,以往都是驱动自己去申请、关联内存和刷新(flush和invalidate)CACHE。
    描述符助手则是把这些工作在内核里完成,对驱动提供接口即可,此文就对这些接口功能做一些分析。
  2. 创建
    实现发送静态内存空间申请、发送零拷贝内存创建(但不申请空间)、接收静态内存空间申请、接收零拷贝内存空间申请,及CACHE刷新。函数原型及入参如程序清单 2.1:
    程序清单 2.1
    /* create descriptor helper /
    struct netdev_desc_helper *
    netdev_desc_helper_create (size_t each_buf_size, /
    每帧大小 /
    size_t pad_size, /
    PAD /
    int cache_ts_en, /
    发送静态内存cache刷新使能 /
    int cache_rs_en, /
    接收静态内存cache刷新使能 /
    int cache_zc_en, /
    接收零拷贝内存cache刷新使能 /
    int tx_buf_cnt, /
    发送描述符数 /
    int rx_buf_cnt, /
    接收描述符数 /
    int tx_zc_en, /
    发送零拷贝使能 /
    int rx_zc_cnt) /
    接收零拷贝池数 */
    可知,接收零拷贝是默认使能的,且零拷贝池数是接收描述符数的2倍即申请2倍空间(下文会对此分析)。创建流程如图 2.1:

    图 2.1 描述符助手创建
    这里需要关注的是,零拷贝池的每个节点大小是帧大小加上节点头大小,帧对应pbuf空间,而实际数据的存储则又是pbuf里的payload空间。关系如图 2.2:

    图 2.2 零拷贝池节点结构
  3. 发送
    发送需要关注两个函数,发送前prepare即将上层要发送的pbuf->payload关联到发送描述符,发送后clean即是把该pbuf空间释放掉。如图 3.1:

    图 3.1 发送流程
  4. 接收
    接收同样是关注两个函数,接收前input取出内容,接收后refill重关联描述符与零拷贝池。但多一个流程,初始化时先把零拷贝地址池关联到接收描述符并写入MAC控制器。如图 4.1:

    图 4.1 接收流程
    这里对为什么接收零拷贝池申请2倍内存做一个推测,由于其他空间是用完后即可再次利用,而接收描述符空间是要等上层归还到零拷贝池链表后,当上层归还不及时时,零拷贝池数量实际就没申请的那么多,所以直接采取极端情形即申请2倍。

网卡驱动描述符助手功能浅析相关推荐

  1. Nginx文件描述符泄露?浅析FD_CLOEXEC文件描述符标志

    很精彩的一篇文章. 1. 引子 事情是这样的,最近我们线上一个基于nginx的http服务经常报警,具体如下: accept() failed (24: Too many open files) wh ...

  2. dpdk-16.04 扩展新网卡驱动过程

    编译相关配置添加 1. 确定网卡的 vendor id 与 device id,在 rte_pci_dev_ids.h 中添加新的设备定义 示例信息如下: #ifndef RTE_PCI_DEV_ID ...

  3. Linux系统学习笔记:文件描述符标志

    文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...

  4. python 描述符类_python的黑魔法--描述符

    python的黑魔法 描述符 官方定义:python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 get(), set(), 和de ...

  5. Embeded linux之网卡驱动

    一.配置菜单 Device Drivers [*] Network device support  ---> 网络设备驱动.网卡驱动 < >     Bonding driver s ...

  6. java中的scr是什么意思,javascrpt中属性描述符的理解与使用

    javascrpt中属性描述符的理解与使用 属性描述符是ES5出现的概念.顾名思义:它用于描述对象里面的属性应该是什么样,例如是否只读,能否可枚举,能否可配置等.怎样?好理解吧. 既然是对象里面的属性 ...

  7. js属性中的数据描述符,访问描述符(writable,configurable,enumerable)

    1.属性描述符 也称元属性.有四个值.数据属性包含一个数据值的位置,在这个位置可以读取和写入值.数据属性有4个描述其行为的特性. ​ 可配置性 [[Configurable]] : 表示能否通过del ...

  8. dpdk报文收发流程--理解dma控制器、UIO驱动、描述符空间、mbuf空间、KNI

    1. dpdk报文收发流程 1.1 报文接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理. 和传统报文接收不同,当应用 ...

  9. usb声卡驱动(一):USB描述符

    usb声卡驱动(一) 前面看了内核的启动,接下来就是驱动的学习. 正好手边有一个USB声卡,就准备以此为基础,进行usb声卡驱动的学习. 因此,在学些usb声卡之前,先看看usb驱动.然后再是alsa ...

最新文章

  1. mysql客户端指令_mysql command line client(mysql命令行客户端)
  2. 【c语言】测量字符串长度
  3. PYTHON线程知识再研习F---队列同步Queue
  4. Windows10怎么在当前目录,打开cmd命令窗口?
  5. React Native获取手机的各种高度
  6. CSS命名规则--参考表
  7. js按键处理demo
  8. 如何使得账户密码永不过期
  9. Python爬虫(二十一)_Selenium与PhantomJS
  10. matlab反拉氏变换,matlab拉普拉斯变换.doc
  11. snipaste滚动截图方法_【软件工具】超强干货|不同级别的截图工具,快来按需领取吧...
  12. 区块如何防篡改_区块链为什么能防篡改?
  13. 成绩不高?校园招聘了解一下!春招公司大全!
  14. android 输入法 sd卡,关于安卓手机内置或外置SD卡中各文件夹的名称和作用
  15. python实现ID3
  16. UCF Local Programming Contest 2012(Practice)E. Pete's Pantry 【模拟】
  17. 【海神】各种工作特色比照和介绍
  18. linux 卸载nexus,CentOS7安装Nexus
  19. js 所有空格替换成任意字符
  20. 艺术探索笔记:IPC

热门文章

  1. 如何查看Linux系统安装的时间?
  2. dropbear 安装配置
  3. MongoDB中$redact操作符的使用
  4. 使用Pusher和Vue.js构建实时聊天应用
  5. 2021春工程伦理习题答案
  6. ExtJS与JQuery对比
  7. RabbitMQ安装和管理界面设置
  8. 基于龙芯+国产FPGA 的VPX以太网交换板设计(三)
  9. Python周立功CAN接口卡接口库函数
  10. python pandas获取行号_python获取行号和函数名