-
DMA는 Direct Memory Access이다.
메모리에 바로 접근하는 무언가... 왜 메모리에 바로 접근해야 할까? 애초에 메모리는 왜 접근해야 할까?
이러한 궁금증을 해결하며 DMA를 배워보자.
먼저 메모리는 뭘까?
메모리는 간단하게 프로그래밍 코드가 저장되어 있다고 생각할 수 있다.
우리가 실행하는 앱이나. exe파일은 메모리에 존재하며, 프로그램 상에서 코드 역시 메모리에 위치한다. 또한 어떠한 데이터를 저장하고 있을 수도 있다.
DMA의 타깃은 다음과 같다
임베디드 시스템에서 메모리는 주로 코드가 있는 Flash와 데이터가 오가는 SRAM이 있다. DMA는 이 둘을 자유로이 사용한다.
- Peripheral-to-memory: 센서에서 읽은 값을 SRAM에 저장
- Memory-to-peripheral: SRAM내부에서 대용량 데이터를 UART등의 peripheral로 내보냄
그렇다면 DMA가 뭔지 대충 감이 잡힐 거 같다. DMA는 CPU의 개입 없이 I/O가 직접 메모리에 접근하여 읽고, 쓰는 것이다.
이런 DMA를 왜 써야 하는지 특징과 함께 알아보자.
1. DMA가 CPU의 일을 어느 정도 수행하기에, CPU 효율을 그만큼 늘릴 수 있다.
2. 고속 I/O장치의 경우 빈번한 인터럽트가 발생하는데, DMA로 인터럽트 발생 횟수를 최소화한다.
3. DMA가 없다면 Data I/O 처리가 끝날 때까지 CPU는 대기한다.
- 이는 Polling 방식으로 Interrupt 방식을 사용하면, 그렇지 않은 경우도 있다.
- Polling: 특정한 주기로 각 기기에 데이터 이벤트가 있는지 CPU가 체크하는 방법
- Interrupt: 이벤트 발생 시 즉시 ISR로 이벤트를 처리, 하지만 ISR 동안 다른 코드는 멈추게 된다. 하지만 DMA는 ISR의 멈춤, context switching 등의 오버헤드도 없다.
DMA는 크게 2가지 동작 모드를 가진다.
1. 사이클 스틸링: CPU가 DMA에 우선순위를 양보함
- 1 cycle을 정지한다. 빠른 입출력이 가능하며, 한 번에 한 워드를 전송할 수 있다. ( = 32 bits or 64 bits 또는 사용자 지정)
- 인터럽트는 ISR 내내 정지하지만, 사이클 스틸링은 1 cycle만 정지한다.
- 사이클 스틸링은 프로그램 상태를 보존할 필요가 없지만, 인터럽트는 보존이 필요하다.
CPU가 사용 중인 Bus를 빌리는 방법은 비효율적이다. 그렇기 때문에 우리는 다중 계층 버스를 사용한다. Bus Matrix 덕분에 CPU와 DMA가 다른 버스선을 사용하며 스틸링을 할 필요가 없어졌다.
2. 버스트 모드: DMA가 버스 사용권을 획득 시 데이터 전송이 완료될 때까지 버스 cycle을 독점한다.
사이클은 데이터를 한 번 주고받는 데 필요한 묶음 시간을 의미한다.
DMA를 사용하므로써 생길 수 있는 문제 역시 존재한다.
1. 캐시 일관성
DMA는 RAM에 접근하여 read/write를 수행한다. 하지만 CPU는 Cache를 보고 연산을 하는 경우가 대부분이다. 그렇다면 RAM과 Cache의 값이 충분히 달라질 수 있는 것이다. DMA는 RAM에 새 값을 쓰고, 이를 모르는 CPU는 옛 값이 담긴 Cache를 계속 쓰는 것이다.
그렇기 때문에 DMA는 전송이 끝났을 CPU에게 Cache를 새로고침 할 것을 신호로 보낸다.
이를 Cache Invalidate라고 한다.
2. Full buffer
많은 데이터가 유실되는 문제를 해결하는 방법은 2가지가 있다.
- Circular Mode: 끊임없이 들어오는 데이터를 처리하기 위해 버퍼를 A와 B로 나눈다.
DMA가 A를 채울 때 B는 처리를 하고, 반대로 B를 채울 때 A를 처리하는 방식으로 데이터 유실 없이 DMA를 사용한다- Scatter-Gather Mode: 작업 리스트를 부여하여 처리 순서를 DMA가 모두 알고, 중간에 CPU 개입 없이 하드웨어 적으로 빠르게 처리한다.
'임베디드' 카테고리의 다른 글
Havard & Neumann Architectures (0) 2026.04.21 ADC/DAC (0) 2026.04.18 I2C (0) 2026.04.17 Register Memory (0) 2026.04.13