DMA-DDR-CPU数据传输

1. DMA

DMA在传输存储器和I/O设备的数据时,无须CPU来控制数据的传输,直接通过DMA控制器(direct memory access controller,DMAC)完成外设与存储器之间以及存储器与存储器之间的数据高速传输。

目的:是为了减少CPU在数据传输中的负担,提升系统效率。

例如:从硬盘读取数据到内存时,DMA控制器接管数据传输任务,CPU只需发起指令,无需全程参与。
典型应用场景:高速数据传输(如磁盘I/O、网络数据包收发)、实时系统中减少CPU延迟(如音频/视频流处理)。

2. DDR

DDR 是一种内存技术,通过每个时钟周期传输两次数据(上升沿和下降沿)来提高性能.

目的:提升内存的数据传输速率带宽,满足高性能计算需求。

例如:现代内存条(RAM)普遍采用DDR/DDR5技术(Double Data Rate,双倍数据速率)。

3. CPU

CPU(Central Processing Unit,中央处理器) 是计算机的“大脑”,负责执行程序指令、处理数据和控制其他硬件组件。它是计算机系统的核心,直接影响整体性能和功能.

4. CPU 缓存一致性问题

DDR是主存(Memory),但 CPU 并不会直接访问 DDR,而是通过缓存(Cache)进行加速

CPU 读取数据时先看 L1/L2/L3 缓存,如果命中(Cache Hit),直接用缓存数据,速度快。如果缓存没有命中(Cache Miss),才会从 DDR 读取数据,速度慢。

CPU 写入数据时可能只是写到缓存,不会立刻写回 DDR。如果数据只是停留在缓存中,而 DMA 设备(如网卡、GPU、摄像头)直接访问 DDR,它可能读取到旧数据。

5.flush_dcache_area() vs invalidate_dcache_area()

CPU → DDR(CPU 写数据,DMA/外设读取)需要
flush_dcache_area():写回DDR并清除缓存,确保 DMA 读取的是最新数据。

DDR → CPU(DMA/外设写入,CPU读取)需要
invalidate_dcache_area():丢弃缓存数据,确保 CPU 读取的是 DDR 的最新数据

6.举例说明

当 CPU 修改了数据,DMA 或外设要读取数据时

buffer[0] = 0xAA;
flush_dcache_area(buffer, sizeof(buffer));//确保 DMA 读取的是最新数据
dma_transfer(buffer);

当 DMA 或外设修改了数据,CPU 要读取数据时

dma_receive(buffer);
invalidate_dcache_area(buffer, sizeof(buffer));//确保 CPU 读取的是 DDR 的最新数据
cpu_process(buffer);

如果使用 Linux DMA API(如 dma_map_single()),这些操作会被自动处理,通常不需要手动调用 flush_dcache_area() 或 invalidate_dcache_range()。

posted @ 2025-03-04 16:25  chivalrySun  阅读(328)  评论(0)    收藏  举报