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.

```c

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

```

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


Types

  1. 외부    ( async )
       - 전원
       - 기계착오
       - 외부신호
       - 입출력
  2. 내부    ( sync )
       - exception   ( 명령의 잘못된 사용. e.g., ``c division by 0`` )
       - trap            ( = Software Interrupt )
hardware interrupt는 비동기 인터럽트로, 언제 어떤 인터럽트가 일어날지 예측할 수 없다. 
* 그러나 모든 hardware interrupt가 비동기라고 할 수는 없다. 대부분 비동기.

trap ( Software Interrupt )

trap( Software Interrupt )은 명시적으로 예외 조건을 생성하는 instruction ( ``c int *`` )을 말하며 발생 시점이 일정한 동기적 인터럽트다.

user code에 따라 발생하는 interrupt이기 때문에 code가 trap의 발생을 예측할 수 있다.

또한 수행하고 있던 user code 정보를 저장한 후 interrupt를 처리하기 때문에 처리 후 다시 user code를 진행하게 된다.

0x80번 trap, 즉 ``c 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한다.