새소식

인기 검색어

개발일기

입출력 장치와 Device Driver, Device Controller / 인터럽트

  • -

계획

토요일부터 너무 놀았다!! 내일부턴 갓생 살아야지

학습한 내용

입출력 장치와 Device Driver, Device Controller

I/O 장치들은 다루기 어렵다. 그 이유들은 다음과 같다

  1. 입출력 장치 종류가 많아서 각자 언어가 다른 것과 같다.
  2. CPU와 메모리의 데이터 전송률에 비해 입출력 장치의 전송률이 낮다

이 문제를 해결하는 것이 Device Controller라는 HW이다. Device Controller는 I/O 장치에 붙어있다.

Device Controller 출처 : https://simple.wikipedia.org/wiki/Device_controller

Device Controller의 역할은 다음과 같다.

  1. CPU와 I/O 장치간 통신 중계
  2. 입출력 장치에 대한 오류 검증
  3. 데이터 버퍼링

여기서 버퍼링이란, 전송률이 높은 장치와 낮은 장치 사이에 buffer라는 임시 공간을 두어, 데이터를 조금씩 저장하다가 한 번에 내보내(flush) 전송률 차이를 해결하는 방법이다.

 

그렇다면 CPU는 Device Controller와 어떻게 상호작용할까? Device Driver라는 SW를 통해서 한다.

 

Device Driver란 Device Controller의 동작을 감지 / 제어해서 컴퓨터와 데이터를 주고 받을 수 있도록 한다. 만약, Device Driver가 설치되지 않았다면 보조기억 장치를 포함한 I/O 장치는 사용할 수 없다.

 

Device Controller와 CPU가 정보를 주고받는 방법(=I/O 작업 방법)의 종류는 다음과 같다.

  • 프로그램 입출력 : 프로그램 명령어로 제어.
  • 인터럽트 기반 입출력 : CPU에 명령을 보내 놓으면 Device Controller가 작업한 후 CPU로 인터럽트를 보낸다.
    • 인터럽트들 간에 우선순위가 있어, 여러 인터럽트가 동시에 보내지더라도 우선순위 - 도착한 순서 순으로 인터럽트 서비스 루틴을 수행한다.
    • 폴링(polling) 개념과 대조된다.

출처 : https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/13_IOSystems.html

  • DMA 입출력
    • DMA (Direct Memory Access): 데이터가 CPU를 거치지 않고 메모리와 I/O 장치간 전송될 수 있도록 한다. DMA I/O를 사용하려면 시스템 버스에 연결된 DMA Controller라는 HW를 필요로 한다
      • DMA X 읽기 : I/O 장치 -> CPU -> 메모리
      • DMA O 쓰기 : 메모리 -> CPU -> I/O 장치
      • DMA O 쓰기 : 메모리 -> DMA Controller -> Device Controller(I/O 장치)
    • DMA와 CPU는 시스템 버스를 공유하기 때문에 CPU가 시스템 버스를 사용하지 않을 때나, 미리 허락을 구하고 사용한다.
    • 최근 DMA Controller에 명령 / 해석 / 실행하는 전용 CPU도 있다. I/P Processor 혹은 I/O Channel이라고도 부른다

출처 : https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/13_IOSystems.html

입출력 버스 : DMA를 위해 시스템 버스를 자주 사용하면 CPU가 시스템 버스를 사용하지 못하기 떄문에 DMA Controller와 Device Controller를 I/O 버스로 연결할 수 있다.

인터럽트

명령어 사이클 : 하나의 명령어가 처리되는 주기

인터럽트 : CPU의 작업을 방해하는 신호

  • 동기 인터럽트 : CPU에 의해 발생하는 프로그래밍상 오류 등. Exception이라고 부른다
  • 비동기 인터럽트 : IO 장치에 의해 발생하는 일종의 알림 역할. HW 인터럽트라고 한다.
    • 다른 장치에 작업을 맡겨놓고 완료 여부를 받으면 그때 작업할 수 있기 때문에 CPU를 효율적으로 사용할 수 있다.

CPU는 실행 사이클이 끝나고 명령어 인출 전에 항상 인터럽트 여부를 확인한다.

 

인터럽트는 정상 실행 흐름을 끊는 것이기 때문에 CPU에게 인터럽트 해도 되는지 인터럽트 요청 신호를 보내는데, 이걸 인터럽트 플래그라고 부른다.

 

한편, 무시할 수 없는 인터럽트도 있는데, HW 인터럽트의 경우가 그렇다.

 

인터럽트가 실행될 떄 인터럽트 서비스 루틴을 실행하게 되는데 이때 인터럽트 실행 후 현재 하던 것들을 이어나가야 하기 때문에 현재 레지스터에 들어있던 값들을 Stack에 백업해 놓는다.

 

동기 인터럽트에는 다음과 같은 종류가 있다.

  • 폴트 : 예외 처리 후 폴트가 발생한 명령어부터 재개
  • 트랩 : 예외 처리 후 예외가 발생한 명령어의 다음 명령어부터 재개
  • 중단 : CPU가 실행 중인 프로그램을 강제로 중단시킬 수 밖에 없는 심각한 오류 발견시 발생시킨다
  • SW 인터럽트 : 시스템 호출 발생시 나타난다
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.