시작하기 전에
내가 경험했던 디스플레이에 이미지를 그리는 프로젝트들은 항상 DMA가 강제되었다. DMA를 사용하지 않으면 이미지가 한박자 늦게 출력되었다. 심지어 사이즈가 큰 이미지의 경우 출력시 왼쪽에서 오른쪽으로 스프레드되는 과정까지 볼 수 있었다. DMA는 대부분의 AP(or MCU)에서 함수로 제공이 될 것이다. DMA를 깊게 이해하고 사용하기는 어려움이 있을지라도 해당 AP의 예제를 따라하는 수준이라도 DMA 유무는 충분히 체감할 수 있다.
DMA 요약
입출력장치와 메모리 사이 데이터 흐름에서 CPU를 배제하기 위해 사용하는 입출력 제어 방식
기본적인 입출력 제어 방식
예를 들어 하드디스크에서 메모리로 데이터를 이동시킨다. 이때 가장 기본적인 방식인 Programmed I/O(Polling) 방식으로 구현하면 하드디스크에서 데이터를 꺼낸 후 시스템 버스를 통해 CPU 레지스터에 옮겨지고 다시 시스템 버스를 통해 CPU 레지스터에서 메모리로 이동한다.
위와 같은 방식은 CPU를 거쳐가기 때문에 한곳을 더 거쳐가는 지연시간도 있겠지만 가장 큰 문제는 입출력 시간 동안 CPU가 idle 상태로 대기하는 것이다. I/O 디바이스에 비해 CPU는 비교할 수 없을 정도로 고속이기 때문에 그 시간을 낭비한다는 것은 상당히 비효율적이다.
DMA : Direct Memory Access
위 Programmed I/O 방식의 단점을 제거한것이 DMA 방식이다. DMA는 Direct Memory Access인데, 이름 그대로 입출력장치가 메모리에 직접 접근한다는 뜻이다.
위 예에서 DMA Controller를 이용하면 하드디스크와 메모리를 직접 연결하여 CPU는 제어신호만 주고받을 뿐 데이터 전송에서 제외시킬 수 있다. 따라서 입출력 시 CPU는 제어를 위해 데이터 전송 시작과 완료에만 할당되어 CPU 자원의 낭비가 제거된다.
DMA 동작 순서
DMA 동작 순서는 아래와 같다.
- 입출력장치가 CPU에게 입출력 요청
- CPU가 DMA 컨트롤러에 명령 송신
- DMA가 CPU에게 시스템 버스 사용 요청
- CPU가 버스 사용 허가(CPU가 버스 사용 포기)
- DMA 컨트롤러가 입출력장치에서 데이터 읽은 후 메모리로 전송
- 전송 완료 후 CPU에게 완료 신호 송신