입출력 작업을 수행하려면 CPU와 장치 컨트롤러가 정보를 주고 받아야 한다. 그렇다면 장치 컨트롤러는 CPU와 어떻게 정보를 주고받을까?

여기에는 크게 세 가지 방법이 있다. 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력이다. 시작에 앞서 언급하고 싶은 점은 이번 절에서는 새로운 용어가 많이 등장한다는 것이다. 많은 용어를 마치 시험 준비하듯 암기하지 말고, 편한 마음으로 이해하는 데 초점을 맞춰 공부하자.

1. 프로그램 입출력

프로그램 입출력(programmed I/O)은 기본적으로 프로그램 속 명령어로 입출력장치를 제어하는 방법이다. CPU가 프로그램 속 명령어를 실행하는 과정에서 입출력 명령어를 만나면 CPU는 입출력장치에 연결된 장치 컨트롤러와 상호작용하며 입출력 작업을 수행한다.

메모리에 저장된 정보를 하드 디스크에 백업하는 상황을 생각해보자. CPU는 대략 아래 과정으로 입출력 작업을 한다.

  1. ‘메모리에 저장된 정보를 하드 디스크에 백업한다’는 말은 ‘하드 디스크에 새로운 정보를 쓴다’는 말과 같다. 우선 CPU는 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령을 보낸다.

Untitled

  1. 하드 디스크 컨트롤러는 하드 디스크 상태를 확인한다. 하드 디스크가 준비된 상태라면 하드 디스크 컨트롤러는 상태 레지스터에 준비되었다고 표시한다.

Untitled

  1. ① CPU는 상태 레지스터를 주기적으로 읽어보며 하드 디스크의 준비 여부를 확인한다. ② 하드 디스크가 준비됐음을 CPU가 알게 되면 백업할 메모리의 정보를 데이터 레지스터에 쓴다. 아직 백업 작업(쓰기 작업)이 끝나지 않았다면 1번부터 반복하고, 쓰기가 끝났다면 작업을 종료한다.

Untitled

이렇듯 프로그램 입출력 방식에서의 입출력 작업은 CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다. 그런데 CPU는 입출력장치들의 주소를 어떻게 아는 것일까? 정확히 말해 CPU는 장치 컨트롤러의 레지스터들을 어떻게 아는 것일까?

CPU 내부에 있는 레지스터들과는 달리 CPU는 여러 장치 컨트롤러 속 레지스터들을 모두 알고 있기란 어렵다. 그렇다면 아래와 같은 명령어들은 어떻게 명령어로 표현되고, 메모리에 어떻게 저장되어 있을까?

여기에는 크게 두 가지 방식이 있다. 바로 메모리 맵 입출력과 고립형 입출력이다.