Interrupt (인터럽트)란 프로그램을 실행하는 중에 예기치 않은 사건이 발생했을 때,
현재 실행 중인 코드의 흐름을 중단하고, 커널이 해당 사건을 우선 처리한 뒤
중단되었던 코드로 다시 복귀하는 메커니즘을 의미한다.
이때 중요한 것은, 커널이 이 인터럽트를 어떻게 처리하는가에 있다.
커널의 구조상, 유저 공간의 프로그램은 유저 권한(Ring 3)에서 실행되고,
커널은 커널 권한(Ring 0)에서 실행된다. (User & Kernel Space)
따라서 유저 프로그램은 커널 코드를 직접 호출할 수 없다.
그러나 인터럽트는 이 규칙의 예외이다.
인터럽트가 발생하면 CPU는 하드웨어적으로 다음 동작을 수행한다:
- 현재 실행 중이던 유저 코드의 상태(RIP, RSP 등)를 저장하고
- 커널 스택으로 전환한 뒤
- 권한을 Ring 0으로 바꾸고
- 인터럽트 벡터 테이블(IDT)을 통해 커널의 인터럽트 핸들러로 점프한다.
즉, 인터럽트는 하드웨어가 보장하는 Ring 3 → Ring 0 전환 경로이다.
이 과정은 일반적인 프로세스 간의 Context Switch와는 다르지만,
CPU의 실행 흐름이 유저에서 커널로 넘어간다는 점에서 권한 전환이 발생한다는 점은 동일하다.
인터럽트는 발생 원인에 따라 크게 두 가지로 나뉜다.
- 하드웨어에서 발생하는 외부 인터럽트 (타이머, 디스크, 네트워크 등)
- CPU가 명령 실행 중 감지하는 내부 인터럽트, 또는 트랩(trap)
이 중, 프로그램이 잘못된 메모리 접근이나 금지된 연산을 시도했을 때 발생하는 트랩을 예외(exception) 라고 부른다.
대표적인 예외의 예시는 Page Fault이다.