计算机原理-Linux网络协议栈【驱动和网卡怎样交互?】

网卡如何和上层进行交互的 1、TCP/IP一般分为4层:应用层、传输层、网络层、网络接口层。网卡就属于最底层了(网络接口层,从七层协议就是物理层+数据链路层),那么网卡的上一层应该就是网络层,也就是IP层。 2、我们知道上层会通过dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)函数吧sk_buff 传给网卡驱动程序,那么这个函数怎么被调用的?? 阅读详情

最新个人博客 shankusu.me 

驱动和网卡的交互过程很少人会关注,但是如果你懂这方面的知识,会对用户态的网络编程更加理解深刻和通透。

 

驱动和网卡之间是异步通信。驱动在请求发送数据之后CPU就去干别的事情去了。网卡发送完包之后通过中断通知CPU,CPU再通过驱动程序了解到结果。和发送数据一样,接收数据也是异步的。网卡把数据倒腾到主存之后再通过中断通知CPU。

因此,预留一些空间来缓存发送和接受的buffer是必要的。大多数情况下,网卡使用环结构,这个环基本上就是一个队列,它具有固定的条目数,每一个条目存储一个发送或者接受的数据。条目被顺序的轮流使用,可以复用。如下图所示,可以看到数据传送过程。 

发送数据流

驱动接收上层的数据并创建一个网卡可以理解的数据包描述(send descriptor),包含了主存地址和大小。由于网卡只认识物理地址,所以驱动还需将虚拟地址转换成物理地址,之后把send descriptor放到Tx ring之中。下一步通过通知网卡有新的数据了,之后网卡通过DMA(直接内存访问)获取元数据和数据发送出去。发送完之后通过DMA把结果写回,之后发送中断通知。

数据的接收和发送反推过程差不多,自己看图:

不多说了,自己看图也能理解了。

网卡收发报文流程--linux内核协议栈 vs DPDK 现代网卡(如Intel X710)通常包含以下核心组件: ● DMA引擎:负责将数据包直接搬运至内存,绕过CPU。 ● 接收/发送描述符环(RX/TX Ring):环形队列存储描述符,每个描述符指向内存中的数据包缓冲区。 阅读详情

相关推荐

Linux系统RTL8139网卡驱动程序源码解析

Linux操作系统采用模块化设计,其中硬件驱动程序作为核心模块之一,负责与硬件设备进行交互。驱动程序与Linux内核之间的交互主要通过一系列的标准接口和数据结构来实现。在Linux内核中,驱动程序通过注册特定的函数接口,使内核能够通过这些接口与驱动程序进行通信。例如,网络驱动程序会注册一个处理网络数据包的函数,当网络子系统需要发送或接收数据包时,就会调用这个函数。

weixin_29092787的博客 860

《网络是怎样连接的》学习(二、协议栈和网卡)

文章目录二、用电信号传输TCP/IP数据2.1 创建套接字2.1.1 协议栈的内部结构 二、用电信号传输TCP/IP数据 2.1 创建套接字 2.1.1 协议栈的内部结构

博客 3643

Linux下EtherNet IP协议的实现

文中给出了在Linux下EtherNet/IP协议的实现方法。本程序也可方便的移植到嵌入式系统中,作为EtherNet/IP网络上的一个智能节点。

了解固件(Firmware)和驱动(Driver)

固件(Firmware) 就是写入EROM(可擦写只读存储器)或EEPROM(电可擦可编程只读存储器)中的程序。 固件是指设备内部保存的设备“驱动程序”,通过固件,操作系统才能按照标准的设备驱动实现特定机器的运行动作,比如光驱、刻录机等都有内部固件。 固件是担任着一个系统最基础最底层工作的软件。而在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其它软件组成,因此固件也就决定着...

qq_36412715的博客 4万+

USB2.0学习1--基本概念

USB全称是 Universal Serial Bus,即通用串行总线,是一种计算机与外围设备进行数据交互的串行通信标准。USB协议是在1994年底由英特尔、IBM、Microsoft等公司联合提出的,现由USB协会(USB-IF)管理。USB使用差分信号来传输数据,具有传输速度快、支持热插拔、连接灵活、独立供电、协议向下兼容等优点,目前应用十分广泛。

原海青木的博客 3759

基于激光雷达的目标跟随功能移植到自己的ROS机器人小车上

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载目标跟随的源码二、修改话题名称1.修改/cmd_vel话题名称2.修改/scan话题名称3.修改双电机正反转4.目标跟随功能测试 前言 本人尝试把github上的一个目标跟随项目移植到自己的机器人小车上,并且成功了,最终小车可以跟着人移动,在这里分享一下心得。基于激光雷达的目标跟随,通过获取激光雷达的信息,跟随最近的物体。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载目标跟随的源码 源码地址:https:

weixin_44574633的博客 4462

用户态协议栈基础知识

每一个客户端给服务器发送数据时, 都会先经过服务器的网卡,通过网卡解析之后,然后网卡有一块数据,能够把解析后的数据存储起来。 接着,再从网卡存储的数据拷贝到内核协议栈, 最后,再从内核协议栈拷贝到应用程序。 ...

qq_37120588的博客 675

医学超声影像研究——从拒稿到录用:我的UMB投稿实战复盘

本文分享了作者将一篇关于超声影像中肿瘤传统分类方法的研究论文,从被其他期刊拒稿到最终被《Ultrasound in Medicine & Biology》录用的完整实战经验。文章详细复盘了心态调整、精准选刊、针对UMB期刊的稿件精修、投稿系统操作细节以及与审稿人有效沟通回复的全过程,为医学影像领域的科研工作者提供了宝贵的投稿策略与实操指南。

stem5的博客 492

驱动中直接将数据包给网卡发送

在自己的驱动中直接将数据包给网卡发送 背景: 想要在一个DMA驱动里面将传输成功的数据从网口转发出去,但是如果在应用层提取数据的再转发的话,对于协议栈来说需要经过两次拷贝,从用户空间到内核空间,从内核空间到网卡,我们想要降低拷贝的次数,所以想要直接将数据发给网卡。 问题: 将数据直接发给网卡发送 解决过程: 法1(已验证):调用协议栈出口函数(发给网卡)dev_queue_xmit 已验证可调用,数据包在填充完成后,最终发送数据时,都会调用该函数dev_queue_xmit 参考资料: (1)一个构造skb

weixin_45268937的博客 1470

利用PV操作控制进程的并发进行---经典题解

前趋图 先理清楚前趋图中的逻辑关系:P1没有前驱,P2的前驱是P1,P3的前驱是P1、P2,P4的前驱是P2,P5的前驱是P3、P4。 前驱就是指只有在前驱进程完成后,该进程才能开始执行。由图可知,这里进程之间有6条有向弧,分别表示为P1→P2,P1→P3,P2→P3,P2→P4,P3→P5,P4→P5, 各个进程间的逻辑关系,那么我们需要设定6个信号量(S1、S2、S3、S4、S5、S6),利用PV操作来控制这些过程。 对于第一个空,P1执行完成之后,需要通知P2、P3可以开始,此处需要V(S

Yan Ka Kue的博客 6136

PX4飞控 vs 大疆A3:开源与闭源方案在无人机硬件架构中的实战对比

本文深入对比了PX4飞控与大疆A3在无人机硬件架构上的差异,分析了开源与闭源方案在工业级无人机开发中的优劣势。通过详细的硬件配置、传感器兼容性、扩展能力及性能测试数据,为开发者提供选型指南,特别适合需要自定义算法和复杂功能集成的项目。

a3b4c5的博客 888

数据从网卡到应用的过程

欢迎访问陈同学博客原文 最近看的《网络是怎样连接的》非常有趣,真的是 “计算机网络概论” 图解趣味版。 本文写写数据从网卡到应用的过程,内容与图片很多整理自《网络是怎样连接的》、《Tomcat内核设计与剖析》,有的图片因清晰度不够我进行了重绘。 总览 本文围绕这张图从下至上展开。假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢? 网卡 网卡(Network Adapte...

码代码的陈同学 3523

华为OD机试2025C卷真题题库目录|机考题库 + 算法考点详解

本文整理华为OD 2025C卷 机试(机考)题库,提供高频考点精析与详细题目内容,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 3987

计算机网络基础 — Linux 内核网络协议栈

接收到一个数据包,在完成必要的检查和处理后,其将以 TCP 协议首部中目的端口号为索引,在 tcp_prot 对应的 sock 结构体之 sock_array 数组中得到正确的 sock 结构体队列,再辅之以其他条件遍历该队列进行对应 sock 结构体的查询,在得到匹配的 sock 结构体后,将数据包挂入该 sock 结构体中的缓存队列中(由 sock 结构体中的 receive_queue 字段指向),从而完成数据包的最终接收。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。

m0_74282605的博客 1425

实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)

导读 本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。 背景介绍 在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。 实现步骤 本文只针对包含大部分文字的文档做倾斜矫正,思路来源是大部分文字倾斜后同一行的也在同一条直线,通过拟合直线计算文本倾斜角度,然后旋转来实现文本倾斜矫正。 详细步骤: ①加载倾斜图像 ②灰度转换+腐蚀+膨胀 ③Canny边缘检测 + 霍夫线变换检测直线 ...

Color Space的博客 3400

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

Linux网卡驱动设计

Linux网卡驱动设计 Linux网络体系结构          Linux的优点之一在于它丰富而稳定的网络协议栈。其范围从协议无关层到各种具体的网络协议实现。          协议层次对比图          网络接口层提供访问物理设备的驱动程序,对应的网络协议主要是以太网协议。          网络层协议管理离散计算机间的数据传输,如IP协议为用户和远程计算机提供了信

xiaqiuling213的博客 2298

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux 系统是如何收发网络包的?(计算机网络)

1.Linux收包:网卡收到网络包之后会通过 DMA 技术将网络包写入RingBuffer环形缓冲区,接着网卡向 CPU 发起硬件中断,当 CPU 收到硬件中断请求后,根据中断表,调用已经注册的中断处理函数。

qq_61504864的博客 1762

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一文解决ethtool 原理介绍和解决网卡丢包排查思路

(如有 ring buffer 的网卡,好像 frame 可以先存在 ring buffer 里再触发软件中断(下篇文章将详细解释 Linux 中 frame 的走向),ring buffer 是网卡和驱动程序共享,是设备里的内存,但是对操作系统是可见的,因为看到 linux 内核源码里网卡驱动程序是使用 kcalloc 来分配的空间,所以 ring buffer 一般都有上限,另外这个 ring buffer size,表示的应该是能存储的 frame 的个数,而不是字节大小。

youzhangjing_的博客 2553

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

网卡适配器收发数据帧流程

目录 文章目录 目录 前文列表 网卡的工作原理 网卡与网卡适配器 网卡的组成 CPU 与网卡的协同 网络设配器的收包流程 传统方式和 NAPI 方式 中断方式与轮询方式 网络设配器的发包过程 sk_buff(Socket Buffer) DMA 与 Buffer descriptor 参考文档 前文列表 《Linux 内核网络协议栈》 网卡的工作原理 Linux 操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理和计算机网络等几部分。所有的操作

mabin2005的专栏 2757

Linux网卡驱动(3)-网卡驱动深层分析

之前我们介绍了网卡是怎么把一个数据包发送到网络上的,但是这只是Linux网络系统中的一个非常小的部分。对于内核怎么把用户数据传递给网卡,以及内核怎么把网卡收到的数据传递给用户是一个庞大的知识。 学过计算机网络的都知道,当用户需要发送数据的时候,需要根据路由表找到数据包下一站该发送到哪个路由器,这个路由器叫做这个网卡的邻居。如果邻居的MAC地址不知道,还需要通过ARP协议获取的路由去的MAC地址,...

上善若水 515

Linux虚拟网卡设备tun/tap介绍_2

上次说了linux下tun模块的编译安装,是tapip用户态协议栈测试的一个必选项。接下来一个一个了解。 tapip代码仓库:https://github.com/chobits/tapip什么是Tun/Tap? 在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的...

Pou光明的博客 950

Linux网络数据包接收:原理、流程与优化策略

在当今数字化时代,网络已成为计算机系统不可或缺的部分。无论是日常的网页浏览、文件传输,还是大规模数据中心的高效通信,网络数据包的收发都在其中扮演着重要角色。对于 Linux 系统而言,深入理解网络数据包的接收过程,是优化网络性能、解决网络问题的关键。想象一下,你正在进行在线视频会议,突然画面卡顿、声音中断;或者在进行大规模数据传输时,速度远远低于预期。这些令人困扰的网络问题,很多都与 Linux 系统对网络数据包的接收处理过程紧密相关。

深度Linux 1593

linux网卡封装类型,Linux到底是如何收发网络包的

为了使得多种设备能通过网络相互通信,和为了解决各种不同设备在网络互联中的兼容性问题,国际标标准化组织制定了开放式系统互联通信参考模型(penSystemInterconnecTIonReferenceModel),也就是OSI网络模型,该模型主要有7层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。每一层负责的职能都不同,如下:应用层,负责给应用程序提供统一的接口;表示层,负...

weixin_28829339的博客 223

【转】嵌入式Linux网络驱动程序的开发及实现原理

 随着人们对开放源代码软件热情的日益增高,Linux作为一个功能强大而稳定的开源操作系统,越来越受到成千上万的计算机专家和爱好者的青睐。在嵌入式领域,通过对Linux进行小型化裁剪后,使其能够固化在容量只有几十兆字节的存储器芯片或单片机中,成为应用于特定场合的嵌入式Linux系统。Linux强大的网络支持功能实现了对包括TCP/IP在内的多种协议的支持,满足了面向21世纪的嵌入式系统应用联网的需求

wswifth的专栏 1705

Linux 的设备与驱动

深入理解 Linux 设备与驱动是进行 Linux 内核开发和设备驱动开发的基础。通过了解设备的分类、驱动的结构和工作流程,以及掌握一些关键技术点,可以更好地开发、调试和优化设备驱动程序,提高系统的性能和稳定性。同时,随着技术的不断发展,Linux 设备与驱动也在不断演进和完善,开发者需要不断学习和探索新的技术和方法,以适应不断变化的需求。

千千道的博客 1430
上一篇: 计算机原理-TCP到底怎么流量控制?
下一篇: 计算机原理-Linux进程调度:完全公平调度器CFS
shankusu2017
博客等级 码龄15年 155粉丝 155原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值