1. 网络驱动概述:Linux网络驱动模型、NAPI与中断的关系、PHY芯片在链路中的作用

本章作为课程的开篇,旨在为后续深入的中断处理与PHY链路检测协同机制建立完整的知识框架。我们将从Linux网络驱动模型的宏观架构出发,逐步聚焦到NAPI(New API)如何重塑中断与轮询的关系,最后明确PHY芯片在物理链路中的核心角色。理解这三者的协同,是掌握高性能嵌入式网络驱动的关键。

1.1 Linux网络驱动模型:分层与抽象

Linux网络驱动采用严格的分层架构,从上至下依次为:套接字层、协议栈(TCP/UDP/IP)、网络设备子系统以及硬件驱动层。驱动开发者主要关注的是网络设备子系统与硬件驱动层的交互。

核心数据结构 struct net_device 代表一个网络接口,驱动通过注册该结构体并实现其操作函数集 struct net_device_ops 来与内核交互。关键操作包括:

  • ndo_open:启动设备,申请资源,注册中断。
  • ndo_stop:停止设备,释放资源。
  • ndo_start_xmit:启动数据包发送。
  • ndo_do_ioctl:处理设备特定控制命令(如PHY寄存器读写)。
关键点: 驱动模型的核心思想是数据平面与控制平面分离。数据平面(收发包)追求高性能,控制平面(链路配置、统计)追求灵活性。PHY链路检测属于控制平面,但它的状态变化会直接影响数据平面的中断处理策略。

下图展示了Linux网络驱动模型的核心分层与数据流路径:

Linux网络驱动模型分层架构 Linux网络驱动模型分层架构 套接字层 (Socket Layer) — 系统调用接口 协议栈 (TCP/UDP/IP) — 数据封装与路由 网络设备子系统 (net_device / net_device_ops) 硬件驱动层 (中断处理 / PHY驱动 / DMA) 物理层 (PHY芯片 / MII总线 / 网线) 数据流方向

1.2 NAPI与中断的关系:从“中断风暴”到“优雅轮询”

传统网络驱动在每次收到数据包时都会触发硬件中断。在高吞吐场景下,这会导致中断风暴,CPU被频繁打断,上下文切换开销巨大,系统吞吐量反而下降。

NAPI(New API) 是Linux为解决此问题引入的混合机制。其核心思想是:

  1. 中断开启阶段:第一个数据包到达时,触发硬件中断,驱动在中断处理函数中关闭该设备的硬件中断,并将设备注册到内核的轮询列表中。
  2. 轮询阶段:内核在软中断上下文(NET_RX_SOFTIRQ)中调用驱动的 poll 函数,批量从硬件接收队列中读取数据包。
  3. 退出条件:当 poll 函数处理完所有数据包,或达到预设的预算(budget)时,重新开启硬件中断,等待下一个数据包。
NAPI优势: 在低负载时,中断响应快;在高负载时,轮询模式消除了中断开销,实现了自适应调节。这是现代千兆/万兆网卡驱动的标准配置。

下表对比了传统中断模式与NAPI模式的关键差异:

特性 传统中断模式 NAPI模式
触发方式 每个数据包触发一次中断 首个数据包触发中断,后续轮询
高负载性能 差(中断风暴导致CPU满载) 优(轮询模式降低开销)
低负载延迟 低(立即响应) 低(中断立即唤醒)
CPU占用 高(频繁上下文切换) 低(批量处理)
适用场景 低速网络(< 100Mbps) 高速网络(≥ 100Mbps)

下图展示了NAPI在中断与轮询之间的状态转换流程:

NAPI中断与轮询状态机 NAPI中断与轮询状态转换 中断等待 中断使能,等待数据 中断处理 关闭中断,注册poll 轮询处理 批量收包 (poll) 包处理完? 数据到达 注册poll 是:开启中断 否:继续轮询

1.3 PHY芯片在链路中的作用:物理层的“翻译官”与“哨兵”

PHY(Physical Layer)芯片是网络接口的物理层核心器件,位于MAC(Media Access Control)层与物理介质(如网线、光纤)之间。它的主要职责包括:

  • 信号编解码:将MAC层发送的数字信号编码为适合物理介质传输的模拟信号(如PAM5、MLT-3),并反向解码。
  • 链路建立与协商:通过Auto-Negotiation(自动协商)机制,与对端设备协商最佳工作模式(速度、双工模式、流控)。
  • 链路状态检测:持续监测物理链路是否正常(Link Up/Down),并通过中断引脚或寄存器轮询通知MAC层驱动。
  • 状态统计:提供链路质量指标,如CRC错误计数、信号质量检测等。
常见陷阱: 许多嵌入式开发者在调试网络时,只关注MAC层驱动,忽略了PHY芯片的配置。如果PHY的自动协商失败或链路检测中断未正确连接,MAC层将无法正常工作,表现为“Link is Up”但无法收发数据。

PHY芯片通过MII(Media Independent Interface) 或其变种(RMII、GMII、RGMII)与MAC层通信。驱动通过SMI(Serial Management Interface,即MDIO/MDC) 总线读写PHY的内部寄存器,实现对PHY的控制与状态读取。

下表列出了PHY芯片中几个关键寄存器的功能:

寄存器地址 标准名称 关键位域 作用
0 BMCR (Basic Mode Control Register) Bit 15: Reset
Bit 13: Speed Select
Bit 12: Auto-Negotiation Enable
控制PHY复位、速度选择、自协商使能
1 BMSR (Basic Mode Status Register) Bit 2: Link Status
Bit 5: Auto-Negotiation Complete
读取链路状态、自协商完成标志
4/5 ANAR / ANLPAR (Auto-Negotiation Advertisement / Link Partner Ability) 技术能力字段 读取本端和对端的协商能力
17 PHY Specific Status Register (厂商自定义) 实际速度、双工模式 获取协商后的实际工作模式

下图展示了PHY芯片在MAC与物理介质之间的桥梁作用,以及中断信号的流向:

PHY芯片在链路中的角色与中断路径 PHY芯片在链路中的角色与中断路径 MAC层 (CPU / SoC集成) 中断控制器 MII/RGMII 数据总线 PHY芯片 自动协商 链路检测 网线/光纤 物理介质 中断信号 (Link Change) SMI (MDIO/MDC) 管理总线

1.4 三者的协同:中断处理与PHY链路检测的耦合点

在嵌入式系统中,PHY芯片的链路状态变化(如网线拔出、插入)通常通过硬件中断引脚通知SoC。这个中断信号的处理流程与NAPI机制紧密耦合:

  1. PHY中断触发:PHY芯片检测到链路状态变化(Link Down → Link Up),拉低中断引脚。
  2. MAC层中断处理:SoC的中断控制器收到中断,调用驱动注册的中断处理函数(通常是 phy_interrupt)。
  3. PHY状态机更新:驱动通过MDIO总线读取PHY寄存器,确认链路状态,并调用 phy_link_change 回调函数。
  4. NAPI策略调整:如果链路变为Down,驱动可能需要停止NAPI轮询,关闭发送队列,避免无意义的收发包尝试。如果链路恢复Up,则重新开启NAPI,恢复数据收发。
协同要点: PHY中断处理是控制平面的紧急事件,而NAPI是数据平面的性能机制。两者必须通过驱动内部的标志位或状态机进行同步,防止在链路未稳定时错误地启动NAPI轮询,导致空转或异常。