인터럽트 핸들러

위키백과, 우리 모두의 백과사전.

인터럽트 핸들러(영어: interrupt handler) 또는 인터럽트 서비스 루틴(영어: interrupt Service Routine, ISR)은 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴이다. 운영 시스템이나 임베디드에서 장치 드라이버에서 요구하는 일을 처리하는 기능적 코드 집합으로 콜백 루틴 방식으로 처리된다.

인터럽트 핸들러는 인터럽트 원인에 따라 각각 존재하고 인터럽트 핸들러가 작업을 마치는 데 걸리는 시간도 다양하다. 마이크로프로세서에서 발생하는 예외도 역시 예외 처리 핸들러가 필요하다.

인터럽트는 운영 체계를 사용하는 컴퓨터 시스템에서는 커널과 밀접한 관계를 갖는다. 따라서 인터럽트 핸들러는 커널에 존재하고 응용 프로그램에는 넣지 않는다. 초기의 DOS는 인터럽트 핸들러를 응용 프로그램과 결합하여 작성하였지만, 윈도가 본격적인 운영체계를 갖추면서 커널에서 처리하게 되었다.

임베디드 시스템에서 많이 사용하는 마이크로컨트롤러는 운영체계없이 정해진 기능이 동작하도록 하는 경우가 많다. 이런경우 각각의 인터럽트 핸들러는 전체 프로그램에 넣어 작성된다. 인터럽트 핸들러는 어셈블리 뿐만 아니라 C언어로 표현이 가능하므로, 개발 도구에 지원하는 방식에 따라 표현하면 된다. 표현 방식은 표준언어가 아니므로 각각의 개발 도구에 따라 다르다.

예외 발생 원인[편집]

컴퓨터를 구성하는 많은 입출력 장치는 거의 대부분 인터럽트를 지원한다. 따라서 각각의 기능을 부여하여 인터럽트 핸들러를 만들어 대응한

  • 하드웨어 RESET
  • 정해진 메모리 밖의 엑세스
  • 0으로 나누기
  • 소프트웨어 인터럽트 (x86의 INT xxH 명령어)
  • 컴퓨터 시스템의 기능 장치로부터 발생하는 인터럽트
  • 타이머
  • UART
  • SPI, I2C
  • USB
  • 이더넷
  • 기타 장치

x86 인터럽트 핸들러[편집]

  • 대개 16-bit(실제 주소 모드라고도 함)에서 실행되며, 인터럽트 명령어는 Windows NT 미만 버전에서 실행되어야 한다. Windows NT부터는 에뮬레이터 모드로 실행되어 하드웨어에 직접 접근할 수 없으며 Windows Vista부터는 제3자 에뮬레이터가 없으면 실행이 불가능하다.
  • 어셈블리어로 이루어진 코드에서 (MASM 기준으로) int (번호)를 사용한 호출이 가능하다. 예를 들면 다음처럼 쓸 수 있다.
  .data
  welcome_message BYTE 'Welcome! interrupt call 21h.', 0dh, 0ah
  .code
  mov ah, 40h
  mov bx, 1
  mov cx, lengthof welcome_message
  mov dl, offset welcome_message
  int 21h ; << 인터럽트 호출 Interrupt call.
  • 00000~003FF 까지가 CPU가 인터럽트를 처리할 때 사용하는 메모리 주소이다. (32비트 주소 테이블, 인터럽트 벡터 테이블)

만약 다음 코드가 있다면,

  mov ah, 2
  mov dl, 'P'
  int 21h     ; << 1
  push al

'<< 1' 표시를 한 줄에서는 인터럽트 벡터 테이블에서 명령어를 호출한다.

  sti
  ;.....COMMANDS.....
  IRET ; << 2

'<< 2' 표시를 한 줄에서 다시 돌아와 '<< 1' 표시를 한곳으로 와서 push al이 수행된다.