当前位置: 首页 > news >正文

网卡驱动接收数据----软中断处理数据----socket接收数据

1. 数据接收的详细流程

(1) 网卡接收数据并写入 DMA 缓冲区
  • DMA 缓冲区
    网卡驱动初始化时,会为每个接收队列分配一块 DMA 缓冲区(通常是一个环形队列,称为 RX Ring)。

  • 数据接收
    当网卡接收到数据包时,会通过 DMA(直接内存访问) 将数据包直接写入内核预先分配的 DMA 缓冲区(sk_buff),无需 CPU 参与

  • 描述符更新
    网卡会更新 接收描述符(Descriptor),标记数据包的位置和状态。


(2) 硬件中断触发
  • 硬件中断
    当网卡将数据包写入 DMA 缓冲区后,会触发 硬件中断,通知 CPU 有数据到达。

  • 硬件中断处理程序
    硬件中断处理程序(如 ixgbe_msix_clean_rings)执行以下操作:

    1. 从 DMA 缓冲区取出数据包
      硬件中断处理程序从 DMA 缓冲区中取出数据包(sk_buff)。

    2. 将数据包放入内核的接收队列
      将数据包放入 每 CPU 的接收队列(如 softnet_data->input_pkt_queue)。

    3. 触发软中断
      硬件中断处理程序触发 软中断(NET_RX_SOFTIRQ,调度 net_rx_action 执行。


(3) 软中断处理数据
  • 软中断触发
    硬件中断处理程序触发软中断后,内核会在合适的时机(如硬件中断返回时)调度 net_rx_action 执行。

  • net_rx_action 执行
    net_rx_action 是软中断处理函数,负责从接收队列中取出数据包并进行协议栈处理:

    1. 从接收队列取出数据包
      从 softnet_data->input_pkt_queue 中取出数据包(sk_buff)。

    2. 协议栈处理
      解析数据包的协议头(如 Ethernet、IP、TCP/UDP),并将数据包传递给协议栈的上层(如 ip_rcvtcp_v4_rcv)。

    3. 放入 socket 接收缓冲区
      将数据包放入对应 socket 的接收缓冲区。


(4) 进程接收数据
  • recv(socket) 调用
    进程调用 recv(socket) 等待数据时,内核会检查 socket 的接收缓冲区:

    1. 如果接收缓冲区有数据,将数据拷贝到用户空间缓冲区,并返回。

    2. 如果接收缓冲区为空,进程进入睡眠状态,等待数据到达。

  • 数据到达时唤醒进程
    当数据包到达并放入 socket 的接收缓冲区时,内核会唤醒等待的进程。


2. 关键问题解答

(1) 软中断是从 DMA 写入的内核缓冲区获取数据给协议栈吗?
  • 不是直接获取
    软中断 不直接从 DMA 缓冲区获取数据,而是从 内核的接收队列(如 softnet_data->input_pkt_queue)中获取数据。

  • 数据传递路径

    1. 网卡通过 DMA 将数据包写入 DMA 缓冲区。

    2. 硬件中断处理程序从 DMA 缓冲区取出数据包,放入内核的接收队列。

    3. 软中断从接收队列中取出数据包,传递给协议栈。

(2) 硬中断在其中有转一手拷贝吗?
  • 没有额外的拷贝
    硬件中断处理程序 不会拷贝数据包,而是直接将数据包(sk_buff)从 DMA 缓冲区移动到内核的接收队列。

  • 零拷贝设计
    数据包从网卡到内核协议栈的传递过程中,没有额外的数据拷贝,只有 sk_buff 的指针传递。


3. 软中断的角色

  • 异步处理
    软中断用于异步处理网络数据包,避免在硬件中断上下文中执行耗时操作(如协议栈处理)。

  • 任务分解
    将数据包处理任务分解为硬件中断(快速接收)和软中断(协议栈处理),提高系统响应速度。

  • 批量处理
    net_rx_action 会批量处理多个数据包,减少上下文切换开销。


4. 数据传递的路径总结

  1. 网卡 → DMA 缓冲区
    数据通过 DMA 写入内核的 DMA 缓冲区(sk_buff)。

  2. DMA 缓冲区 → 内核接收队列
    硬件中断处理程序将数据包从 DMA 缓冲区移动到内核的接收队列(如 softnet_data->input_pkt_queue)。

  3. 内核接收队列 → 协议栈
    软中断 net_rx_action 从接收队列中取出数据包,传递给协议栈(如 ip_rcvtcp_v4_rcv)。

  4. 协议栈 → socket 接收缓冲区
    协议栈将数据包放入对应 socket 的接收缓冲区。

  5. socket 接收缓冲区 → 用户空间
    进程调用 recv(socket) 时,内核将数据从 socket 接收缓冲区拷贝到用户空间。


5. 性能优化

  • NAPI(New API)
    在高流量场景下,使用 NAPI 减少硬件中断次数,通过轮询方式批量处理数据包。

  • RPS(Receive Packet Steering)
    将数据包处理负载均衡到多个 CPU 核心,提高多核系统的性能。

  • XDP(eXpress Data Path)
    在网卡驱动层直接处理数据包,绕过内核协议栈,提升性能。


6. 总结

  • DMA 缓冲区:网卡通过 DMA 将数据包直接写入内核的 DMA 缓冲区。

  • 硬件中断:硬件中断处理程序将数据包从 DMA 缓冲区移动到内核的接收队列,并触发软中断。

  • 软中断:软中断从接收队列中取出数据包,传递给协议栈。

  • 零拷贝设计:数据包从网卡到协议栈的传递过程中,没有额外的数据拷贝。

相关文章:

  • 太阳同步轨道的进动速度解析
  • 摄像头应用编程(二):单平面视频采集
  • TCP 连接故障排查与 SYN 洪泛攻击防御
  • 【网络编程】之TCP通信步骤
  • 幸狐picomax SDK 适配 rv1160G2 摄像头
  • CyberRT(apollo) 定时器模块简述及bug分析
  • 【Elasticsearch】索引生命周期管理相关的操作(Index Lifecycle Actions)
  • KVMOVS组网配置案例-4
  • 机器学习:特征提取
  • Linux远程连接vscode
  • MySql面试总结(二)
  • 英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会
  • 大数据“调味“ ,智慧“添香“,看永洪科技助力绝味食品数字化新征程
  • vue3.2响应式优化
  • 【漫话机器学习系列】115.曼哈顿距离(Manhattan Distance)
  • 搭建本地AI编程助手Visual Studio Code + Ollama 、JetBrains IDEA + Ollama
  • C语言基础之【指针】(中)
  • Windows环境下Maven的配置
  • 【密码学——基础理论与应用】李子臣编著 第二章 古典密码 课后习题
  • <进程间通信>共享内存
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • 以总理内塔尼亚胡称决心彻底击败哈马斯
  • 习近平同俄罗斯总统普京会谈
  • 夜读丨母亲的手擀面
  • 上海明后天将迎强风大雨,陆地最大阵风7~9级
  • 关税风暴下,3G资本拟94亿美元私有化美国鞋履巨头斯凯奇,溢价30%