DMA란?
직접 메모리 접근 (Direct Memory Access)는 입력/출력(I/O) 장치가 프로세서 (CPU)를 우회하여 메인 메모리와 직접 데이터를 주고받을 수 있도록 하여 메모리 작업 속도를 높이는 방법이다.
이 프로세스는 DMA 컨트롤러(DMAC)이란 칩에서 관리된다.
테코피디아가 설명하는 직접 메모리 접근
메모리의 정의된 부분은 마이크로프로세서의 개입 없이 주변 장치에서 메인보드로 직접 데이터를 전송하는 데 사용되므로 이 프로세스가 전체 컴퓨터 작동을 방해하지 않는다.
구형 컴퓨터에서는 4개의 DMA 채널에 0, 1, 2, 3번의 번호가 부여되었다. 16비트 ISA (산업 표준 아키텍처) 확장 버스가 도입되면서 채널 5, 6, 7이 추가되었다.
ISA는 IBM 호환 컴퓨터용 컴퓨터 버스 표준으로, 장치가 더 빠른 속도로 트랜잭션 (버스 마스터링)을 시작할 수 있게 해준다. ISA DMA 컨트롤러에는 8개의 DMA 채널이 있으며, 각 채널은 16비트 주소 및 카운트 레지스터와 연결된다.
이후 ISA는 훨씬 더 빠른 가속 그래픽 포트 (AGP) 및 주변 장치 상호연결 (PCI) 확장 카드로 대체되었다. 각 DMA는 초당 약 2MB의 데이터를 전송한다.
컴퓨터의 시스템 리소스 도구는 하드웨어와 소프트웨어 간의 통신에 사용된다. 네 가지 유형의 시스템 리소스는 다음과 같다:
- I/O 주소.
- 메모리 주소.
- 인터럽트 요청 (IRQ).
- 직접 메모리 접근 (DMA) 채널.
DMA 채널은 주변 장치와 시스템 메모리 간에 데이터를 통신하는 데 사용된다. 네 가지 시스템 리소스는 모두 버스의 특정 라인에 의존한다. 버스의 일부 라인은 IRQ에, 일부는 주소(I/O 주소 및 메모리 주소)에, 일부는 DMA 채널에 사용된다.
DMA 채널을 사용하면 장치가 CPU에 작업 과부하를 주지 않고 데이터를 전송할 수 있다. DMA 채널이 없으면 CPU는 I/O 장치에서 주변 장치 버스를 사용하여 모든 데이터를 복사한다. 주변 장치 버스를 사용하면 읽기/쓰기 프로세스 중에 CPU를 사용하므로 작업이 완료될 때까지 다른 작업을 수행할 수 없다.
DMA를 사용하면 데이터 전송이 수행되는 동안 CPU가 동시에 다른 작업을 처리할 수 있다. 데이터 전송은 먼저 CPU에 의해 시작된다. 데이터 블록은 DMAC에 의해 세 가지 방법으로 메모리로 전송되거나 메모리에서 전송될 수 있다.
버스트 모드에서는 데이터 전송이 완료된 후에만 시스템 버스가 해제된다. 사이클 도용 모드에서는 DMA 채널과 I/O 장치 간에 데이터를 전송하는 동안 CPU가 다른 작업을 수행할 수 있도록 몇 클록 주기 동안 시스템 버스를 포기한다. 데이터 전송이 완료되면 CPU는 DMA 컨트롤러로부터 인터럽트 요청을 받는다. 투명적 모드에서는 프로세서가 필요로 하지 않는 경우에만 DMAC가 시스템 버스를 담당할 수 있다.
그러나 DMA 컨트롤러를 사용하면 캐시 일관성 문제가 발생할 수 있다. CPU가 외부 메모리를 사용하는 경우 DMA 컨트롤러가 액세스하는 RAM에 저장된 데이터가 올바른 캐시 데이터로 업데이트되지 않을 수 있다.
해결 방법으로는 나가는 DMA 전송을 시작하기 전에 캐시 라인을 플러시하거나 외부 쓰기가 캐시 컨트롤러에 신호를 보낼 때 들어오는 DMA 전송에 대해 캐시 무효화를 수행하는 방법이 있다.