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)是硬件自动完成的,不需要软件的干预,如此可以节省处理器的工作量。

网卡驱动-BD详解(缓存描述符 Buffer Description)的更多相关文章

  1. Linux双网卡绑定bond详解--单网卡绑定多个IP

    Linux双网卡绑定bond详解 1 什么是bond 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及 ...

  2. 【转】Linux下Android ADB驱动安装详解

    原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比 ...

  3. Linux设备驱动开发详解

    Linux设备驱动开发详解 http://download.csdn.net/detail/wuyouzi067/9581380

  4. Linux网卡ifcfg-eth0配置详解

    DEVICE="eth1"                              网卡名称 NM_CONTROLLED="yes"            n ...

  5. usb驱动开发8之配置描述符

    前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...

  6. Linux设备驱动开发详解-Note(11)--- Linux 文件系统与设备文件系统(3)

    Linux 文件系统与设备文件系统(3) 成于坚持,败于止步 sysfs 文件系统与 Linux 设备模型 1.sysfs 文件系统 Linux 2.6 内核引入了 sysfs 文件系统,sysfs ...

  7. 《linux设备驱动开发详解》笔记——14 linux网络设备驱动

    14.1 网络设备驱动结构 网络协议接口层:硬件无关,标准收发函数dev_queue_xmit()和netif_rx();  注意,netif_rx是将接收到的数据给上层,有时也在驱动收到数据以后调用 ...

  8. 《linux设备驱动开发详解》笔记——6字符设备驱动

    6.1 字符设备驱动结构 先看看字符设备驱动的架构: 6.1.1 cdev cdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下: #include <linux/cd ...

  9. Linux按键驱动程序设计详解---从简单到不简单【转】

    转自:http://blog.csdn.net/coding__madman/article/details/51399353 版权声明:本文为博主原创文章,未经博主允许不得转载. 混杂设备驱动模型: ...

随机推荐

  1. Qt5_选择文件对话框

    1. 类似如下代码: QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"), NULL,// ...

  2. 对pandas和pendulum的吐槽——TimeStamp numpy的datetime64的转型问题

    今天被这俩货因为时间日期处理不兼容的问题折腾半天,气死人,不吐槽不行了! 这俩简称都可以是pd的库,都TM够轴的,互相兼容极差. pandas 和 pendulum 知名度都很高,也很常用.但我就是用 ...

  3. CSS段落对齐方式

    CSS段落对齐有两种方式:水平对齐和垂直对齐. 1.水平对齐: (1).text-align:left;         //左对齐 (2).text-align:right;      //右对齐 ...

  4. tchart...

    using System;using System.Collections;using System.ComponentModel;using System.Drawing; using System ...

  5. org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608

    一.异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet reque ...

  6. linux文件管理之解压缩

    文件的压缩与解压缩 Linux文件压缩工具有:gzip.bzip2.rar.7zip.lbzip2.xz.lrzip.PeaZip.arj等.============================= ...

  7. 20170814xlVBA限定日期按客户分类汇总

    原始数据表: 汇总格式: Sub subtotalDic() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim mYe ...

  8. 「SDOI2008」Sandy 的卡片

    用第一个串建立后缀自动机.然后别的串在上面跑.从根节点开始.如果当前不能转移,一直移到slink或者根.如果移到根,能匹配长度变为0,否则变为maxlen[能转移的点]+1,再转移.转移完往slink ...

  9. Web版记账本开发记录(一)

    //index.js var util = require("../../utils/util.js"); //获取应用实例 var app = getApp(); Page({ ...

  10. 有标号的DAG计数

    看了某神仙博客学了一手,基本的思路就是容斥入度为0的点. n^2做法. F(n)=sigema i (-1)^(i-1)✖ C(n,i)✖ F(i)✖ 2^(j*(i-j)) nlogn做法 对上述式 ...