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