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

키보드, 마우스 등 입출력장치에 보조기억장치도 포함

장치 컨트롤러

입출력장치는 CPU, 메모리보다 다루기 더 까다롭다.

많은 종류

키보드, 모니터, USB 메모리, SSD 등 다양하며 장치마다 속도, 데이터 전송 형식도 다양하여 규격화하기 어렵다.

낮은 데이터 전송률

전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표

전송률이 낮은 데이터는 같은 시간 동안 상대적으로 적은 데이터를 주고 받을 수 있음

장치 컨트롤러(device controller)

  • 입출력 제어기(I/O controller), 입출력 모듈(I/O module)
  • 입출력장치가 연결되는 하드웨어
  • 모든 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받음
  • CPU와 입출력장치 간의 통신 중개, 오류 검출, 데이터 버퍼링
  • 버퍼링(buffering): 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법
    • 버퍼(buffer): 임시 저장 공간
  • 내부 구조
    • 데이터 레지스터(data register)
      • CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터. 버퍼링을 위한 버퍼 역할
    • 상태 레지스터(status register)
      • 입출력장치가 입출력 작업 상태, 오류 여부 등의 상태 정보 저장
    • 제어 레지스터(control register)
      • 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장

장치 드라이버

장치 드라이버(device driver)

  • 장치 컨트롤러의 동작을 감지하고 제어함으로써 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있게 하는 프로그램
  • 입출력장치를 위한 소프트웨어적인 통로
    • 하드웨어적인 통로는 장치 컨트롤러
  • 운영체제가 장치 드라이버를 인식하고 실행하는 주체

08-2 다양한 입출력 방법

프로그램 입출력

프로그램 입출력(programmed I/O)

  • 프로그램 속 명령어로 입출력장치를 제어하는 방법
  • 과정
    1. CPU가 하드 디스크 컨트롤러의 제어 레지스터에 ‘쓰기’ 명령을 보냄
    2. 하드 디스크 컨트롤러가 하드 디스크의 상태를 확인하고 본인의 상태 레지스터에 ‘준비 완료’를 표시
    3. CPU는 상태 레지스터를 **폴링(polling)**하며 준비 여부를 확인하고 준비되면 저장할 정보를 하드 디스크 컨트롤러의 데이터 레지스터에 입력

메모리 맵 입출력

메모리 맵 입출력(memory-mapped I/O)

  • 메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주
  • 주소 공간 중 일부는 메모리 주소를 표현하는데 사용, 일부는 장치 컨트롤러의 레지스터를 표현하기 위해 사용
  • 메모리에 접근하는 명령어와 입출력장치에 접근하는 명령어가 같음
    • ‘읽어라’는 메모리 주소면 정보를 읽고, 장치 컨트롤러의 상태 레지스터면 상태를 확인함

고립형 입출력

고립형 입출력(isolated I/O)

  • 메모리를 위한 주소 공간과 입출력장치를 위한 주소 공간을 분리
  • 제어 버스 내에 ‘메모리 읽기/쓰기 선’과 ‘입출력장치 읽기/쓰기 선’이 분리
  • 메모리 관련 명령어와 입출력장치 명령어가 다름

인터럽트 기반 입출력

인터럽트 기반 입출력(interrupt-Driven I/O)

  • 장치 컨트롤러가 입출력 작업을 끝낸 뒤 CPU에게 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업하고 인터럽트 서비스 루틴을 실행
  • CPU는 장치 컨트롤러에 입출력 작업을 명령하고, 장치 컨트롤러가 입출력장치를 제어하며 입출력을 수행하는 동안 CPU는 다른일을 처리
  • 폴링(polling): 입출력장치의 상태는 어떤지, 처리할 데이터가 있는지를 주기적으로 확인하는 방식
    • 인터럽트보다 CPU의 부담이 더 큼
  • NMI(Non-Maskable Interrupt): 플래그 레지스터 속 인터럽트 비트가 활성화되어 있거나, 인터럽트 비트를 비활성화해도 무시할 수 없는 인터럽트. 높은 우선순위를 의미
  • 프로그래머블 인터럽트 컨트롤러(Programmable Interrupt Controller)
    • 우선순위를 반영하여 다중 인터럽트를 처리하는 하드웨어
    • 여러 장치 컨트롤러에 연결되어 장치 컨트롤러에서 보낸 하드웨어 인터럽트 요청들의 우선순위를 판별한 뒤, CPU에게 가장 먼저 처리할 인터럽트를 알려주는 장치
    • 과정
      1. PIC가 장치 컨트롤러에서 인터럽트 요청 신호를 수신
      2. PIC는 인터럽트 우선순위를 판단한 뒤 CPU에 처리해야 할 인터럽트 요청 신호를 전달
      3. CPU가 PIC에 인터럽트 확인 신호를 전달
      4. PIC는 데이터 버스를 통해 CPU에 인터럽트 벡터를 전달
      5. CPU는 인터럽트 벡터를 통해 인터럽트 요청의 주체를 알고, 해당 장치의 인터럽트 서비스 루틴을 실행
    • PIC 여러 개로 더 많은 하드웨어 인터럽트를 관리할 수 있음
    • NMI는 우선순위를 판별하지 않음

DMA 입출력

프로그램 입출력과 인터럽트 기반 입출력에서 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하며 데이터는 반드시 CPU를 거침

  • 입출력장치 데이터를 메모리에 저장할 떄
    1. CPU가 장치 컨트롤러에서 입출력장치 데이터를 하나씩 읽어 레지스터에 적재
    2. 레지스터에 적재한 데이터를 메모리에 저장
  • 메모리 속 데이터를 입출력장치에 내보낼 때
    1. CPU가 메모리에서 데이터를 하나씩 읽어 레지스터에 적재
    2. 적재한 데이터를 하나씩 입출력장치에 내보냄

DMA(Direct Memory Access): 직접 메모리에 접근할 수 있는 입출력 기능

DMA 컨트롤러: DMA 입출력을 하기 위해 필요한 하드웨어

  • 과정
    1. CPU는 DMA 컨트롤러에 입출력장치의 주소, 수행할 연산, 읽거나 쓸 메모리의 주소 등 정보가 담긴 입출력 작업을 명령
    2. DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작영하며 작업 수행
      • 필요시 메모리에 직접 접근하여 정보를 읽거나 씀
    3. 입출력 작업이 끝나면 DMA 컨트롤러는 CPU에 인터럽트를 걸어 작업 종료를 알림
  • CPU는 입출력의 시작과 끝에만 관여하면 되어 작업 부담을 훨씬 줄일 수 있음
  • 시스템버스는 공용자원
    • DMA 컨트롤러는 CPU가 시스템 버스를 이용하지 않을때만 쓰거나 허락을 구해 사용
    • CPU 입장에서 사이클 스틸링(cycle stealing)

입출력 버스

  • DMA 컨트롤러는 시스템 버스를 두 번 사용
    • 메모리에 접근할 떄 + 데이터를 장치 컨트롤러로 옮길 때
  • DMA 컨트롤러가 시스템 버스를 사용하는 만큼 CPU가 이용할 수 없음
    • 시스템 버스는 공용자원
  • 입출력 버스(input/output bus)
    • 장치 컨트롤러들이 시스템 버스가 아닌 입출력 버스로 DMA 컨트롤러에 연결
  • PCI(Peripheral Component Interconnect) 버스, PIC Express(PCIe) 버스
    • PCIe 슬롯: 여러 입출력장치들을 PCIe 버스와 연결해주는 통로
  • 입출력 프로세서(IOP; Input/Output Processor), 입출력 채널(Input/Output Channel)
    • 입출력 명령어의 인출, 해석, 실행을 담당하는 입출력 전용 CPU