임베디드 스터디 - 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 DMA | Streaming DMA | |
|---|---|---|
| 캐시 사용 | ❌ | ✅ |
| 성능 | 낮음 | 높음 |
| 적합한 버퍼 | 항상 유지되는 버퍼 | 일회성 데이터 전송 |
| 주요 API | dma_alloc_coherent() | dma_map_single() |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.