본문 바로가기
Operating System

인터럽트(Interrupt)

by 기리의 개발로그 2015. 8. 14.

인터럽트(Interrupt)



인터럽트


- 어떤 일을 수행하는 도중에 끼어드는 사건(Event)

- 인터럽트가 발생했을 때 일을 처리하는 것을 '인터럽트 처리'라고 함

- CPU가 프로세스 명령어를 순차적으로 수행하는 도중 다른 처리를 위해 끼어드는 사건(인터럽트) 발생 시 CPU는 현재 하던 일을 멈추고 사건을 처리하기 위해 정의된 Interrupt Service Routine의 내용을 먼저 수행



인터럽트에 대한 이해


- 일반적인 인터럽트 = 하드웨어 인터럽트

- H/W는 비동기적으로 사건을 알리는데, H/W 인터럽트가 그 수단

- 이 때 사건을 알리는 동작을 IRQ라 함 -> 이 신호로 장비를 확인

- IRQ는 PIC(Programmable Interrupt Controller)를 통해서 요청

- 인터럽트를 사용함으로써 CPU 이용률을 높임

- H/W 뿐만 아니라 현재 수행중인 프로세서에서도 인터럽트를 발생시킬 수 있음

- 이 인터럽트를 S/W 인터럽트 또는 Trap 이라함(ex : System call)

- PIC

- 하나의 CPU는 하나의 인터럽트만 확인 가능하지만 하나의 CPU에 여러 개의 인터럽트가 연결되도록 해주는 칩



IDT(Interrupt Descriptor Table) 테이블


- 리눅스는 인터럽트 처리를 위해 IDT를 사용

- 각 인터럽트를 처리하기 위한 서비스 루틴을 함수로 구현해두고, 각 함수의 시작점 주소(핸들러 함수)를 IDT에 등록

- IDT는 메모리에 위치, 이를 가리키는 레지스터를 IDTR 이라 함

- 인터럽트 발생 -> IDTR을 통해 IDT를 알아 냄 -> 인터럽트 번호에 대응되는 테이블 엔트리에서 핸들러 함수를 찾아서 이 루틴에 정의된 내용을 처리

- IDT는 총 256개의 엔트리를 가짐(각 엔트리는 8 Byte 크기의 디스크립터로 구성, 256 * 8 = 2048 Byte)





인터럽트 수행 과정


- 인터럽트 발생

- 실행 중인 프로세스 중지

- 커널 모드로 전환

- do_IRQ 함수 호촐

- PIC에게 응답 신호 보냄

- 실제 핸들러 함수를 호출

...

- do_IRQ 함수가 종료되면 ret_from_intr 주소로 복귀

- 사용자 모드로 전환


* do_IRQ 함수 : 인터럽트에 연관된 모든 인터럽트 서비스 루틴을 실행하기 위해 호출하는 함수

* PIC : 인터럽트 도중 같은 종류의 인터럽트 발생을 막음

반응형

댓글