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)。
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),兼顾延迟和吞吐。
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)要求描述符池支持动态调整,初始化时需预留弹性空间。