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()。
浙公网安备 33010602011771号