Linux 内核中对网络设备进行描述的核心结构类型叫做 net_device,net_device 结构定义在 include/linux/netdevice.h 文件中。该结构的字段可以分为以下几类。

1、net_device 结构分类

(1)全局信息

该类中包含了设备名(name 字段)、设备状态(state 字段)、设备初始化函数(init 字段)等。

(2)硬件信息

该类中包含了设备内存使用情况(mem_end 和 mem_start 字段)、中断号(irq 字段)、IO 基地址(base_addr 字段)等。

(3)接口信息

该类中包含了 MAC 地址(dev_addr 字段)、设备属性(flag 字段)、最大传输单元(mtu 字段)等。

(4)设备接口函数

该类中包含了当前设备所提供的所有接口函数,比如设备打开函数(open 字段),该函数负责打开设备接口,当用户使用 ifconfig 命令配置网络时,该函数默认被调用;设备停止函数(stop 字段),该函数负责关闭设备接口;数据发送函数(hard_start_xmit 字段),当用户调用 socket 开始写数据时,该函数被调用,并负责往网络设备中发送数据。

2、DMA 介绍(BD 引入)

网络设备的核心处理模块是一个被称作 DMA(Direct Memory Access)的控制器,DMA 模块能够协助处理器处理数据收发。对于数据发送来说,它能够将组织好的数据自动发出,无需处理器干预;对于数据接收来说,它能够将收到的数据以一定的格式组织起来,通知处理器,并等待处理器来取。

DMA 模块收发数据的单元被称为 BD(Buffer Description,缓存描述符),每个包都会被分成若干个帧,而每个帧则被保存在一个 BD 中。BD 结构通常包含有以下字段(正常应用肯定比下面这个数据结构要复杂得多):

typedef struct {

void *bufptr; /* 保存当前 BD 对应缓存的起始地址 */

int length; /* 保存缓存中存储的数据包长度 */

int sc; /* 保存当前 BD 的状态信息 */

} BD_STRUCT;

  • 1
  • 2
  • 3
  • 4
  • 5

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

3、数据发送流程(发送 BD)

网络设备通过 DMA 进行数据发送的流程如 图 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)是硬件自动完成的,不需要软件的干预,如此可以节省处理器的工作量。

4、数据接收流程(接收 BD)

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

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

linux更改网卡缓存,Linux 网卡驱动学习(四)(缓存描述符 Buffer Description)相关推荐

  1. 第三阶段应用层——2.4 视频监控—从0写USB摄像头驱动(1)-描述符的分析与打印

    视频监控-从0写USB摄像头驱动(1)-描述符的分析与打印 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3) 软件平台:运行于VMware Workstation 12 Player下U ...

  2. 【Linux系统编程学习】 文件描述符

    此为牛客网Linux C++课程1.19课程笔记. 1. 文件描述符表 如图,我们知道每个进程都有其虚拟地址空间(0~4G),其中3 ~ 4G部分为内核区.进程的进程控制块保存就在内核区,而PCB中维 ...

  3. linux 更改make版本,Linux下查看系统版本和make版本

    一.查看Linux内核版本命令(两种方法): 1.cat /proc/versionz [root@localhost ~]# cat /proc/version Linux version 2.6. ...

  4. usb驱动开发7——接口描述符

    此系列是http://blog.csdn.net/fudan_abc/博文的整理,同时加入了自己的理解.很敬佩fudan_abc的文章,仔细学习和分析受益很多.注:fundan_abc所分析linux ...

  5. 基于Linux 5.4.18的nvme驱动学习 - Linux相关概念 (一)

    目录 1.node 2.pci_request_mem_regions 3.pci_resource_len.pci_resource_start 4.work_queue 5.dma_pool_cr ...

  6. 网卡驱动学习四、mac80211概览

    1. mac80211概览 目录 文章目录 1. mac80211概览 2. mac80211架构 3. mac80211代码结构 4. mac80211数据结构体 4.1 ieee80211 loc ...

  7. linux 更改 引导分区,Linux系统引导过程及引导修复

    0.Linux系统引导过程: 1.通电 2.bios初始化 3.磁盘引导阶段 4.grub2文件引导程序 5.内核加载 6.系统初始化镜像 7.系统启动级别 8.超级用户密码 以下内容是针对各过程会出 ...

  8. linux更改语言脚本,Linux shell脚本入门——shell语言脚本【CentOS】

    认识脚本 是使用一种特定的描述性语言,依据一定的格式编写的可执行文件.脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只 ...

  9. linux 更改用户属性,linux基本命令之用户配置篇

    ⑴.linux系统内用户分类: 管理员:ID为0 普通用户:ID为1-655351. 系统用户:ID为1-499,运行后台服务的用户,不允许登陆系统. 一般用户:ID为500-60000 ⑵.用户管理 ...

  10. linux更改默认版本,linux - 将某个软件版本设为ubuntu中的默认版本 - Ubuntu问答

    问题描述 我目前在Ubuntu 12.04上安装了2个版本的php. 一个用于使用apt-get安装的php 5.3,另一个用于xampp与php 5.5一起安装 当我执行这些命令时: > wh ...

最新文章

  1. solr的认识、linux下安装、java下使用(含下载资源)
  2. Android中的AsyncTask异步任务的简单介绍
  3. javaWeb服务详解(含源代码,测试通过,注释) ——applicationContext-Service.xml
  4. 前端学习(2884):dom更新操作的实现
  5. CentOS7 Ambari2.7.5编译
  6. 包装类转换基本数据类型与基本数据类型转换为包装类
  7. 1049. 数列的片段和(20)
  8. bcdedit添加linux引导,Linux_利用Bcdedit创建Linux系统引导,Bcdedit在Windows Vista中的一个命 - phpStudy...
  9. Vue 强制刷新组件
  10. 关于最优化问题的个人理解以及黑塞矩阵的示例
  11. 消息钩子函数入门篇(1)--基础知识
  12. ​以太网的发展历史、演化过程以及工作基理
  13. 【C++】结构体变量与结构体指针大小区别(Socket sendto函数)
  14. cuda环境安装--windows离线安装
  15. 计算机主机地址填什么,什么是IP地址 何设置IP地址
  16. LFY-SpringBoot1【课程概述、springboot2概述】
  17. 设备安全——防火墙j基础策略实验【华为NSP】
  18. 《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件
  19. ACRANSAC之我见
  20. 求导,微分,积分的区别

热门文章

  1. 典型飞行控制系统的回路构成
  2. 小米路由器r2d_小米路由器R2D固件下载
  3. java 开根号_Java实现开根号运算(不使用数组和String)
  4. Django新手入门(三)——使用PyCharm创建Django项目
  5. 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》到底有多大?我们的硬盘装得下吗?...
  6. JavaScript判断数组中是否有重复元素方法
  7. Java初学者作业——声明变量储存商品信息并进行输出
  8. java模拟器.apk_java游戏模拟器安卓版下载-java模拟器apk下载 v2.2.0 安卓版-IT猫扑网...
  9. Quartus-II实现D触发器的三种方式
  10. 电力线宽带载波对比窄带载波的优点