2025_08_25 Dma_and_cache_consistency
今天在写驱动的时候,涉及到DMA和Cache的一致性问题,对于其中的一些疑惑做了记录。 DMA和CPU访问路径 CPU访问内存的时候,通常先访问cache(L1/L2),只有cache不命中的时候才回去访问主存(SRAM/DDR)。 DMA控制器访问内存的时候,一般是直接通过总线访问主存,不经过CPU的cache。 CPU → DMA → 设备(CPU写数据给外设): ------------------------------------ [CPU寄存器/程序] │ ▼ [CPU Cache] (CPU写数据 → 可能停留在cache里) │ (Clean Cache: 写回内存,保证DMA可见) ← 传输前执行 │ ▼ [内存RAM] ← DMA要读这里 │ ▼ [DMA总线] │ ▼ [外设设备] (UART/SPI/网卡等) 设备 → DMA → CPU(外设写数据给CPU): ------------------------------------ [外设设备] (ADC/网卡等) │ ▼ [DMA总线] │ ▼ [内存RAM] ← DMA写入数据 │ (Cache可能仍保存旧数据) │ (Invalidate Cache: 标记无效,下次CPU从内存取) ← 传输后执行 │ ▼ [CPU Cache] │ ▼ [CPU寄存器/程序]