ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] Interrupt 인터럽트란?
    CS 2021. 8. 15. 23:45

    인터럽트란?

    • CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것
    • 우선적으로 처리해야할 일이 발생하였을 때 그것을 처리하고 원래 동작으로 돌아옴
    • 크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나눔

    하드웨어 인터럽트

    • 일반적으로 인터럽트를 이르는 말
    • CPU외부로부터의 인터럽트 요구 신호에 의해 발생되는 인터럽트
    • Maskable interrupt, Non-maskable interrupt 가 있다. (Interrunpt Mask가 가능)
      • Maskable interrupt
        - Interrupt Mask(인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것)가 가능 
        - 인텔CPU 에서 INTR pin으로 신호가 들어옴
      • Non Maskable interrupt 
        - Interrupt Mask가 불가능
        - 거부, 무시할 수 없음 (매우 중요함)
        - 정전, 하드웨어 고장 등 어쩔수없는 오류
        - 인텔 CPU에서 NMI pin으로 신호가 들어옴

     

    하드웨어 인터럽트 종류

    • 입출력 인터럽트 (I/O interrupt) - 입출력 작업의 종료나 입출력 오류에 의해 CPU의 기능이 요청됨
    • 정전,전원 이상 인터럽트(Power fail interrupt) - 전원 공급의 이상
    • 기계 착오 인터럽트(Machine check interrupt) - CPU의 기능적인 오류
    • 외부 신호 인터럽트(External interrupt) - I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우

    소프트웨어 인터럽트

    • CPU내부에서 자신이 실행한 명령이나 CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생
    • trap 또는 exception 이라고도 함
    • 프로그램의 오류에 의해 생기는 인터럽트

     

    소프트웨어 인터럽트 종류

    • 프로그램 검사 인터럽트 (Program check interrupt) 
      • 0으로 나누는 경우
      • OverFlow/UnderFlow
      • 페이지 부재
      • 부당한 기억장소의 참조
      • 등등...
    • SVC(Supervisor Call: 감시프로그램 호출)인터럽트
      • 사용자가 프로그램을 실행시키거나 supervisior을 호출하는 동작을 수행하는 경우
      • 프로그래머에 의해 코드로 짜인 감시 프로그램을 호출하는 방식

    인터럽트 우선순위


    인터럽트 벡터   Interrupt Vector

    • 여러가지 인터럽트에 대해 해당 인터럽트 발생시 처리해야 할 루틴(ISR)의 주소를 보관하고 있는 공간
    • 대부분의 CPU들은 인터럽트 벡터 테이블을 가지고 있음
    • 인텔x86에서는 이를 IDT(Interrupt Descriptor Table)이라고 한다.

     

    인터럽트 서비스 루틴   Interrupt Service Routine(ISR)

    • 인터럽트 핸들러 Interrupt handler 라고도 함
    • 인터럽트가 접수되면 각각의 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴(커널이 실행)
    • ex) 키보드 자판을 눌러 키보드 인터럽트가 발생하면 이에 해당하는 인터럽트 서비스 루틴이 실행됨

    인터럽트 과정

    >> 프로세스 A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받았을 때

    • 프로세스 A는 system call을 통해 인터럽트를 발생시킴
    • CPU는 현재 진행중인 기계어 코드를 완료
    • 현재까지 수행중이었던 상태를 해당 프로세스의 PCB(Process Control Block)에 저장 
      (수행중이던 메모리 주소, 레지스터 값 등등)
    • PC(Program Counter, IP)에 다음 실행할 명령의 주소 저장
    • 인터럽트 벡터를 읽고 ISR 주소값을 얻어 ISR(interrupt Service Routine)으로 점프하여 루틴을 실행
    • 해당 코드 실행
    • 해당 일을 다 처리하면 저장했던 프로세스 상태 복구
    • ISR의 끝에 IRET명령어에 의해 인터럽트가 해제
    • IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행위치로 복원

     

    * IRET(Interrupt Return) 명령어: 이전 태스크로 다시 돌아가는 어셈블리 명령어. ISR의 마지막 명령어.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    참고

    https://huistorage.tistory.com/111

    https://medium.com/@lazypanda43/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-%EC%A2%85%EB%A5%98%EC%99%80-%EC%B2%98%EB%A6%AC%EA%B3%BC%EC%A0%95%EA%B3%BC-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-c95c26909472

    https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8

    https://otakuking.tistory.com/70

    https://docs.oracle.com/cd/E19455-01/806-3773/instructionset-75/index.html

     

     

     

     

     

     

    댓글

Maybe a whole cake ? 🎂 HAHA!