본문 바로가기
Computer Architecture/Basic

입출력작업 - programmed i/o, interrupt driven i/o, DMA

by FastBench 2023. 4. 19.

초안 :  2023.04.18

 

입출력장치 (I/O Device)

입출력장치 (키보드, 마우스, 저장자치) 들은 각자 저마다의 컨트롤러를 통해 CPU 와 연결된다. (시스템 버스와 연결된다)물론 각 장치의 컨트롤러들은 장치에 특화된 기능을 수행하기도 하지만, 본 게시글에서는 CPU 와 입출력장치 간의 중개역할에 대해서만 언급한다.

source : https://www.storagereview.com/ssd-controller

위와 같은 관점에서 컨트롤러는 아래와 같이 3종류의 레지스터로 간략히 표현할 수 있다.

  1. 데이터 레지스터 : CPU 와 입출력장치 간에 주고받는 데이터가 담기는 레지스터. 데이터 버퍼링을 하며, 상대적으로 느린 I/O 장치와 CPU 의 전송률 차이를 완화한다.
  2. 상태 레지스터 : 입출력 장치가 입출력 작업을 할 준비가 되었는지, 완료되었는지, 오류가 없는지 등의 상태 정보를 저장한다.
  3. 제어 레지스터 : 입출력 장치가 수행할 작업에 대한 제어 정보와 명령을 저장한다.
Status Register 와 Control Register 를 합쳐서 CSR 이라고 부르기도 한다.

 

Device Driver

device driver 란 device controller 의 동작을 감지하고 제어함으로써 device controller 가 컴퓨터 내부의 기기 (CPU 또는 주변기기)와 정보를 주고 받을 수 있게 하는 '프로그램'이다. 프로그램이므로 당연히 메모리에 적재된다.

 

 

Address of registers of device controller

드라이버를 통해 CPU는 device controller 의 레지스터에 값을 쓰며 입출력 작업을 할 수 있을 것이다.

그런데 CPU내부에 위치 하지도 않은 device controller  레지스터의 주소를 어떻게 알 수 있을까?

 

입출력 장치도 메모리와 마찬가지로 각자의 주소가 있다. 한개의 컴퓨터에 여러개의 입출력장치가 연결되기 때문에 각 장치를 구분하기 위해서이다. 이때 주소를 정하는 방법은 두가지가 있다.

 

  • MMIO (Memory Mapped I/O)
    시스템 메모리는 전체 공간을 명령어나 데이터 저장용으로 쓰지 않는다. 일부는 장치 컨트롤러의 레지스터를 표현하기 위해 사용한다. 가령, A 라는 장치의 Data Register 는 메모리의 500번지, Status Register 는 501 번지 와 같이 미리 약속해놓고 해당 메모리 주소를 마치 장치 레지스터 처럼 사용 하는 것이다.

    CPU는 501번지를 읽는 명령어로써, A 라는 장치의 status 를 알 수 있다. 마찬가지로 500번지에 데이터를 쓰라는 명령어로 A 장치에 Data를 보낼 수 있다.

    이 방식의 장점은 메모리의 주소나 장치 컨트롤러의 레지스터나 다루는 방법이 같으므로 명령어가 다를 필요가 없다는 것이다.

  • Isolated I/O (고립형 입출력)
    입출력 장치를 위한 독립적인 버스를 사용하는 방식이다. 따라서 CPU에 추가적인 핀이 필요할 뿐만아니라 외부 배선도 필요하다. 당연히 MMIO와 달리, 메모리의 주소를 다루는 명령어와 입출력 장치를 다루는 명령어는 서로 다르다.  즉, 입출력을 위한 in, out 과 같은 명령을 따로 가지고 있다.
    요즘에는 메모리의 용량이 예전과 다르게 매우 여유로우므로 특별한 이유가 없는 이상, 굳이 Isolated I/O 를 사용할 이유가 없으므로 대부분의 프로세서가 MMIO 방식을 사용한다.

 

 

How to work?

이제 CPU는 각 장치 컨트롤러의 레지스터 주소를 알고 있으므로, 드라이버를 통해 각 장치 컨트롤러의 레지스터에 값을 읽거나 쓰며 입출력 작업을 할 수 있다.

 

대표적으로 입출력 작업을 하기 위한 세가지 방식이 있다.

  1. Programmed I/O (프로그램 입출력)
  2. Interrupt-Driven I/O (인터럽트 기반 입출력)
  3. DMA I/O (DMA 입출력)

- Programmed I/O

프로세서가 입출력 장치를 기다리며 데이터를 입력 또는 출력 하는 방식을 programmed i/o 라고 한다.

가령 키보드의 키를 누르기 전까지 Status Register 의 ready bit 는 0으로 되어 있다가, 키를 누르면 ready bit가 1이되고 Data Register 에 키 값이 입력되며, 그제서야 프로세서가 Data Register 의 값을 읽는 것을 예로 들 수 있다.

즉 매우 빠른 프로세서가 매우 느린 입출력장치의 Status Register 를 계속 해서 확인하면서 입출력작업을 하는 방식이다. 따라서 programmed i/o 방식을 pooling 방식이라고도 한다. 

이렇게 pooling (조사)를 하는 동안 프로세서는 다른 일을 하지 못하므로 CPU 의 활용률은 떨어진다. (busy wait 라고 함.) 그러므로 특별한 목적이 있지 않는 이상 programmed i/o 방식은 거의 사용되지 않는다.

 

 

-Interrupt Driven I/O

이전에 인터럽트를 간단히 다룬적이 있는데, 아래의 글을 참고하기 바란다.

2023.04.05 - [Computer Architecture] - 인터럽트(Interrupt)

입출력장치가 인터럽트를 발생시키면, cpu는 하던일을 잠시 백업하고 ISR 을 실행한다.

programmed i/o 방식의 비효율을 개선하기 위해 고안된 방식으로 하드웨어 인터럽트를 통해 CPU와  입출력장치가 정보를 주고 받는 방식이다.

 

프로세서가 pooling 을 하느라 busy wait 하지 않으므로 그 시간에 다른 작업을 할 수 있어 cpu 활용률은 올라간다.

 

다수의 입출력장치가 동시에 인터럽트를 요청하는 경우에는

인터럽트가 발생한 순서대로 처리하거나,

인터럽트 간에 우선순위를 고려하여 높은 순으로 인터럽트를 처리해야 할 것이다.

 

이렇게 우선 순위를 고려하여 다중 인터럽트를 처리하는 여러가지 방법이 있지만, 대표적인 방법으로 Programmable Interrupt Controller (PIC)라는 하드웨어를 사용하는 것을 들 수 있다.

PIC 는 여러 포트 ( 여러 장치 컨트롤러 ) 에 연결되어, 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청의 우선순위를 판별한 후 CPU에 알려준다.

현재는 PIC의 개선된 버전인 APIC 를 사용하거나 사우스 브릿지 칩셋 내에 해당 기능을 내장하여 사용한다.

과거에 사용된 인텔의 8259 PIC

 

-Direct Memory Access (DMA)

이 글의 목적인 DMA 이다.

programmed i/o 와 interrupt driven i/o 의 공통점은 입출력장치와 메모리 간의 데이터 이동은 CPU 가 주도하고, 데이터 또한 반드시 CPU를 거친다는 것이다. (프로세서 내의 레지스터에 일단 저장되기 때문에)

 

더 좋은 방법은 데이터 전송에서 CPU 를 아예 배제하는 것이다. 즉, Direct Memory Access, 이름 그대로 입출력 장치가 직접 메모리에 직접 접근하여 데이터 전송을 하는 것이다.

 

프로세서는 배제되고, 버스의 주도권을 잡고 DMA 를 가능하게 하는 주체를 DMAC(DMA Controller)라고 한다.

DMAC는 간단하게 address register 와 counter register 등으로 이루어져 있다. (source 주체를 알려주는 source register, 목적지를 알려주는 destination register 등등 )

아래의 그림을 통해 DMA 동작 과정을 살펴보자.

핵심은 프로세서가 DMAC 에게 버스의 주도권을 넘기고 버스로 부터 절연 된다는 것이다.

일반적으로 DMAC는 프로세서 내에 내장 되어 있다.

DMAC 가 버스의 주도권을 가지며, 데이터 전송이 일어날 때마다 주소 레지스터의 값은 증가하고 카운터 레지스터의 값은 감소하며, 카운터 레지스터의 값이 0이되면 DMAC 가 프로세서로 인터럽트를 보내 DMA가 끝났음을 알린다.

 

 

Reference

  • 혼자 공부하는 컴퓨터 구조 + 운영체제, 한빛미디어, 강민철
  • 컴퓨터 구조의 핵심, 퍼플, 양희재
  • 임베디드 레시피, snowbook, 히언

댓글