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
- 외부 ( async )
- 전원
- 기계착오
- 외부신호
- 입출력
- 내부 ( sync )
- exception ( 명령의 잘못된 사용. e.g.,
division by 0
) - trap ( = Software Interrupt )
- exception ( 명령의 잘못된 사용. e.g.,
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)
- Interrupt 발생 시 일단 현재 진행 중인 instruction을 완료한다.
- IRQ인 경우 mask가 set되어 있으면 대기한다.
- Interrupt Descriptor Table( IDT )을 보고 발생한 Interrupt vector에 대응되는 ISR address를 얻는다. * IVT(Vector)는 real-mode에서만 참고하며, 부팅 이후 protected-mode에서는 모두 IDT를 참고한다.
- ISR로 JMP한다. 이 때 PC는 stack에 자동으로 저장된다.
- ISR의 시작 지점에서 stack에 레지스터 정보를 푸시해 놓는다. CPU상태( register )를 저장해 놓아야 원래 처리 루틴으로 돌아왔을 때 정상적인 실행이 가능하기 때문
- ISR의 마지막 지점에서 stack에 저장해 놓았던 레지스터 값을 복원하고 return한다.