DMA、XDMA 、SG-DMA

DMA的全称是Direct Memory Access,即直接内存访问,是一种允许外设直接访问系统内存而无需CPU介入的技术。

DMA适用于各种外设管理

DMA的核心作用是解放CPU,让外设和内存之间的数据传输不再占用CPU资源。

这在几乎所有现代计算机系统中都是基础技术,比如磁盘读写、网络数据传输等场景。需要强调它的"免CPU参与"特性以及通道控制器的作用。

XDMA中的X通常指PCI Express,所以XDMA是基于PCIe总线的DMA技术。

XDMA专攻PCIe设备高速传输,FPGA加速用XDMA。

XDMA作为PCIe上的DMA实现,主要用于高速外设。

随着PCIe接口的普及,XDMA在GPU、FPGA加速卡等场景中尤为重要。

用户如果在使用这些硬件,XDMA的性能优势会非常明显。这里要突出PCIe总线的高带宽特性,以及XDMA如何利用这种特性实现高效数据传输。

SG-DMA则是Scatter-Gather DMA的缩写,支持非连续内存区域的传输

SG-DMA在网络包处理、文件系统等需要处理分散内存的场景中不可替代。网络驱动用SG-DMA

SG-DMA解决的是物理内存碎片化问题。

传统DMA要求连续内存,但操作系统分配的内存往往是分散的。

SG-DMA通过描述符链表处理非连续传输,这对现代操作系统和网络应用至关重要。

SG-DMA通过一次配置完成多区域传输。

DMA、XDMA 和 SG-DMA 这三个关键的数据传输技术,它们在现代计算机系统中扮演着至关重要的角色。

核心概念:解放 CPU,加速数据传输

这三种技术的核心目标都是相同的:减少 CPU 在大量数据搬运工作中的参与度,提高数据传输效率(速度)和系统整体性能(让 CPU 专注于计算任务)。

它们解决了 CPU 被琐碎的“搬运工”工作拖累的问题。


1. DMA

  • 全称: Direct Memory Access
  • 中文: 直接内存访问
  • 是什么?
    • 一种硬件机制(通常由一个或多个 DMA 控制器实现)。
    • 它允许外设系统主内存之间、或者系统主内存的不同区域之间,直接进行数据传输,而无需 CPU 逐字节地参与搬运过程
  • 作用:
    1. 解放 CPU: CPU 只需要初始化 DMA 传输(告诉 DMA 控制器:源地址、目标地址、传输长度),然后就可以去执行其他任务。DMA 控制器接管数据传输的实际工作,完成后通过中断通知 CPU。
    2. 提高数据传输效率:
      • 减少 CPU 开销: CPU 不再需要执行大量的 LOAD/STORE 指令来搬运数据。
      • 利用专用硬件: DMA 控制器是为高效数据传输设计的专用硬件,通常比 CPU 软件搬运更快。
      • 利用总线突发传输: DMA 控制器可以发起高效的突发传输模式,充分利用系统总线带宽。
    3. 降低系统延迟: CPU 可以更及时地响应其他事件,因为不会被长时间的数据搬运任务阻塞。
  • 使用场景: DMA 是几乎所有现代计算机系统中最基本、最普遍的数据传输机制,应用场景极其广泛:
    • 磁盘 I/O: 硬盘、SSD 读写数据到内存。
    • 网络通信: 网卡接收和发送网络数据包。
    • 音频/视频采集/播放: 声卡、视频采集卡、显卡与内存交换音频/视频帧数据。
    • USB 设备: U 盘、移动硬盘、摄像头等设备与主机内存交换数据。
    • 内存到内存拷贝: 大块内存区域之间的高效复制(需要 DMA 控制器支持)。
    • 片上外设: 微控制器内部的 ADC、DAC、串口、SPI、I2C 等模块与内存交换数据。
  • 核心限制:
    • 传统 DMA 通常要求传输的源内存区域和目标内存区域在物理地址上是连续的

2. XDMA

  • 全称: 通常指 PCI Express DMA (有时也指其他高速串行总线上的 DMA,但 PCIe 是最常见语境)
  • 中文: (基于) PCI Express 的直接内存访问
  • 是什么?
    • DMA 技术的一种具体实现和应用
    • 特指通过 PCI Express 总线进行 DMA 传输的技术。
    • 运行在 PCIe Endpoint (如显卡、网卡、FPGA 加速卡、高速采集卡) 上的 DMA 引擎(硬件模块),允许该端点设备直接读写连接在 PCIe Root Complex (CPU/芯片组侧) 上的系统主内存
  • 作用: 除了具有标准 DMA 的所有优点(解放 CPU、高效传输)外,XDMA 的核心作用在于:
    1. 实现 PCIe 设备与主机内存的高速、低延迟数据交换: 这是 PCIe 设备(尤其是高性能设备)与主机通信的基础方式。
    2. 支撑高性能计算和外设: 现代 GPU 计算、FPGA 硬件加速、高速网络适配器、NVMe SSD 等都极度依赖 XDMA 来达到 GB/s 甚至数十 GB/s 的数据吞吐量。CPU 根本不可能通过软件搬运跟上这种速度。
    3. 降低主机 CPU 负载: 复杂的计算任务卸载到 PCIe 设备(如 GPU/FPGA)上执行后,大量的输入输出数据通过 XDMA 高效传输,显著减轻 CPU 负担。
  • 使用场景: 所有需要通过 PCI Express 总线进行高性能数据交换的场景:
    • 独立显卡: 纹理数据上传、渲染结果回读。
    • 高性能计算 (GPGPU): CUDA/OpenCL 程序中,主机内存与 GPU 显存之间的数据传输。
    • FPGA 硬件加速卡: 主机将数据发送给 FPGA 处理,FPGA 处理完成后将结果返回给主机。
    • 高速网络适配器: 如 10GbE, 25GbE, 100GbE, InfiniBand 网卡,接收和发送海量网络包。
    • NVMe SSD: 主机内存与 SSD 闪存之间的高速数据传输。
    • 高速数据采集卡: 实时采集大量数据(如视频、雷达、科学仪器数据)直接写入主机内存。
    • 专用 AI 加速卡: 模型权重和输入输出数据在主机内存和加速卡内存之间的传输。
  • 关键点: XDMA 是 DMA 在高速串行总线 PCIe 上的具体体现和应用,是 PCIe 设备高性能工作的基石。

3. SG-DMA

  • 全称: Scatter-Gather DMA
  • 中文: 分散-聚集直接内存访问
  • 是什么?
    • DMA 技术的一种高级特性/增强模式
    • 它允许一次 DMA 传输操作处理多个在物理内存中不连续的内存块
    • Scatter (分散): 将来自单个连续数据源(如外设接收缓冲区)的数据,写入到主内存中多个不连续的物理块中。
    • Gather (聚集):主内存中多个不连续的物理块的数据,汇聚起来写入单个连续目标(如外设发送缓冲区)中。
  • 作用: 解决了传统 DMA 要求物理地址连续的核心限制:
    1. 高效处理非连续内存: 操作系统管理的内存对于用户程序和应用(尤其是网络栈、文件系统)通常是虚拟连续但物理分散的(页帧)。SG-DMA 使得 DMA 传输能够直接与这些分散的物理页打交道,无需 CPU 先将数据拷贝到一个物理连续的大缓冲区中。
    2. 实现真正的“零拷贝”: 是零拷贝网络、零拷贝文件读写等高性能 IO 技术的关键基础。应用层数据可以直接从网卡 DMA 到应用缓冲区(物理分散),或从应用缓冲区(物理分散)直接 DMA 到网卡/磁盘,避免了内核与应用层之间昂贵的数据拷贝。
    3. 减少内存拷贝开销: 省去了创建和复制物理连续缓冲区的步骤,节省 CPU 时间和内存带宽。
    4. 提高内存利用率: 可以利用系统中分散的空闲小内存块来传输大块数据。
  • 使用场景: 所有需要 DMA 传输的数据在物理内存中可能不连续的场景:
    • 网络数据包处理 (最重要场景):
      • 接收: 一个完整的数据包可能被 DMA 写入到多个分散的物理页帧中(由网卡驱动或操作系统预先设置好 SG List)。
      • 发送: 一个待发送的数据包,其数据可能来源于应用层多个分散的缓冲区(如 struct iovec),SG-DMA 能直接从这些分散的物理位置读取数据组合成包发送出去。
    • 文件系统读写: 大文件的数据块在内存中可能物理分散,SG-DMA 允许磁盘控制器直接读取/写入这些分散的块,无需内核将它们拼接到连续缓冲区。
    • 用户空间缓冲区 DMA: 当应用程序(通过 mmap 或类似机制)将其虚拟地址空间暴露给 DMA 引擎(如某些 DPDK 场景、或带 IOMMU 保护的 XDMA)时,应用缓冲区在物理上几乎总是分散的,必须使用 SG-DMA。
    • 任何处理大块“虚拟连续但物理分散”内存的 DMA 操作。
  • 实现方式: SG-DMA 引擎需要驱动程序提供一份 Scatter-Gather List。这个 SG List 是一个数据结构(通常是数组或链表),其中的每一项描述了一个物理内存块的信息:
    • 物理起始地址
    • 该块的长度 (字节数)
    • (可选的) 下一个 SG List 项的地址或结束标志
    • DMA 控制器根据这个 SG List 自动完成对多个非连续块的传输。

总结与关系

  • DMA: 是基础概念和通用技术,解决外设/内存间免 CPU 搬运数据的问题。核心限制是需要物理连续内存。
  • XDMA: 是 DMA 在 PCI Express 总线上的具体实现和应用,是现代高性能扩展卡(GPU, FPGA, 高速网卡/NVMe SSD)与主机内存高速通信的必备机制。它关注的是通过哪种总线进行 DMA。
  • SG-DMA: 是 DMA 技术的一种高级模式/功能增强,解决了 DMA 对物理地址连续性的要求。它关注的是如何描述和组织传输的内存块(尤其是物理非连续块)。SG-DMA 能力可以内置于 XDMA 引擎中(现代 PCIe 设备普遍支持),也可以内置于其他总线(如传统 PCI, 甚至某些片上总线)的 DMA 控制器中。

形象比喻:

  • DMA: 一个高效的搬运工,负责把货物(数据)从 A 点搬到 B 点。但他要求 A 点和 B 点的仓库都必须是一个连续的大仓库。
  • XDMA: 这个搬运工专门负责在 高速公路 (PCIe) 上运送货物,连接的是城市中心仓库(主机内存)和城外的大型专业工厂/仓库(PCIe 设备)。
  • SG-DMA: 这个搬运工升级了,他有一张提货/送货清单 (SG List)。清单上写着:先去 A1 仓库取 1 箱,再去 A5 仓库取 3 箱,然后送到 B2 仓库 2 箱,再送到 B7 仓库 2 箱。这样,他就能高效处理分散在多处小仓库(物理非连续内存页)的货物,而不需要别人先把所有货物集中到一个大仓库(物理连续缓冲区)再叫他来搬。

在实际系统中,尤其是在高性能 PCIe 设备(如 GPU、高速网卡、FPGA 加速卡)上,XDMA 和 SG-DMA 通常是紧密结合使用的

设备上的 XDMA 引擎具备 SG-DMA 功能,驱动程序构建 SG List 来描述主机内存中分散的缓冲区,然后启动一次 XDMA 传输(可能是 Scatter 或 Gather),高效地完成主机与设备间大量非连续数据的搬运,同时最大程度地解放 CPU。

posted @ 2025-06-17 17:12  青云Zeo  阅读(519)  评论(0)    收藏  举报