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寄存器读写)。
下图展示了Linux网络驱动模型的核心分层与数据流路径:
1.2 NAPI与中断的关系:从“中断风暴”到“优雅轮询”
传统网络驱动在每次收到数据包时都会触发硬件中断。在高吞吐场景下,这会导致中断风暴,CPU被频繁打断,上下文切换开销巨大,系统吞吐量反而下降。
NAPI(New API) 是Linux为解决此问题引入的混合机制。其核心思想是:
- 中断开启阶段:第一个数据包到达时,触发硬件中断,驱动在中断处理函数中关闭该设备的硬件中断,并将设备注册到内核的轮询列表中。
- 轮询阶段:内核在软中断上下文(
NET_RX_SOFTIRQ)中调用驱动的poll函数,批量从硬件接收队列中读取数据包。 - 退出条件:当
poll函数处理完所有数据包,或达到预设的预算(budget)时,重新开启硬件中断,等待下一个数据包。
下表对比了传统中断模式与NAPI模式的关键差异:
| 特性 | 传统中断模式 | NAPI模式 |
|---|---|---|
| 触发方式 | 每个数据包触发一次中断 | 首个数据包触发中断,后续轮询 |
| 高负载性能 | 差(中断风暴导致CPU满载) | 优(轮询模式降低开销) |
| 低负载延迟 | 低(立即响应) | 低(中断立即唤醒) |
| CPU占用 | 高(频繁上下文切换) | 低(批量处理) |
| 适用场景 | 低速网络(< 100Mbps) | 高速网络(≥ 100Mbps) |
下图展示了NAPI在中断与轮询之间的状态转换流程:
1.3 PHY芯片在链路中的作用:物理层的“翻译官”与“哨兵”
PHY(Physical Layer)芯片是网络接口的物理层核心器件,位于MAC(Media Access Control)层与物理介质(如网线、光纤)之间。它的主要职责包括:
- 信号编解码:将MAC层发送的数字信号编码为适合物理介质传输的模拟信号(如PAM5、MLT-3),并反向解码。
- 链路建立与协商:通过Auto-Negotiation(自动协商)机制,与对端设备协商最佳工作模式(速度、双工模式、流控)。
- 链路状态检测:持续监测物理链路是否正常(Link Up/Down),并通过中断引脚或寄存器轮询通知MAC层驱动。
- 状态统计:提供链路质量指标,如CRC错误计数、信号质量检测等。
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与物理介质之间的桥梁作用,以及中断信号的流向:
1.4 三者的协同:中断处理与PHY链路检测的耦合点
在嵌入式系统中,PHY芯片的链路状态变化(如网线拔出、插入)通常通过硬件中断引脚通知SoC。这个中断信号的处理流程与NAPI机制紧密耦合:
- PHY中断触发:PHY芯片检测到链路状态变化(Link Down → Link Up),拉低中断引脚。
- MAC层中断处理:SoC的中断控制器收到中断,调用驱动注册的中断处理函数(通常是
phy_interrupt)。 - PHY状态机更新:驱动通过MDIO总线读取PHY寄存器,确认链路状态,并调用
phy_link_change回调函数。 - NAPI策略调整:如果链路变为Down,驱动可能需要停止NAPI轮询,关闭发送队列,避免无意义的收发包尝试。如果链路恢复Up,则重新开启NAPI,恢复数据收发。