别再死记硬背了!用大白话+图解,彻底搞懂DMA、链式DMA和RDMA的区别与联系
2026/5/6 17:26:30 网站建设 项目流程

从快递员到跨城闪送:用生活场景拆解DMA技术的三次进化

在计算机体系结构中,数据传输效率一直是性能提升的关键瓶颈。想象一下,当你在厨房做饭时,如果每次取食材都需要主厨(CPU)亲自跑到冰箱(内存)前拿取,整个烹饪流程将会多么低效。这就是DMA技术诞生的初衷——让专职的"快递员"(DMA控制器)代替主厨完成这些重复性工作。但技术演进的脚步从未停止,从基础DMA到链式DMA,再到革命性的RDMA,每一次进化都在重新定义数据传输的边界。

1. 基础DMA:计算机世界里的专职快递员

DMA(直接内存访问)技术就像公司里的快递专员,当部门间需要传递大量文件时,不再需要员工(CPU)亲自跑腿,而是由快递员直接完成文件搬运。这种机制解放了CPU,使其能够专注于核心计算任务。

典型DMA传输包含三个关键步骤:

  1. 任务委托:CPU设置源地址、目标地址和数据长度三要素
  2. 执行搬运:DMA控制器接管总线,直接操作内存
  3. 任务完成:DMA控制器通过中断通知CPU

在PCIe设备场景中,这个"快递系统"变得更加复杂。就像跨国快递需要海关(IOMMU/SMMU)协调一样,主机与设备间的DMA传输需要地址转换服务:

// 典型的DMA传输配置示例 void configure_dma(struct dma_controller *dma, dma_addr_t src, dma_addr_t dst, size_t length) { dma->source_reg = src; // 设置源地址 dma->dest_reg = dst; // 设置目标地址 dma->length_reg = length; // 设置传输长度 dma->control_reg |= DMA_START; // 启动传输 }

注意:现代系统中IOMMU的存在使得物理地址对设备不再透明,这就像快递员需要特殊的通关证件才能进入某些区域取件。

当内存碎片化严重时,传统的DMA就像要求快递员必须在一个连续仓库中取货,这在现实场景中变得越来越不切实际。这种局限性直接催生了链式DMA技术的诞生。

2. 链式DMA:智能快递柜系统

链式DMA解决了物理内存不连续的核心痛点,其设计思想类似于现代快递柜系统——即使货物分散在不同柜格中,快递员也能通过智能系统一次性完成全部取件。

链式DMA实现的关键数据结构:

数据结构作用类比现实
scatterlist描述离散内存块快递柜的各个格口
sg_table整合多个scatterlist整个快递柜系统
DMA描述符传输任务指令集快递员的取件清单

Linux内核中构建散列表的典型过程如下:

// 创建sg_table的代码示例 struct page **pages = alloc_pages_array(); // 获取物理页数组 struct sg_table *table = sg_alloc_table_from_pages( pages, page_count, 0, // 偏移量 total_length, GFP_KERNEL ); pci_map_sg(dev, table, nents, direction); // 执行DMA映射

这个过程中最精妙的是硬件支持的"链式"特性——每个任务描述符都包含下一个任务的地址指针,就像快递员完成一个柜格的取件后,手机自动显示下一个目标柜格的位置。

链式DMA在PCIe设备中的工作流程:

  1. 主机准备描述符链表并写入设备内存
  2. 设备DMA控制器读取首个描述符
  3. 按描述符指示执行数据传输
  4. 通过"next"指针获取下一个描述符
  5. 循环直至遇到结束标志

这种机制完美解决了内存碎片化问题,但依然受限于本地传输的范畴。当需要跨服务器传输数据时,RDMA技术应运而生,实现了真正的"跨城闪送"。

3. RDMA:数据中心的跨城闪送服务

RDMA(远程直接内存访问)将DMA的理念扩展到了网络层面,其革命性在于完全绕开了操作系统内核的干预,就像闪送员拥有直接进入客户家中指定位置的特权,无需户主(CPU)亲自接待。

三种主流RDMA协议对比:

特性InfiniBandRoCEv2iWARP
网络基础专用网络以太网以太网
传输层IB传输层UDP/IPTCP/IP
路由支持有限
部署成本
性能最优接近IB较低

RDMA的核心魔法在于其"零拷贝"和"内核旁路"特性。通过专门的网卡(HCA)和精心设计的软件栈,实现了用户空间到用户空间的直接传输:

+----------------+ +----------------+ | 应用A用户空间 | | 应用B用户空间 | | 缓冲区X | | 缓冲区Y | +--------+-------+ +--------+-------+ | | | | +--------v-------+ +--------v-------+ | HCA网卡 | | HCA网卡 | | DMA引擎 <-------+ DMA引擎 | +----------------+ +----------------+

技术提示:RDMA的"门铃"机制(Doorbell)是通知硬件的关键,相当于给闪送员按铃告知有新任务需要处理

在实际项目中部署RDMA时,有几个实用建议值得分享:

  • 确保网络支持无损传输(PFC等流控机制)
  • 合理设置QP(队列对)数量以避免资源争抢
  • 对频繁访问的内存区域进行预注册
  • 使用适当的传输模式(RC/UC/UD)

4. 技术选型:从场景出发的决策框架

面对三种DMA技术,选择不是非此即彼的单选题。就像物流系统中快递员、快递柜和闪送服务共存一样,关键在于根据实际场景匹配最合适的技术方案。

DMA技术决策矩阵:

考量维度基础DMA链式DMARDMA
适用距离本地本地远程
内存要求连续离散离散
CPU占用
延迟纳秒级纳秒级微秒级
典型应用外设数据传输视频处理分布式存储

在Kubernetes集群中部署RDMA网络时,可以采用以下YAML配置片段启用设备插件:

apiVersion: v1 kind: Pod metadata: name: rdma-app spec: containers: - name: test-container image: rdma-image resources: limits: rdma/rdma_shared_device_a: 1

从开发体验来看,这三种技术呈现出明显的代际差异。基础DMA就像手动挡汽车——需要精确控制每个细节;链式DMA升级为自动挡,解放了部分操作;而RDMA则如同自动驾驶汽车,开发者只需设定目的地,其余工作全部由专用硬件智能完成。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询