zoukankan      html  css  js  c++  java
  • 网卡驱动-BD详解(缓存描述符 Buffer Description)

    DMA介绍(BD的引入)

    网络设备的核心处理模块是一个被称作 DMA(Direct Memory Access)的控制器,DMA 模块能够协助处理器处理数据收发。对于数据发送来说,它能够将组织好的数据自动发出,无需处理器干预;对于数据接收来说,它能够将收到的数据以一定的格式组织起来,通知处理器,并等待处理器来取。
    DMA 模块收发数据的单元被称为 BD(Buffer Description,缓存描述符),每个包都会被分成若干个帧,而每个帧则被保存在一个 BD 中。BD 结构通常包含有以下字段(正常应用肯定比下面这个数据结构要复杂得多):

    <code class="hljs glsl has-numbering"> typedef <span class="hljs-keyword">struct</span> { 
        <span class="hljs-keyword">void</span> *bufptr;    <span class="hljs-comment">/* 保存当前 BD 对应缓存的起始地址  */</span> 
        <span class="hljs-keyword">int</span> <span class="hljs-built_in">length</span>;      <span class="hljs-comment">/* 保存缓存中存储的数据包长度      */</span> 
        <span class="hljs-keyword">int</span> sc;           <span class="hljs-comment">/* 保存当前 BD 的状态信息          */</span> 
     } BD_STRUCT;</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li></ul>

    所有的 BD 就组成了一张 BD 表,如图 1 所示,一般来说发送方向和接收方向的 BD 表是各自独立的。 

          图1

    数据发送流程(发送 BD)
    网络设备通过 DMA 进行数据发送的流程如图2所示。

                  图2

    图中各步骤的具体含义描述如下:
    (1)协议层通知处理器开始发送数据;
    (2)处理器从 BD 表中取出一个 BD,将需要发送的数据拷贝至当前 BD 对应的缓存内,并设置好 BD 的状态;
    (3)处理器通知网络设备开始发送数据;
    (4)MAC 模块通知 DMA 单元开始发送数据;
    (5)DMA 模块操作 BD 表,取出当前有效 BD;
    (6)DMA 模块将当前 BD 对应缓存内的数据发送至 MAC 模块;
    (7)MAC 模块将这些数据发送到网络中;
    (8)网络设备通知处理器数据发送完毕;
    (9)处理器通知协议层发送下面一帧数据。
    其中步骤(4)~(8)是硬件自动完成的,不需要软件的干预,如此可以节省处理器的工作量。

    数据接收流程(接收 BD)
    网络设备通过 DMA 进行数据接收的流程如图 3 所示。

                图3

    图中各步骤的具体含义描述如下:
    (1)处理器初始化 BD 表;
    (2)处理器初始化网络设备;
    (3)MAC 模块从网络中接收数据;
    (4)MAC 模块通知 DMA 模块来取数据;
    (5)DMA 模块从 BD 表中取出合适的 BD;
    (6)MAC 模块将数据发送至当前 BD 对应的缓存内;
    (7)网络设备通知处理器开始接收数据(以中断方式或轮询方式);
    (8)协议层从当前的 BD 缓存内取走数据。
    其中步骤(3)~(6)是硬件自动完成的,不需要软件的干预,如此可以节省处理器的工作量。

     

  • 相关阅读:
    [转]Sublime Text 3安装Json格式化插件
    Golang 新手可能会踩的 50 个坑【转】
    [golang]svg图片默认按照左上角旋转,改为按中心旋转,重新计算中心偏移量
    序列化是干什么的,有什么作用,什么情况下会用到?
    Hbase设置多个hmaster
    基于JMX动态配置Log4J日志级别
    面向过程与面向对象编程的区别和优缺点
    log4j自带的两个类MDC和NDC作用以及用途
    【架构师之路】集群/分布式环境下5种session处理策略
    Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题
  • 原文地址:https://www.cnblogs.com/debruyne/p/9494029.html
Copyright © 2011-2022 走看看