1. DMA 基础概念

直接存储器访问(Direct Memory Access, DMA)是网络驱动性能的基石。在网卡收发包路径中,DMA 负责在设备与主存之间搬运数据,而无需 CPU 逐字节干预。理解 DMA 的工作原理、在网卡中的角色以及传输模式,是后续优化描述符池建立时间的前提。

1.1 DMA 工作原理

DMA 是一种硬件机制,允许外设(如网卡)绕过 CPU,直接与系统内存交换数据。其核心组件包括:

  • DMA 控制器(DMAC):协调传输的硬件引擎,管理源地址、目的地址、传输长度和方向。
  • 描述符(Descriptor):内存中的数据结构,包含缓冲区地址、长度、状态标志等元信息,DMAC 通过轮询或中断感知描述符状态。
  • 总线仲裁器:当 CPU 和 DMA 同时请求总线时,仲裁器决定优先级,通常 DMA 优先级高于 CPU 以保障数据吞吐。
关键指标: DMA 传输延迟通常为微秒级,一次典型的 1500 字节 MTU 报文传输,DMA 搬运时间约 1–3 µs(PCIe Gen3 x1 理论带宽约 1 GB/s)。
DMA 工作原理流程图 CPU DMA 控制器 系统内存 网卡外设 配置描述符 读取/写入数据 触发传输 数据旁路 CPU 说明:CPU 仅参与描述符配置,数据搬运由 DMA 控制器独立完成,实现零 CPU 拷贝。

1.2 DMA 在网卡中的作用

在网卡驱动中,DMA 承担三个核心职责:

职责 描述 性能影响
接收(RX) 网卡将接收到的帧直接 DMA 到预分配的接收缓冲区,CPU 仅需处理协议栈。 减少 CPU 中断次数,提升 PPS(包每秒)上限。
发送(TX) CPU 将待发送数据在内存中准备好,网卡通过 DMA 读取并发送到线路。 避免 CPU 逐字节拷贝,降低发送延迟。
描述符回写 网卡完成传输后,通过 DMA 将描述符状态回写到内存,通知驱动回收或处理。 回写延迟直接影响驱动轮询效率。
优化切入点: 描述符池的建立时间直接影响 RX/TX 缓冲区的注册效率。如果描述符分配和 DMA 地址映射耗时过长,网卡在初始化阶段无法快速进入工作状态。

1.3 DMA 传输模式

根据总线控制权和传输粒度,DMA 分为三种模式:

  • 轮询模式(Polling):CPU 循环检查描述符完成标志,适合低延迟、高频率的小包场景(如 NFV/DPDK)。
  • 中断模式(Interrupt):网卡完成传输后触发中断,CPU 响应处理,适合传统内核网络栈。
  • 混合模式(Hybrid):低负载时使用中断,高负载时自动切换为轮询(如 NAPI),兼顾延迟和吞吐。
DMA 传输模式对比 轮询模式 CPU 持续检查描述符 延迟:1–5 µs 适用:DPDK、高速网卡 CPU 占用:高 中断模式 网卡触发 IRQ 延迟:10–50 µs 适用:传统内核网络栈 CPU 占用:低 混合模式 低负载中断,高负载轮询 延迟:动态调整 适用:NAPI、通用驱动 CPU 占用:自适应 选择传输模式时需权衡延迟、CPU 开销和吞吐,描述符池初始化策略也需适配对应模式。

1.4 描述符与 DMA 地址映射

描述符池是 DMA 初始化的核心数据结构。每个描述符包含:

  • 缓冲区地址(Buffer Address):DMA 可访问的物理地址,由 dma_map_single() 或 dma_alloc_coherent() 分配。
  • 长度(Length):缓冲区有效数据长度,通常为 2048 字节(含 2 个 MTU)。
  • 状态标志(Status):指示描述符是否空闲、已完成或出错。
  • 下一个描述符指针(Next):用于链式描述符,支持 scatter-gather 传输。
常见陷阱: 描述符池建立时,如果 DMA 地址映射未考虑 IOMMU/SMMU 页表刷新,可能导致映射失效或缓存一致性问题。在初始化阶段,务必调用 dma_sync_single_for_device() 确保一致性。

1.5 本章小结

DMA 是网卡驱动数据路径的主动脉。理解其工作原理、在网卡中的角色以及传输模式,有助于在描述符池建立阶段做出正确的设计决策:

  • 选择轮询模式时,描述符池需要更大的预分配深度(如 4096 个描述符)以减少轮询空转。
  • 中断模式对描述符池建立延迟不敏感,但需要更精细的中断合并策略。
  • 混合模式(NAPI)要求描述符池支持动态调整,初始化时需预留弹性空间。