메모리 직접 접근에 대해서
CPU가 메모리 맵 I/O를 보유하거나 보유하지 않더라도 데이터를 교환하기 위해서 장치 컨트롤러에 주소를 지정할 필요가 있다. CPU는 입출력 컨트롤러로부터 한 번에 한 바이트씩의 데이터를 요청할 수가 있으나 그렇게 하는 것은 CPU 시간을 낭비한다. 그래서 'DMA 즉, 메모리 직접 접근'이라고 불리는 메커니즘이 종종 사용된다.
운영체제는 하드웨어가, 대부분의 시스템들이 보유하고 있는, DMA 컨트롤러를 가지고 있는 경우에만 DMA를 사용할 수가 있다. 종종 DMA 컨트롤러는 디스크 컨트롤러나 기타 장치 컨트롤러에 통합되는 경우도 있는데 어쨌든 각 장치마다 DMA 컨트롤러를 필요로 한다. 흔히, 단일 DMA가 여러 장치들에 대한 전송을 병렬로 조정하기도 한다.
물리적으로 어디 위치한다고 해도 DMA 컨트롤러는 CPU와 독립적으로 시스템 버스에 접근할 수가 있다. 그것은 CPU에 의해서 쓰이고 읽힐 수 있는 여러 개의 레지스터들을 보유한다. 이들은 메모리 주소 레지스터, 바이트 카운트 레지스터 등을 포함한다. 컨트롤 레지스터는 사용할 입출력 포트, 전송 방향, 전송 단위 그리고 한 번에 전송할 바이트의 수 등을 상세히 명기한다.
DMA 가 동작하는 방식을 알아보기 위해서 먼저 DMA가 사용되지 않을 때 어떻게 디스크 읽기가 발생하는지 알아볼 필요가 있다. 디스크 컨트롤러는 드라이브로부터 순차적으로 블록을 전체 블록이 컨트롤러의 내부 버퍼에 들어올 때까지 비트 단위로 읽는다. 그리고 읽기 오류 발생 여부를 확인하기 위해서 체크섬을 계산한다. 그다음 컨트롤러는 인터럽트를 발생한다.
DMA를 사용할 때는 그 과정이 바뀐다. 먼저 CPU는 레지스터를 설정하면서 DMA 컨트롤러를 프로그램한다. 이 과정에서 무엇이 어디로 전송되어야 하는지 알게 된다. 디스크 컨트롤러에게 디스크로부터 자신의 내부 버퍼로 데이터를 읽어오고 체크섬을 확인하라는 명령을 내린다. 디스크 컨트롤러의 버퍼에 유효한 데이터가 들어왔을 때 비로소 DMA가 시작할 수 있다.
DMA 컨트롤러는 디스크 컨트롤러에 대한 읽기 요청을 버스 상에 발동해서 전송을 초기화한다. 읽기 요청은 여느 다른 읽기 요청처럼 보인다. 그리고 디스크 컨
디스크 컨트롤러는 그것이 CPU로부터 오는지 혹은 DMA 컨트롤러에서 오는지 알지 못한다. 통상 쓰기가 이루어질 메모리 주소는 버스의 주소 라인 상에 있어서 디스크 컨트롤러가 자신의 내부 버퍼로부터 다음 워드를 페치할 때 어디에 써야 하는지 알 수 있다.
메모리에 대한 쓰기는 또 다른 표준 버스 주기다. 쓰기가 완료되면, 디스크 컨트롤러는 답례 시놓를 역시 버스를 통해 DMA 컨트롤러에게 보낸다. DMA 컨트롤러는 사용할 메모리 주소를 증가하고 바이트 카운트를 감소한다. 카운터가 0이 되면 DMA 컨트롤러는 전송이 이제 완료되었다는 것을 표기해 주기 위해서 CPU에 인터럽트를 건다.
DMA 컨트롤러 중 가장 간단한 것은 한 번에 하나의 전송을 다루는 것이다. 좀 더 복잡한 경우를 보면 한 번에 여러 전송을 다루도록 프로그램할 수도 있다. 이러한 컨트롤러는 내부적으로 각 채널 별로 하나씩, 레지스터의 여러 집합을 가지고 있다. CPU는 각 레지스터의 집합에 전송을 위한 관련 있는 인자들을 쌓아 나가면서 시작한다. 각 전송은 반드시 다른 장치 컨트롤러를 사용해야만 한다.
많은 버스들이 두 가지 모드로 운영 가능하다. 워드 모드와 블록 모드, 몇 개의 DMA 컨트롤러 또한 두 가지 모드로 운영될 수가 있다. DMA 컨트롤러는 한 워드의 전송을 요청하고, 그것을 얻는 방식이 있다. 만약 CPU가 동시에 버스를 원하면 CPU가 기다려야만 한다. 이에 이 메커니즘을 사이클 도용이라고 부른다. 장치 컨트롤러는 몰래 CPU로부터 종종 버스 주기를 가로채서 CPU를 약간 지연시킨다.
블록 모드에서는 DMA 컨트롤러는 장치에서 버스를 획득하고, 일련의 전송을 보내고, 그리고 버스를 풀어라고 한다. 이런 형식은 버스트 모드라고 불린다. 그것은 주기 가로채기보다 훨씬 효율적이다. 이는 버스를 획득하는 것은 시간이 소요되는데 반해서 하나의 버스 획득 비용으로 여러 워드를 전송할 수 있기 때문이다. 버스트 모드의 단점은 만약 긴 버스트가 전송된다면 상당한 시간 동안 CPU와 다른 장치를 막고 있을 수가 있다.