- 인터럽트(Inerrupts)
- 컴퓨터가 작업을 수행하던 도중 예기치 못한 특수한 상황이 발생하여 작업을 중단하고, 특수한 상황을 먼저 처리한 후, 원래의 작업으로 되돌아가 나머지 작업을 계속 수행하게 되는 일련의 과정이다.
- 인터럽트 당한 시점의 레지스터와 PC(program counter : 다음번에 실행할 명령어 주소) 를 PCB(Process Control Block)에 저장해두고 CPU의 제어를 인터럽트 서비스 루틴(Interrupt Service Routine)에 넘긴다.
- 크게 하드웨어인터럽트, 소프트웨어 인터럽트로 나뉜다.
- 명령어의 실행단계를 마칠 때마다 CPU는 반복적으로 인터럽트 요청이 있는지 계속해서 확인한다.
1–1. 인터럽트 분류
인터럽트 분류에 대해서는 할말이 많다. 어떤 사람은 외부 인터럽트, 내부 인터럽트로 나구고, 다른 분은 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 나누고, 인터럽트랑 예외랑 혼용하여 말하는 분들도 있다.
저는 인터럽트가 어디서 발생하는냐로 구분했습니다.
Asynchronous interrupt (비동기적) = Interrupt = Hardware Interrupt
I/O 장비에서 아무때나 전달되어오는 신호이다.
보통 ‘인터럽트’ 라고 하는 것.
입출력 장치에 의한 경우와 같이 외부의 돌발적인 상황이 발생하였을 경우 CPU는 실행중인 작업들을 일시 중지하고 정해진 인터럽트 작업을 수행한다.
때로는 인터럽트를 무시해할 때가 있다.
- Maskable interrupt
Interrupt Mask가 가능한 인터럽트이다.
Interrupt Mask : 인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것.
CLI/STI instruction 에 의해서 무시될 수 있는 interrupt 이다.
인텔 CPU에서 INTR pin 으로 신호가 들어온다.
입출력 장치가 제기하는 인터럽트 요청과 거의 대부분의 인터럽트가 여기에 해당된다.
- NMI(non-maskable interrupt)
Interrupt Mask 가 불가능한 인터럽트이다.
무시될 수 없는 interrupt 이다. = 매우 중요한 interrupt
인텔 CPU에서 NMI pin 으로 신호가 들어온다.
몇몇 심각한 사건(정전, 하드웨어 고장 등 어찌할 수 없는 오류)등이 해당된다.
Synchronous interrupt (동기적) = Exception = Software Interrupt
CPU 외부에서 발생하는 interrupt와는 달리 CPU 내부에서 발생하는 신호들이다.
instruction을 실행하다가 만나게 되는 문제점들에 대해서 CPU가 스스로 발생시키는 신호.
보통 ‘예외’ 라고 명시한다.
에러나 커널이 처리해야할 비정상적인 상황에 CPU가 대처하기 위한 작업들이다.
예외처리는 항상 instruction과 동기화 되어 발생한다.
- exception
프로세서가 감지하는 예외 : CPU가 명령어를 실행하다가 비정상적인 상황을 감지할 때 발생한다.
CPU가 예외를 발생시킬 때, 커널 모드 스택에 저장하는 EIP(CPU가 실행중이던 현재 주소) 레지스터의 값에 따라 3분류로 나뉜다.
- fault
발생한 사건을 복구하고 다시 재시작할 수 있는 상황에서 발생한다.
stack에 저장된 EIP에는 fault를 발생시킨 해당 instruction을 가리키고 있다.
따라서 fault handler가 끝나고 복귀할 때는 해당 instruction을 다시 실행하게 된다.
예) page fault
- trap
트랩을 발생시키는 명령어를 실행하자마자 발생한다.
프로그램은 커널로부터 제어권을 다시 돌려 받은 후에 이어서 실행할 수 있다.
예) 디버깅 할때 braking point
- abort (중단)
심각한 에러(하드웨어 고장, 시스템 테이블에 잘못된 값이 들어가 있는 경우)로 인하여 더 이상 진행이 될 수 없는 상황에서 발생한다.
stack 의 EIP에는 예외를 일으킨 정확한 위치를 저장하지 못하는 경우가 많다.
abort 가 발생하였을 경우엔 문제가 발생한 프로세스를 강제로 종료되어야만 하는 상황이다.
프로그래밍에 의한 예외 : 프로그래머의 요청이 INT(interrupt), INT3 명령어에 의해 발생한다.
INT라는 명령어는 소프트웨어에서 직접 예외처리하거나 인터럽트를 일으킬 수 있게 해주는 명령어이다.
CPU는 이 예외를 Trap으로 처리한다.
이 예외의 일반적인 용도는 system call 을 구현하거나 디버거에 특별한 사건이 발생하였음을 알리기 위한 용도로 사용된다.
인텔 매뉴얼에서는 Software-generated interrupts 라고 한다.
1–2. Interrupt 와 exception
과거에는 interrupt라는 단일 용어로 쓰였지만, CPU의 control unit이 내부적으로 처리해야할 상황이 많아지면서 (각종 fault들) 최근에는 interrupt와 exception을 구분해서 쓰는 경향이 있다. 그러니 문맥을 보고 잘 판단해야한다.
Interrupt 나 exception이 걸리면 기본적으로 CPU는 EIP를 stack에 저장하고, Interrupt 나 exception을 처리한다.
- 우리가 말하는 interrupt 는 maskable interrupt 와 NMI 만을 뜻한다.
인터럽트나 예외 처리를 하고 나면 제어권을 원래 프로세스로 돌려주어야 한다.
2. 인터럽트 종류
외부 인터럽트(External Interrupt) = 하드웨어 인터럽트
CPU 외부로부터의 인터럽트 요구 신호에 의해 발생되는 인터럽트.
- 입출력 인터럽트(I/O interrupt) — 입출력 작업의 종료나 입출력의 오류에 의해 CPU의 기능이 요청되는 경우
- 정전,전원이상 인터럽트(Power fail interrupt) — 정전이나 전원공급의 이상
- 기계 착오 인터럽트(Machine check interrupt) — CPU의 기능적인 오류
- 외부 신호 인터럽트(External interrupt) — I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
내부 인터럽트(nternal Interrupt) = exception
CPU 내부에서 실행하면서 인터럽트에 걸리는 경우
프로그램의 오류에 의해 생기는 인터럽트.
- 프로그램 검사 인터럽트(Program check interrupt)
0 으로 나누기
OverFlow / UnderFlow 발생
프로그램에서 명령어를 잘 못 사용한 경우
부당한 기억장소의 참조
- SVC(Supervisor Call : 감시프로그램 호출) 인터럽트
사용자가 프로그램을 실행시키거나 Supervisor(감시프로그램)을 호출하는 동작을 수행하는 경우.
supervisor(= 운영체제) 에게 제어권을 넘겨서 해결하는 것.
application에서 직접 내부에 접근하는 것을 막는다.
인터럽트 관련 용어
인터럽트 벡터(Interrupt Vector)
- 인터럽트가 발생했을 때 해야 할 일이 무엇인가를 정해 놓은 곳이다.
- 발생원(source)마다 처리하는 일이 다르다.
- 여러 종류의 인터럽트에 대한 ISR의 시작 주소 이다.
- 인터럽트 벡터 테이블(Interrupt Vector table)
주기억장치의 특정 영역에 여러 개의 인터럽트에 대한 인터럽트 벡터를 모아놓은 영역이다.
메모리 영역 0000:0000H ~ 0000:03FFH (1KB) 에 위치한다.
인터럽트 번호를 인덱스로 하여 접근한다.
인터럽트 번호(Interrupt Request, IRQ) 0 이 우선순위 제일 높음.
0 ~ 31 : NMI와 exception
32 ~ 47 : Maskable interrupt
128 : 시스템 콜
- 인터럽트 서비스 루틴(Interrupt Service Routine, ISR) = 인터럽트 핸들러(Interrupt Handler)
해당 인터럽트를 처리하는 커널 함수
3–1. PIC (Programmable Interrupt Controller)
PC의 모든 외부로부터의 하드웨어 인터럽트는 8259A라는 칩을 통해서 입력을 받는다.
PIC 는 master-slave 구조로 구성되고, 마스터 PIC의 IRQ 핀 8개(0–7)와 슬래이브 PIC의 IRQ 핀 8개(8–15)로 각 핀에 연결된 하드웨어 장치의 인터럽트를 받아 CPU에게 알리고, CPU는 인터럽트의 정보를 PIC로부터 받아 해당 인터럽트 루틴을 실행한다.
4. 인터럽트 처리과정
인터럽트 요청 검사
- interrupt request : 프로그램 실행도중 인터럽트 소스(source,인터럽트를 요청하는 하드웨어)가 CPU로 인터럽트 요청신호(IRQ/INTR)를 보냄.
- Execution Stage(명령어 사이클에서 실행단계)를 끝낸 후 INTR을 확인하고 , INTR이 있으면 Interrupt Stage를 실행한다.