网卡驱动-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 版权声明:本文为博主原创文章,未经博主允许不得转载. 混杂设备驱动模型: ...
随机推荐
- WSL(Windows Subsystem for Linux) 适用于Linux的Windows子系统
打开 Microsoft Store , 搜索 Linux .选择 Ubuntu , 仔细看介绍,尤其是安装前的说明 ========================================= ...
- arcgis10.3 python2.7 开发环境配置
如题: 首先安装arcgis desktop 和 自带的python版本,本楼的是2.7.8,安装地址在E:\PYTHON2.7,安装完成后即可开始安装pythonwin2.7,下载地址为:http: ...
- leecode第八题(字符串转换整数 (atoi))
;//判断返回0是因为错误还是真的是0 class Solution { public: int myAtoi(string str) {//写的很丑 if (str=="") ; ...
- AD中设置PCB线间距
Design->Rules->Electrical->Clearance->Clearance
- 不要在Lua中使用os.clock()函数
1.os.clock函数的实现是调用了c语言的函数函数库,实现代码如下: static int os_clock (lua_State *L) { lua_pushnumber(L, ((lua_Nu ...
- python sshtunnel 简单介绍
背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 安装 pip3. ...
- Java 反射(简单捋一下)
有Student类,Person类,还有一个叫Class的类,这是反射的源头. 正常方式:通过完整的类名 > 通过new实例化 > 取得实例化对象 反射方式:实例化对象 > getC ...
- 20165327 2017-2018-2 《Java程序设计》第8周学习总结
20165327 2017-2018-2 <Java程序设计>第8周学习总结 教材内容总结 第十二章 (一)教材学习内容总结 线程是比进程更小的执行单位.一个进程在其执行过程中,可以产生多 ...
- gem "ransack"(4000✨) 简单介绍
Object-based searching:演示. git: https://github.com/activerecord-hackery/ransack Gorails视频和我的博客记录:ht ...
- 小程序动态添加class及调接口传递多个参数
1.动态添加class <view class="step2 {{indication == 2 ?'on':''}}"> <view class='tc lef ...