Post

Interrupt

Interrupt가 발생하면 CPU는 ISR로 진입하게 되며 Interrupt를 적절히 처리해 주는 것은 OS의 역할이다. 이는 Interrupt가 하드웨어적으로 CPU에 바로 입력되기 때문에 가능하다. * CPU pin 중에 Interrupt pin이 하나 존재한다. 각각의 디바이스는 Interrupt Controller를 가지고 있는데, 여기서 CPU의 Interrupt pin으로 전기적 신호를 보내는 식으로 동작한다.

Interrupt VS Signal

Interrupts can be viewed as a mean of communication between the CPU and the OS kernel.

Signals can be viewed as a mean of communication between the OS kernel and OS processes.

1
processes --- (signal) --- kernel --- (interrupt) --- CPU

그래서 SIGINT로 kernel에 interrupt 요청을 보내면, kernel이 CPU에 interrupt를 거는 식.

Types

  1. 외부 ( async )
    • 전원
    • 기계착오
    • 외부신호
    • 입출력
  2. 내부 ( sync )
    • exception ( 명령의 잘못된 사용. e.g., division by 0 )
    • trap ( = Software Interrupt )

hardware interrupt는 비동기 인터럽트로, 언제 어떤 인터럽트가 일어날지 예측할 수 없다. * 그러나 모든 hardware interrupt가 비동기라고 할 수는 없다. 대부분 비동기.

trap ( Software Interrupt )

trap( Software Interrupt )은 명시적으로 예외 조건을 생성하는 instruction ( int \* )을 말하며 발생 시점이 일정한 동기적 인터럽트다. user code에 따라 발생하는 interrupt이기 때문에 code가 trap의 발생을 예측할 수 있다. 또한 수행하고 있던 user code 정보를 저장한 후 interrupt를 처리하기 때문에 처리 후 다시 user code를 진행하게 된다. 0x80번 trap, 즉 int 0x80은 system call이다. * 그냥 system call interrupt를 지칭해 trap이라고 부르기도 한다.

Interrupt handle

* ISR ( Inerrupt Service Routine = Interupt Handler)

  1. Interrupt 발생 시 일단 현재 진행 중인 instruction을 완료한다.
  2. IRQ인 경우 mask가 set되어 있으면 대기한다.
  3. Interrupt Descriptor Table( IDT )을 보고 발생한 Interrupt vector에 대응되는 ISR address를 얻는다. * IVT(Vector)는 real-mode에서만 참고하며, 부팅 이후 protected-mode에서는 모두 IDT를 참고한다.
  4. ISR로 JMP한다. 이 때 PC는 stack에 자동으로 저장된다.
  5. ISR의 시작 지점에서 stack에 레지스터 정보를 푸시해 놓는다. CPU상태( register )를 저장해 놓아야 원래 처리 루틴으로 돌아왔을 때 정상적인 실행이 가능하기 때문
  6. ISR의 마지막 지점에서 stack에 저장해 놓았던 레지스터 값을 복원하고 return한다.
This post is licensed under CC BY 4.0 by the author.