Post

[혼자 공부하는 컴퓨터구조+운영체제]08장 입출력장치

08-1 장치 컨트롤러와 장치 드라이버

장치 컨트롤러

  • 장치 컨트롤러(device controller): 입출력장치가 컴퓨터 내부와 정보를 주고받기 위해 사용
    • 장치 컨트롤러는 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 등으로 불린다.
  • 장치 컨트롤러를 사용하는 이유
    1. 입출력장치는 너무 다양하여 정보를 주고받는 방식을 규격화하기 어렵다.
    2. 입출력장치의 데이터 전송률이 낮다.
      1. 전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는가에 대한 지표
      2. CPU와 메모리는 전송률이 높으며, 전송률 차이는 통신을 어렵게 한다.
  • 장치 컨트롤러의 역할
    1. CPU와 입출력장치 간의 통신 중개
    2. 입출력장치의 오류 검출
    3. 데이터 버퍼링 ⇒ 전송률 차이 완화
      1. 버퍼링: 전송률이 높은 장치와 낮은 장치 사이에서 주고받는 데이터를 버퍼(임시 저장 공간)에 저장해 전송률을 맞추는 방법
  • 장치 컨트롤러의 구조
    • 데이터 레지스터
      • CPU와 입출력장치 사이에 주고받을 데이터 저장
      • 데이터 버퍼링을 위한 버퍼 역할 담당
      • 주고받는 데이터가 많은 입출력장치는 레지스터 대신 RAM을 사용하기도 함
    • 상태 레지스터
      • 입출력 작업을 할 준비가 되었는지, 작업이 완료되었는지, 오류는 없는지 등의 상태 정보 저장
    • 제어 레지스터
      • 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장

장치 드라이버

새로운 장치를 컴퓨터에 연결하면 장치 드라이버(device driver)를 설치해야 한다.

  • 장치 드라이버: 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있도록 하는 프로그램
    • 장치 컨트롤러의 동작을 감지하고 제어
    • 프로그램이므로 실행 과정에서 메모리에 저장

08-2 다양한 입출력 방법

프로그램 입출력

  • 프로그램 속 명령어로 입출력장치를 제어하는 방법
  • 입출력 작업 과정 예시
    1. CPU는 장치 컨트롤러의 제어 레지스터에 명령 전송
    2. 장치 컨트롤러는 입출력장치 상태를 확인, 준비된 상태라면 상태 레지스터에 준비 완료 표시
    3. CPU는 주기적으로 상태 레지스터를 확인(폴링)하며 입출력장치의 준비 여부 확인, 준비가 확인되었다면 데이터를 데이터 레지스터에 쓰기
  • CPU가 장치 컨트롤러의 레지스터를 아는 방법
    • 매모리 맵 입출력(memory-mapped I/O)
    • 고립형 입출력(isolated I/O)

메모리 맵 입출력

  • 메모리에 접근하기 위한 주소 공간, 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법
  • 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 다를 필요 없음
    • 메모리 주소를 대하듯 입출력장치의 레지스터에 접근 가능
  • 메모리 주소 공간이 축소됨

고립형 입출력

  • 메모리를 위한 주소 공간, 입출력장치에 접근하기 위한 주소 공간을 분리하는 방법
    • 입출력장치를 위한 별도의 제어 버스 사용
  • 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어는 다름
  • 메모리 주소 공간이 축소되지 않음

인터럽트 기반 입출력

  • 장치 컨트롤러가 발생시키는 하드웨어 인터럽트를 기반으로 하는 입출력
  • 인터럽트를 활용하면 CPU가 다른 일을 하고 있을 수 있으므로 폴링 방식보다 CPU 부담이 작음
  • 여러 인터럽트가 동시에 발생한 경우 처리 방법
    1. 순차적으로 인터럽트 처리
    2. 인터럽트 간 우선순위를 고려하여 높은 인터럽트 순으로 처리
      1. NMI(Non-Maskable Interrupt)가 발생한 경우

우선순위를 반영한 다중 인터럽트 처리 방법

일반적으로 프로그래머블 인터럽트 컨트롤러(PIC)라는 하드웨어를 사용한다.

  • PIC
    • 여러 장치 컨트롤러에 연결됨
    • 장치 컨트롤러에서 보낸 인터럽트의 우선순위를 판별
    • 처리해야 할 인터럽트를 CPU에 알리는 역할
  • PIC의 다중 인터럽트 처리 과정
    1. 장치 컨트롤러에서 인터럽트 요청 신호를 받음
    2. 인터럽트의 우선순위 판단 후 CPU에서 처리할 인터럽트 요청 신호를 전송
    3. CPU가 PIC에 인터럽트 확인 신호 전송
    4. PIC가 데이터 버스를 통해 CPU에 인터럽트 벡터 전송
    5. CPU는 인터럽트 벡터를 통해 해당 장치의 인터럽트 서비스 루틴 실행
  • PIC를 계층적으로 구성하면 더 많은 하드웨어 인터럽트 관리 가능
  • PIC는 NMI를 제외한, 인터럽트 비트가 막을 수 있는 하드웨어 인터럽트의 우선순위만 조정

DMA 입출력

  • Direct Memory Access, 직접 메모리에 접근할 수 있는 입출력 기능
  • 입출력장치와 메모리가 CPU를 거치지 않고 데이터를 주고받을 수 있는 입출력 방식
    • 프로그램 기반 입출력과 인터럽트 기반 입출력은 CPU를 거침
    • CPU는 입출력 시작과 끝에만 관여하기 때문에 작업 부담이 적음
  • 시스템 버스에 연결된 DMA 컨트롤러 하드웨어 필요
  • 사이클 스틸링
    • DMA 컨트롤러가 CPU가 시스템 버스를 사용하지 않을 때 시스템 버스를 이용하거나, CPU가 일시적으로 시스템 버스를 사용하지 않도록 한 뒤 시스템 버스를 직접적으로 이용하는 것
    • 시스템 버스는 공용 자원이기 때문에 동시 사용 불가능

DMA 입출력 과정

  1. CPU는 DMA 컨트롤러에 입출력 작업을 명령
    1. 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등
  2. DMA 컨트롤러는 장치 컨트롤러와 상호작용하며 입출력 작업 수행
    1. 필요한 경우 DMA 컨트롤러는 메모리에 직접 접근하여 읽거나 씀
  3. 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업이 끝남을 알림

입출력 버스

  • 입출력 버스: DMA 컨트롤러와 장치 컨트롤러를 연결한 별도의 버스
    • DMA가 시스템 버스를 자주 사용하면 CPU가 시스템 버스를 이용 못하기 때문
  • 일반적으로 장치 컨트롤러는 입출력 버스와 연결
  • PCI(Peripheral Component Interconnect) 버스, PCIe(PCI Express) 버스 등 존재
  • PCIe 슬롯: 입출력장치와 PCIe 버스를 연결하는 통로

입출력 프로세서

  • IOP 또는 IOC(Input/Output Channel, 입출력 채널)
  • 메모리에 직접 접근, 입출력 명령어를 직접 인출/해석/실행할 수 있는 입출력 전용 CPU
  • 입출력 채널이 있으면 CPU가 입출력 명령어를 실행하지 않고 입출력 채널에 맡김
This post is licensed under CC BY 4.0 by the author.