网卡驱动-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)是硬件自动完成的,不需要软件的干预,如此可以节省处理器的工作量。
网卡驱动-BD详解(缓存描述符 Buffer Description)的更多相关文章
- Linux双网卡绑定bond详解--单网卡绑定多个IP
Linux双网卡绑定bond详解 1 什么是bond 网卡bond是通过多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及 ...
- 【转】Linux下Android ADB驱动安装详解
原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比 ...
- Linux设备驱动开发详解
Linux设备驱动开发详解 http://download.csdn.net/detail/wuyouzi067/9581380
- Linux网卡ifcfg-eth0配置详解
DEVICE="eth1" 网卡名称 NM_CONTROLLED="yes" n ...
- usb驱动开发8之配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置. 我 ...
- Linux设备驱动开发详解-Note(11)--- Linux 文件系统与设备文件系统(3)
Linux 文件系统与设备文件系统(3) 成于坚持,败于止步 sysfs 文件系统与 Linux 设备模型 1.sysfs 文件系统 Linux 2.6 内核引入了 sysfs 文件系统,sysfs ...
- 《linux设备驱动开发详解》笔记——14 linux网络设备驱动
14.1 网络设备驱动结构 网络协议接口层:硬件无关,标准收发函数dev_queue_xmit()和netif_rx(); 注意,netif_rx是将接收到的数据给上层,有时也在驱动收到数据以后调用 ...
- 《linux设备驱动开发详解》笔记——6字符设备驱动
6.1 字符设备驱动结构 先看看字符设备驱动的架构: 6.1.1 cdev cdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下: #include <linux/cd ...
- Linux按键驱动程序设计详解---从简单到不简单【转】
转自:http://blog.csdn.net/coding__madman/article/details/51399353 版权声明:本文为博主原创文章,未经博主允许不得转载. 混杂设备驱动模型: ...
随机推荐
- 能改变this各种情况下的总结,还有没有总结到的,请留言!!
1.. 在函数参数中的,回调函数的this ,指向window 如: promise中的回调函数, 可以在方法外,转存this 2..构造函数中,this指向,实例对象 , 在全局中this是win ...
- leecode第七十题(爬楼梯)
class Solution { public: int climbStairs(int n) { vector<unsigned long long> num;//斐波那契数列 num. ...
- 《剑指offer》第六十二题(圆圈中最后剩下的数字)
// 面试题62:圆圈中最后剩下的数字 // 题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里 // 删除第m个数字.求出这个圆圈里剩下的最后一个数字. #inclu ...
- d3 data()数据绑定中的key函数
官网https://github.com/d3/d3-selection/blob/master/README.md#selection_data var data = [ {name: " ...
- C++之初体验
#include<iostream> using namespace std; int main() { cout<<" Hello imooc "< ...
- winfrom datagridview ,picturebox,显示图片,以及删除问题
private void write_listview(DataSet ds) { DataTable dt = ds.Tables[0]; ...
- lombok插件:Data自动get/set方法, Slf4j实现Logger的调用
lombok插件:Data自动get/set方法, Slf4j实现Logger的调用 lombok.Data import lombok.Data; import org.hibernate.anno ...
- JSON格式简介
一.JSON:JavaScript Object Notation的简写,是一种轻量级数据交换格式. 二.数据类型:标量.序列(数组).映射(key-value) 三.JSON的四个原则 1 .并列数 ...
- vue的优点
vue-router 单页面 虚拟DOM https://www.cnblogs.com/oldboyooxx/p/9186482.html
- 非常可乐 HDU - 1495
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...