Linux驱动开发-网络设备驱动
Linux驱动开发-网络设备驱动
- 一,网络设备总体结构
- 1.1 总体架构
- 1.2 NAPI数据处理机制
- 二,RMII和MDIO
- 2.1 RMII接口
- 2.2 MDIO接口
- 三,MAC和PHY模块
- 3.1 MAC模块
- 3.2 PHY模块
- 四,网络模型
- 4.1 网络的OSI和TCP/IP分层模型
- 4.1.1 传输层:TCP和UDP
- 4.1.1.1 TCP
- ① 三次握手
- ② 确认机制
- ③ 四次挥手
- 4.1.1.2 UDP
- 4.1.2 网络层
- 4.1.3 物理链路层
一,网络设备总体结构
1.1 总体架构


SOC即主控芯片,目前大部分内部集成MAC模块,通过RMII和PHY芯片连接,RMII接口进行的是网络数据的传输,MDIO总线,设置PHY芯片寄存器。
1.2 NAPI数据处理机制
比如现在有网络数据输入,不可能一有数据传输过来,就执行中断,那么会一直占据中断,消耗CPU处理时间,如果采用轮询的方式,每隔一定时间查询一下是不是有数据了,这样处理就不及时。因此出现NAPI(New API)技术,将中断和轮询结合,采用中断唤醒数据接收服务程序,在中断接收服务程序中采用轮询的方式处理数据,提高数据包接收效率,减少中断处理时间。
二,RMII和MDIO
2.1 RMII接口
RMII(Reduced Media Independent Interface),是MII接口的精简版本,相对于MII少了9跟线,方便板子布线。

TX_EN:发送使能信号。
TXD[1:0]:发送数据信号线,两根。
RXD[1:0]:接收数据信号线,两根。
CRS_DV:接收数据有效和载波侦听信号结合。
REF_CLK:参考时钟,由外部时钟源提供,频率为50MHZ。
2.2 MDIO接口
MDIO(Management Data Input/Output),即管理数据输入输出接口,两线串行接口,一根MDIO数据线,一根MDC时钟线。PHY驱动通过这两根线,访问PHY上面的任意寄存器,PHY驱动也可以通过这两根线,连接最多32个PHY,保证每个PHY器件地址不同,同一时刻只能对一个PHY芯片进行操作,类似于I2C,由下面的读写操作,和I2C读写不一样的,不过大体上相似。
数据帧(32位):| 前导码(32位) | ST(2) | OP(2) | PHYAD(5) | REGAD(5) | TA(2) | DATA(16) |
ST(Start):01表示帧开始。
OP(Operation):10表示写,01表示读。
PHYAD:PHY地址(0-31),因为是5位,因此有32种结果,十进制的话就是0到31。
REGAD:寄存器地址(0-31)。
TA(Turnaround):读操作时MDIO方向切换周期。
DATA:16位读写数据。
写操作:①拉高MDIO,生成MDC时钟②发送32位全为1的前导码③发送起始位01④发送操作码,10表示写⑤发送PHY地址⑥发送寄存器地址⑦发送两位10TA,表示不用切换方向⑧发送16位数据⑨MDIO释放总线
读操作:①发送前导码和起始位②发送操作码01,表示读③发送PHY地址④发送寄存器地址⑤发送TA,切换数据传输方向⑥PHY设备MDIO返回两位TA(00)+16位数据⑦释放总线

三,MAC和PHY模块
3.1 MAC模块
即底层网络数据处理的驱动程序,整体围绕net_device这个具体网络设备,采用的是platform 驱动框架,创建出fec_driver结构体,包含probe函数和remove函数,probe函数主要是注册和初始化的相关工作,具体对数据的处理在ops操作函数里面,当打开网卡时,fec_enet_open函数执行,申请数据缓冲区,包括发送队列和接收队列缓冲区,探测并连接对应的PHY设备,使能NAPI调度,开启PHY设备,激活发送队列等工作。应用层有数据要发送,即sk_buff,会触发中断,中断函数中对NAPI进行调度,使能NAPI的poll轮询函数,类似于中断的上半部和下半部处理机制,在轮询函数中,真正的对数据进行处理,sk_buff一般会被网卡或者协议栈进行分段处理(数据包较大)。


3.2 PHY模块
采用的是设备,总线,驱动框架,即PHY设备驱动,MDIO总线,PHY具体设备。phy_driver表示驱动,采用phy_device表示PHY设备,函数get_phy_device获取PHY设备,具体内容包括:获取PHY ID,对phy_device结构体中的成员进行初始化,总线有相应的文件。
四,网络模型
4.1 网络的OSI和TCP/IP分层模型

4.1.1 传输层:TCP和UDP

4.1.1.1 TCP
Source Port:源端口,标识哪个应用程序发送,16bit。
Destination Port:目的端口,标识哪个应用程序接收,16bit。
比如浏览网页**,客户端网页浏览器向服务器网站**请求下载网页,客户端向服务器发了一个请求报文,这个报文的源端口就是客户网页浏览器的端口,目的端口就是网站服务器端口(HTTP应用)。
Sequence Number:序列号字段,每个TCP报文都有序列号,32bit。
Acknowledgment Number:确认号,对收到的报文进行确认,序列号和确认号,是为了保证每个发送过去的包,对方都能收到,我发出一个带有序列号的包,对方就要回一个带有确认号的包,这俩号是有一定关系的。
Header Length:头部长度,TCP报文头部长度,不是数据长度。
Control bits:控制位,有FIN,ACK,SYN标志位。
Window:窗口值,表示当前接收端能够接收的最大数据总数,以字节为单位,就是接收方告诉发送方,能接收的能力
Checksum:校验字段。

① 三次握手

三次握手是建立连接用的,SYN,ACK是控制位①PC1发送握手请求,SYN置位为1,序列号Seq为a,Ack为0,发送给PC2。②PC2接收到信号,要给PC1反馈个信息,让PC1知道PC2准备好了,并且PC2也想知道PC1是不是准备好了,发送一个序列号为b(任意),Ack信号为a+1(表示PC2准备好了)此时的控制位SYN和ACK置位。③PC1想让PC2知道,他也准备好了,于是会再反馈一个信号,序列号Seq为a+1(PC1的第一个信号a,因此下一个信号a+1),Ack信号为b+1(表示准备好了)。PC1准备好,PC2也准备好,就建立其连接。
② 确认机制

确认机制就是判断每个TCP的数据包,发送过去以后,对方是否能接收到。在三次握手建立连接后,PC1发送一个数据包,Seq为a+1,Ack为b+1,载荷长度为12,当PC2接收到这个数据包后,会给PC1反馈一个Seq为b+1,Ack为PC1的Seq(a+1)+载荷(12),即a+1+12,PC2的载荷为0,此数据包发送给PC1,表示PC2接收到PC1发送的数据包了。
③ 四次挥手

四次挥手是在发送结束时候用的,通信时双向的,当PC1发送结束,会给PC2发送一个数据包,控制位的FIN置位,ACK置位,序列号Seq=101,Ack=301,PC2接收到PC1这个数据结束的数据包,会给PC1发送一个Seq=PC1的Ack,即301,Ack为PC1的Seq(101)+1=102,此时控制位ACK置位。同样PC2发送完数据,也会和PC1这个过程类似。四次挥手后,TCP连接断开。
4.1.1.2 UDP
Source Port:源端口,标识哪个应用程序发送,16bit。
Destination Port:目的端口,标识哪个应用程序接收,16bit。
Length:报文总长度。
UDP模式加上端口号后,直接发送即可,不用在乎目的地址信息是否有反馈。
4.1.2 网络层
网络层接收到传输层发来的数据,会封装一个IP报文头部,把源IP地址和目的IP地址放到头部中,中间经过网络设备,比如路由器,路由器内部有路由表,读取IP数据包的目的IP地址,转发这个数据包。
4.1.3 物理链路层

传输层(网线,光纤)→网络层(路由器)→物理链路层(交换机)。在物理链路层,会给IP数据包,加上MAC地址,在交换机中,根据这个MAC地址,将数据包发送到具体设备,比如主机上。具体怎么获取MAC地址,是通过ARP请求,源Host A会给Host B发送一个ARP请求,带有Host B这个目的IP,Host B接收到这个ARP请求后,会反馈带有Host A的IP地址和Host B的MAC地址的数据包。
上述网络模型图,来自B站:网络工程师学长,https://www.bilibili.com/video/BV1P3411M7zF?p=13&vd_source=a11372469703158c2d89e1da0b799875
相关文章:
Linux驱动开发-网络设备驱动
Linux驱动开发-网络设备驱动 一,网络设备总体结构1.1 总体架构1.2 NAPI数据处理机制 二,RMII和MDIO2.1 RMII接口2.2 MDIO接口 三,MAC和PHY模块3.1 MAC模块3.2 PHY模块 四,网络模型4.1 网络的OSI和TCP/IP分层模型4.1.1 传输层&…...
学习笔记083——Java Stream API
文章目录 1、过滤数据 filter()2、转换元素 map()3、排序 sorted()3.1、自定义排序规则 4、去重 distinct()5、限制元素数量 limit()6、收集结果 collect()6.1、收集为List6.2、收集为Set6.3、转为Map6.4、基本用法(注意键冲突会抛异常)6.5、处理键冲突&…...
DataEase同比环比
DataEase同比环比 前言术语实现表结构设计DataEase设计创建数据集创建仪表盘最后前言 某大数据项目,需要比较展示今年跟去年的数据,如下图: 说明:比较24,25的产品销量,相同月份做一组,并排放一块 还有更进一步: 说明:比较24,25相同月份,相同产品的销量 直接用DataE…...
RAG 工程基础
RAG 概念 RAG(Retrieval - Augmented Generation)技术是一种将检索与生成相结合的人工智能技术,旨在利用外部知识源来增强语言模型的生成能力,提高生成内容的质量、准确性和相关性。 具体来说,RAG 技术在处理用户输入的…...
基础算法:滑动窗口_python版本
能使用滑动窗口的题,基本都需要数字为正整数,这样才能保证滑入一个数字总和是增加的(单调性) 一、209. 长度最小的子数组 思路: 已每个位置为右端点,依次加大左端点,最短不满足 sum(num[left,right]) < target的。…...
Qt 之opengl shader language
着色器示例代码 实际运行效果...
PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕
视频讲解: PyRoboPlan 库,给 panda 机械臂微分 IK 上大分,关节限位、碰撞全不怕 代码仓库:https://github.com/LitchiCheng/mujoco-learning 今天分享PyRoboPlan库,比之前的方式优点在于,这个库考虑了机械…...
GPT - TransformerDecoderBlock
本节代码定义了一个 TransformerDecoderBlock 类,它是 Transformer 架构中解码器的一个基本模块。这个模块包含了多头自注意力(Multi-Head Attention)、前馈网络(Feed-Forward Network, FFN)和层归一化(Lay…...
LabVIEW 控制电机需注意的关键问题
在自动化控制系统中,LabVIEW 作为图形化编程平台,因其高度可视化、易于集成硬件等优势,被广泛应用于电机控制场景。然而,要实现稳定、精确、高效的电机控制,仅有软件并不足够,还需结合硬件选型、控制逻辑设…...
CSS 定位属性的生动比喻:以排队为例理解 relative 与 absolute
目录 一、理解标准流与队伍的类比 二、relative 定位:队伍中 “小范围活动” 的人 三、absolute 定位:队伍中 “彻底离队” 的人 在学习 CSS 的过程中,定位属性relative和absolute常常让初学者感到困惑。它们的行为方式和对页面布局的影响较为抽象,不过,我们可以通过一个…...
Jenkins 发送钉钉消息
这里不介绍 Jenkins 的安装,可以网上找到很多安装教程,重点介绍如何集成钉钉消息。 需要提前准备钉钉机器人的 webhook 地址。(网上找下,很多教程) 下面开始配置钉钉机器人,登录 Jenkins,下载 …...
nt!KeRemoveQueue 函数分析之加入队列后进入等待状态
第一部分: 参考例子:应用程序调用kernel32!GetQueuedCompletionStatus后会调用nt!KeRemoveQueue函数进入进入等待状态 0: kd> g Breakpoint 8 hit nt!KiDeliverApc: 80a3c776 55 push ebp 0: kd> kc # 00 nt!KiDeliverApc 01 nt…...
OpenCV 风格迁移
一、引言 在计算机视觉和图像处理领域,风格迁移是一项令人着迷的技术。它能够将一幅图像(风格图像)的艺术风格,如梵高画作的笔触风格、莫奈的色彩风格等,迁移到另一幅图像(内容图像)上&#x…...
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
一、线程池概述 1、线程池的优势 线程池是一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与…...
Kubernetes nodeName Manual Scheduling practice (K8S节点名称绑定以及手工调度)
Manual Scheduling 在 Kubernetes 中,手动调度框架允许您将 Pod 分配到特定节点,而无需依赖默认调度器。这对于测试、调试或处理特定工作负载非常有用。您可以通过在 Pod 的规范中设置 nodeName 字段来实现手动调度。以下是一个示例: apiVe…...
QML中访问c++数据,并实现类似C#中mvvm模式详细方法
1. 背景需求2. 实现步骤 2.1. 定义 Model(数据模型) 2.1.1. DataModel.h2.1.2. DataModel.cpp 2.2. 定义 ViewModel(视图模型) 2.2.1. PersonViewModel.h2.2.2. PersonViewModel.cpp 2.3. 在 QML 中使用 ViewModel 2.3.1. main.cp…...
React 获得dom节点和组件通信
通过REF 实例对象的.current属性获得绑定的DOM节点 组件通信 组件通信 1 父传子 父组件传递数据 子组件接受数据 通过pros对象接受 子组件的形参列表props只读 props中数据不可修改 特殊情况 在子传父的过程中没有直接给子组件添加属性,而是向父组件中添加其他…...
代码,Java Maven项目打包遇到的环境问题
这几天在写一些Java版本的Langchain4J的 AI 测试case,有一段时间不运行的Java环境,反复出现环境问题,记录下 1、Java编译版本的问题 修改编译版本: 2、在IDE中运行遇到Maven中JDK版本问题 在ide中执行maven命令,遇到下…...
fisco-bcos 关于服务bash status.sh启动runing 中但是5002端口监听不到,出错的问题
bash status.sh Server com.webank.webase.front.Application Port 5002 is running PID(4587) yjmyjm-VMware-Virtual-Platform:~/webase-front$ sudo netstat -anlp | grep 5002 没有端口信息输出 此时可以查看log文件夹下的WeBASE-front.log,找到报错信息如下…...
C++ 数据结构之图:从理论到实践
一、图的基本概念 1.1 图的定义与组成 图(Graph)由顶点(Vertex)和边(Edge)组成,形式化定义为: G (V, E) 顶点集合 V:表示实体(如城市、用户) …...
linux多线(进)程编程——(5)虚拟内存与内存映射
前言(前情回顾) 进程君开发了管道这门技术后,修真界的各种沟通越来越频繁,这天进程君正与自己的孩子沟通,进程君的孩子说道: “爸爸,昨天我看他们斗法,小明一拳打到了小刚的肚子上&…...
SpringBoot 动态路由菜单 权限系统开发 菜单权限 数据库设计 不同角色对应不同权限
介绍 系统中的路由配置可以根据用户的身份、角色或其他权限信息动态生成,而不是固定在系统中。不同的用户根据其权限会看到不同的路由,访问不同的页面。对应各部门不同的权限。 效果 [{"id": 1,"menuName": "用户管理"…...
[dp8_子数组] 乘积为正数的最长子数组长度 | 等差数列划分 | 最长湍流子数组
目录 1.乘积为正数的最长子数组长度 2.等差数列划分 3.最长湍流子数组 写代码做到,只用维护好自己的一小步 1.乘积为正数的最长子数组长度 链接:1567. 乘积为正数的最长子数组长度 给你一个整数数组 nums ,请你求出乘积为正数的最长子数…...
资深词源学家提示词
Role: 资深词源学家 Profile: Language: 中文Description: 作为在词源学领域的卓越专家,具备深厚且多元的学术背景。精通拉丁语、古希腊语、梵语等一众古老语言,能够精准解析这些语言的古代文献,为探寻词汇起源挖掘第一手资料。在汉语研究方…...
深入探讨MySQL存储引擎:选择最适合你的数据库解决方案
前言 大家好,今天我们将详细探讨MySQL中几种主要的存储引擎,了解它们的工作机制、适用场景以及各自的优缺点。通过这篇文章,希望能帮助你根据具体需求选择最合适的存储引擎,优化数据库性能。 1. InnoDB - 默认且强大的事务性存储…...
【图像处理基石】什么是通透感?
一、画面的通透感定义 画面的通透感指图像在色彩鲜明度、空间层次感、物体轮廓清晰度三方面的综合表现,具体表现为: 色彩鲜明:颜色纯净且饱和度适中,无灰暗或浑浊感;层次分明:明暗过渡自然,光…...
无锡无人机超视距驾驶证怎么考?
无锡无人机超视距驾驶证怎么考?在近年来,无人机技术的迅猛发展使得无人机的应用场景变得愈发广泛,其不仅在环境监测、农业喷洒、快递配送等领域展现出真金白银的价值,同时也推动了无人机驾驶证的需求。尤其是在无锡,随…...
213、【图论】有向图的完全联通(Python)
题目描述 原题链接:105. 有向图的完全联通 代码实现 import collectionsn, k list(map(int, input().split())) adjacency collections.defaultdict(list) for _ in range(k):head, tail list(map(int, input().split()))adjacency[head].append(tail)visited_…...
(二十二)安卓开发中的数据存储之SQLite简单使用
在Android开发中,SQLite是一种非常常用的数据库存储方式。它轻量、简单,非常适合移动设备上的数据管理。本文将通过通俗易懂的语言,结合代码示例和具体场景,详细讲解SQLite在Android中的使用。 1. 什么是SQLite? SQLite是一个开…...
图像形态学操作对比(Opencv)
形态学基于图像的形状进行操作,用于处理二值化图像,主要包括腐蚀和膨胀两种基本操作。这些操作通常用于去除噪声、分隔或连接相邻的元素以及寻找图像中显著的最大点和最小点。 1. 形态学操作 import cv2 import numpy as np import matplotlib.pyplot …...
