포스트

임베디드 스터디 - DMA 개념

임베디드 스터디 - DMA 개념

DMA 개요

  • DMA(Direct Memory Access) : CPU의 개입 없이 주변장치가 직접 메모리에 접근하는 방식
1
2
3
4
CPU 방식  : CPU가 레지스터 → 메모리 복사를 직접 수행 → CPU 점유
DMA 방식  : DMA 컨트롤러가 전송, CPU는 다른 작업 수행
                ↓
            전송 완료 시 DMA가 인터럽트로 CPU에 알림
  • 대용량 데이터 전송 시 CPU 프로세스 지연 방지

캐시 일관성 문제

  • CPU는 메모리 데이터를 캐시에 올려두고 사용함
  • DMA가 메모리에 직접 데이터를 쓰면 CPU 캐시와 실제 메모리가 불일치하는 문제 발생
1
2
3
CPU가 메모리 0x1000을 읽음 → 캐시에 저장
DMA가 메모리 0x1000에 새 데이터를 씀
CPU가 다시 0x1000을 읽음 → 캐시에서 읽음 (옛날 데이터!)

Coherent DMA

  • 캐시를 사용하지 않는 메모리 영역을 할당 → 항상 일관성 보장
  • CPU와 DMA 모두 항상 실제 메모리에 직접 접근
  • 성능 : 읽기/쓰기 속도 낮음 (캐시 이점 없음)
  • 적합한 경우 : 항상 유지되는 버퍼 (드라이버 초기화 시 할당 후 계속 사용)
1
dma_alloc_coherent(dev, size, &dma_addr, GFP_KERNEL);

Streaming DMA

  • 기존 메모리 버퍼를 DMA 전송 직전에 캐시 동기화(flush), 전송 후 다시 동기화
  • 성능 : 높음 (캐시 사용 가능)
  • 적합한 경우 : 일회성 전송 (패킷 단위, 네트워크 등)
1
dma_map_single(dev, buf, size, DMA_FROM_DEVICE);

scatter-gather

  • 일반 DMA는 물리 연속 메모리만 전송 가능
  • scatter-gather : 물리적으로 흩어진 메모리 조각들을 한 번의 DMA 전송으로 처리
1
[조각1][조각2][조각3] → DMA가 한 번에 전송
  • vmalloc()처럼 불연속한 메모리도 DMA 전송 가능

비교 요약

 Coherent DMAStreaming DMA
캐시 사용
성능낮음높음
적합한 버퍼항상 유지되는 버퍼일회성 데이터 전송
주요 APIdma_alloc_coherent()dma_map_single()
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.