{{위키데이터 속성 추적}}
{{출처 필요|날짜=2012-11-9}}
[[파일:AMD DirectGMA.svg|섬네일|AMD의 DirectGMA는 DMA의 일종이다. [[PCI 익스프레스|PCIe 버스]]와 [[AMD 파이어프로]] 브랜드 제품 상에서 낮은 레이턴시로 장치 간 P2P 데이터 전송을 가능케 한다. DirectGMA를 지원하는 [[직렬 디지털 인터페이스]](SDI) 장치들은 GPU의 그래픽스 메모리에 직접 기록이 가능하며 거꾸로 GPU가 직접 상대 장치의 메모리에 직접 접근할 수도 있다.]]
'''직접 메모리 접근'''(直接 - 接近, Direct Memory Access, '''DMA''')은 특정 하드웨어 하위 시스템이 [[CPU]]와 독립적으로 메인 시스템 [[컴퓨터 메모리|메모리]]에 접근할 수 있게 해주는 컴퓨터 시스템의 기능이다.

한편, [[프로그램 입출력|PIO]]는 DMA의 반대개념으로써, 장치들 사이에 전송되는 모든 데이터가 중앙처리장치를 거쳐가는 방식이다. DMA는 PIO의 단점을 보완하기 위해 고안된 기능이다.

주변장치의 데이터는 장치 컨트롤러에 의해 로컬 버퍼로 이동한다. 그러나 전송할 데이터가 많은 경우, 많은 양의 데이터의 이동으로 인한 부담이 커지는데 이러한 문제를 해결하기 위해 DMA를 이용한다. 장치 컨트롤러가 데이터의 한 블록을 이동시키는데 이 과정에서 DMA로 인해 CPU의 개입이 필요없게 된다. CPU에서는 데이터 이동이 완료되었다는 단 한 번의 인터럽트만 발생한다. 데이터가 전송되는 동안 CPU는 다른 작업을 수행할 수 있게 되어 효율성이 높아진다.

디스크 드라이브 컨트롤러, 그래픽 카드, 네트워크 카드, 사운드 카드를 포함한 많은 하드웨어 시스템이 DMA를 사용한다. DMA는 [[멀티 코어 프로세서]]의 칩 내부 데이터 전송에도 쓰인다. DMA는 메모리 간 복사 또는 데이터 이동에도 쓰일 수 있다.

DMA는 과거 IBM의 특허 기술이었다(현재는 특허권 소멸).

== 이론 ==
=== Third-party ===
표준 DMA(Third-party DMA)는 DMA 컨트롤러를 사용한다. DMA 컨트롤러는 메모리 주소를 생성하고 메모리 읽기 또는 쓰기 사이클을 초기화할 수 있다. 여기에는 일부 [[하드웨어 레지스터]]들이 포함된다. 이것들은 메모리 주소 레지스터, 바이트 카운트 레지스터와 하나 이상의 레지스터들을 포함한다. DMA 컨트롤러의 특징에 따라 컨트롤 레지스터들은 원본, 대상, 전송 방향, 전송 크기 단위, 버스트 당 전송 파이트 수의 조합을 지정할 수 있다.<ref name=Osborne80>{{서적 인용|first=Adam |last=Osborne |title=An Introduction to Microcomputers: Volume 1: Basic Concepts |edition=2nd |publisher=Osborne McGraw Hill |year=1980 |isbn=0931988349 |pages=[https://archive.org/details/introductiontomi00adam/page/5 5–64 through 5–93] |url=https://archive.org/details/introductiontomi00adam/page/5 }}</ref>

=== 버스 마스터링 ===
버스 마스터링 시스템(First-party DMA System)에서 CPU와 주변 장치는 각각 메모리 버스 통제권을 얻을 수 있다. 버스 마스터가 될 수 있는 주변장치는 필요에 따라 메모리 주소와 제어 신호를 제공 받아 CPU를 거치지 않고 시스템 메모리에 직접 쓸 수 있다.

== 동작 모드 ==
=== 버스트 모드 (Burst mode) ===
버스트 모드에서 전체 데이터 블록은 하나의 연속된 시퀀스로 전송된다. DMA 컨트롤러가 CPU로부터 시스템 버스 접근을 허락 받으면 DMA 컨트롤러는 CPU에게 시스템 버스 접근 제어권을 돌려주기 전까지 데이터 블록의 모든 데이터를 전송한다. 이 모드를 "블록 전송 모드"라고 부르기도 한다.

=== 사이클 도용 모드 (Cycle stealing mode) ===
사이클 도용 모드는 전송 시간 동안 CPU가 비활성화되어선 안되는 시스템에서 사용된다. 사이클 도용 모드에서는 DMA 컨트롤러는 BR(Bus Request) 신호와 BG(Bus Grant) 신호를 이용하여 버스트 모드와 같은 방식으로 시스템 버스 접근을 얻을수있다. 이 두 신호는 CPU와 DMA 컨트롤러 사이의 인터페이스를 제어한다. 사이클 도용 모드에선 1 바이트의 데이터를 전송한 뒤 BG 신호를 통해 CPU로부터 얻은 시스템 버스 제어권이 해제된다. 전체 블록이 전송될 때까지 BR를 통하여 시스템 버스 제어권을 요청하며 요청당 1 바이트의 데이터를 전송한다. 지속적으로 시스템 제어권을 얻고 해제하는 것으로 DMA 컨트롤러는 실질적으로 명령과 데이터 전송을 교차 배치한다. CPU가 명령을 처리하면 DMA 컨트롤러는 하나의 데이터 값을 전송한다. 사이클 도용 모드의 데이터 블록 전송 속도는 버스트 모드만큼 빠르지 않지만 CPU가 버스트 모드만큼 길게 대기하지 않는다. 사이클 도용 모드는 데이터를 실시간으로 모니터링 해야하는 컨트롤러에 유용하다.

=== 투명적 모드 (Transparent mode) ===
투명적 모드는 데이터 블록을 전송하는데 대부분의 시간을 사용하지만 이것은 전체 시스템 성능 측면에서 가장 효율적인 모드이다. 투명적 모드에서 DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않는 명령들 실행할 때만 데이터를 전송한다. 투명적 모드의 장점은 CPU가 프로그램 실행 도중 멈추지 않는 다는 것과 DMA 전송이 시간 측면에서 자유롭다는 것이며 단점은 하드웨어가 CPU가 시스템 버스를 사용하는지 판별해야하며 이것이 복잡할 수 있다는 것이다. 이 모드를 "은닉 DMA 데이터 전송 모드"라고 부르기도 한다.

== 캐시 간섭 ==
DMA는 [[캐시 일관성]] 문제를 일으킬 수 있다.
== 예 ==
ISA 버스 표준에서는 DMA를 위해 메모리를 최대 16MB까지 지정할 수 있다. EISA와 MCA 표준은 (32비트 주소지정이 가능하다는 전제 하에) 전체범위의 메모리 주소에 액세스를 허용한다. PCI는 CPU가 PCI 콘트롤러에 입출력제어를 위임하는 버스 마스터링을 사용하여 DMA를 지원한다. 방식에는 폴링(polling), 인터럽트(INT)방식이 있다.
* '''[[ISA 버스|ISA]]'''
* '''[[PCI 버스|PCI]]'''
* '''AHB'''

== 같이 보기 ==
* [[병렬 ATA]] (ATA)
* [[프로그램 입출력]] (PIO)
* [[원격 기억 직접 접근]] (RDMA)
* [[입출력 채널]]
* [[메모리 맵 입출력]]
* [[하드웨어 가속]]
* [[메모리 관리]]
* [[폴링 (컴퓨터 과학)]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://elinux.org/images/4/49/20140429-dma.pdf Mastering the DMA and IOMMU APIs], Embedded Linux Conference 2014, San Jose, by Laurent Pinchart

{{컴퓨터 버스}}

{{전거 통제}}

[[분류:컴퓨터 메모리]]
[[분류:메인보드]]
[[분류:하드웨어 가속]]