본문 바로가기
TIL & WIL

[CS] 크래프톤 정글 6주차 - DMA(Direct Memory Access)

by 적용1 2024. 5. 1.
728x90

DMA란?

- DMA(Direct Memory Access)는 특정 하드웨어 시스템이 CPU와 독립적으로 메인 시스템 메모리에 접근할 수 있게 해주는 컴퓨터 시스템의 기능이다.

 

자세하게 설명하면, 원래 컴퓨터 장치들 사이에서 전송되는 모든 데이터는 중앙처리장치(CPU)를 거쳐가는 방식이다.(PIO 방식, Programmed Input / Output의 줄임말)

 

하지만 DMA를 통해 CPU를 거치지 않고, 메모리 버퍼, 포인터, 카운터 등을 사용하여 CPU의 도움 없이 DMA 컨트롤러를 사용하여 데이터를 직접 메모리(RAM 등)로 전송할 수 있는 기능이다.

 

- DMA를 사용하게 되면 I/O 장치와 메모리 사이에 직접적인 데이터 이동이 가능해진다.

DMA의 특징

- 프로그램 수행 중 인터럽트의 발생 횟수 최소화 및 시스템 효율성 증대

 

CPU를 거치게 되면 입출력을 위해 I / O interrupt가 많이 발생하게 되고 그로 인해 시스템 효율성이 떨어질 수 있지만 DMA를 사용하면 그 것을 피할 수 있다.

 

- CPU는 DMA 컨트롤러와 상태 정보 및 제어 정보만 전송한다.

 

- CPU의 개입 없이 입출력장치와 주 기억장치와의 데이터 직접 전송이 가능하다.

 

- DMA는 기억장치 접근을 위해 CPU의 시스템 버스 사용권을 일시적으로 뺏는 사이클 스틸링(Cycle Stealing)을 수행한다. 시스템 버스에 대해 CPU보다 DMA의 우선순위가 높다.

 

- DMA 제어기와 CPU가 시스템 버스를 공유한다.

 

출처 : https://naeunbi698.tistory.com/195

 

실제 CPU가 control하는 것은 DMAC(DMA Controller) 뿐이다.

 

입출력(I / O)의 종류

 

종류 설명
Programmed I/O - CPU 상에서 실행되는 프로그램에 의해 입출력이 직접 제어된다.

- CPU는 입출력 장치에 명령을 보낸 후 동작이 완료될 때까지 대기한다.

- CPU는 주기적으로 주변 장치의 상태를 반복적으로 검사하고 폴링하는 방식으로 작동한다.

- CPU의 자원 낭비가 발생한다.
Interrupt Driven I/O - 입출력 인터페이스가 주변 장치의 상태를 검사하여 준비 상태가 되면 인터럽트 신호를 발생하여 입출력 처리를 요구하는 방식

- CPU는 그 전에 수행되던 프로그램의 상태를 스택에 저장한 후 Context Switching 과정을 통해 인터럽트 서비스 프로그램을 수행한다.

- 주변 장치에 명령을 보낸 후 주변 장치로부터 결과가 올 때까지 CPU는 다른 작업을 수행할 수 있으므로 효율성이 위 보다 좋다.

- Programmed I/O의 문제점을 개선한 버전
DMA - 인터럽트 방식이 Programmed I/O보다 효율적이지만 입출력을 위한 상태정보, 제어정보, 데이터의
전송을 위해서는 여전히 CPU의 능동적인 개입이 요구된다.

- CPU는 상태정보, 제어정보만을 교환하게 하고 데이터 전송은 주변 장치와 주기억장치 간에 직접 교환하게 하는 방식이 더 효율적이다.

- DMA를 사용하기 위해서 시스템 버스 상에 모듈이 하나 추가된다.

- DMA 모듈은 CPU를 통하지 않고 한번에 한 단어씩 직접 기억장치로부터 모든 데이터 블록을 전송한다.

- 전송이 완료되면 DMA모듈은 CPU에 인터럽트 신호를 보내고 CPU는 전송의 시작과 끝 부분에만 관여한다.
Channnel에 의한 I/O - DMA 개념을 확장하여 구현한 입출력만을 위한 전용 처리 장치

- CPU처럼 독자적으로 주기억장치에 저장된 명령어를 처리할 수 있는 능력이 있다.

- 입출력 채널은 CPU의 개입없이 입출력 처리를 수행한다.

- 두 가지 종류의 channel이 존재한다.

 

DMA 사용처

- 디스크 드라이브 컨트롤러

 

- 그래픽 카드

 

- 네트워크 카드

 

- 사운드 카드

 

- 멀티 코어 프로세서의 칩 내부 데이터 전송에도 쓰임

 

- 메모리 간 복사 또는 데이터 이동

 

- 기타 등등

동작 모드

버스트 모드(Busrt mode)

- 한 번의 DMA 동작 중 block 단위의 데이터 전송 시 적용

 

- 여러 개의 메모리 워드로 구성된 블록이 지속적으로 전송

 

- 고속의 입출력 장치를 대상으로 하며, DMA 인터페이스가 버스 사용권을 획득하면 데이터 전송이 완료될 때까지 버스 사이클 독점

사이클 스틸링(Cycle stealing mode)

- DMA 컨트롤러와 CPU가 동시에 버스를 사용하고자 할 때 속도가 빠른 CPU가 속도가 느린 DMA에게 버스 사용 우선 순위를 주어 빠른 입출력이 가능하게 하는 방법

 

- 한번의 DMA 동작 중 한 워드 정도의 데이터를 전송 시 적용

투명적 모드(Transparent mode)

- 데이터 블록을 전송하는데 대부분의 시간을 사용하지만, 전체 시스템 성능 측면에서 가장 효율적인 모드

 

- DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않는 명령들을 실행할 때에만 데이터를 전송한다.

 

- CPU가 프로그램 실행 도중 멈추지 않는다.

 

- DMA 전송이 시간 측면에서 자유롭다.

 

- 하드웨어가 CPU가 시스템 버스를 사용하는지 판별해야하는데 이 작업이 복잡할 수 있음

 

- 은닉 DMA 데이터 전송 모드라고 부르기도 함

DMA 구성도 및 동작 방식

 

출처 : https://blog.naver.com/roser111/221642875265

 

① I/O 인터페이스가 DMA 컨트롤러에게 DMA 서비스 요청을 전송

 

② CPU의 HOLD Pin에 Bus Request가 전송되어 버스에 대한 제어를 DMA가 획득(Active High)

 

③ CPU의 HLDA(Hold Acknowledge) Pin으로부터 DMAC에 Bus grant(버스에 대한 제어가 주어졌다는 것을 알려주는 flag?)가 리턴됨(Active High)

 

④ DMAC는 Address bus에 Address Register의 Contents를 적재한다.

 

⑤ DMAC는 I/O interface에게 데이터를 데이터 버스에 적재하도록 DMA Acknowledgement를 전송한다.

 

⑥ Data Byte가 Address Bus에 의해 식별된 위치로 전송된다.

 

⑦ I/O interface는 데이터를 지속적으로 전송 유지한다.(Latch)

 

⑧ Bus Request가 drop되어 HOLD가 Low 상태가 되어 DMAC는 Bus에 대한 사용권을 돌려준다.

 

⑨ Bus Grant가 drop되어 HLDA가 Low 상태가 된다.

 

⑩ 그 후, Address Register가 1 증가되고, Byte Count는 1 감소된다.

 

⑪ Byte Count가 0이 아니면 ①로, 0이면 정지

728x90