今天在写驱动的时候,涉及到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寄存器/程序]