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.
```c
processes --- (signal) --- kernel --- (interrupt) --- CPU
```
그래서 `` SIGINT``로 kernel에 interrupt 요청을 보내면, kernel이 CPU에 interrupt를 거는 식.
Types
- 외부 ( async )
- 전원
- 기계착오
- 외부신호
- 입출력 - 내부 ( sync )
- exception ( 명령의 잘못된 사용. e.g., ``c division by 0`` )
- trap ( = Software Interrupt )
trap ( Software Interrupt )
trap( Software Interrupt )은 명시적으로 예외 조건을 생성하는 instruction ( ``c int *`` )을 말하며 발생 시점이 일정한 동기적 인터럽트다.
user code에 따라 발생하는 interrupt이기 때문에 code가 trap의 발생을 예측할 수 있다.
또한 수행하고 있던 user code 정보를 저장한 후 interrupt를 처리하기 때문에 처리 후 다시 user code를 진행하게 된다.
Interrupt handle
- 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한다.
'OS > Kernel' 카테고리의 다른 글
[kernel] LKM, Loadable Kernel Module / Kernel Compile (0) | 2017.10.14 |
---|---|
[kernel] virt_to_phys (0) | 2017.10.13 |
[kernel] exploit (0) | 2017.10.06 |
System call / vDSO, vsyscall (0) | 2016.09.18 |
Preemptive / Non-preemptive ( 선점형 / 비선점형 스케줄링 ) (0) | 2016.09.18 |