인터럽트

devjune·2021년 10월 27일

운영체제

목록 보기
10/10

인터럽트

인터럽트: CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술

인터럽트 필요 이유

  1. 프로세스가 러닝 중에 스케쥴러가 중단시키고 다른 프로세스로 교체하기 위해서 필요.

  2. 저장메체에서 데이터 처리 완료시, 프로세스를 다시 깨워야 할 때.

  3. 예외 상황 핸들링

    • CPU 실행 중, 하드웨어 장치 또는 예외 상황이 발생한 경우 해당 처리를 할 수 있도록 CPU에 알려줘야 함.

인터럽트 종류

  1. Divide-by-Zero Interrupt(계산하는 코드에서 0으로 나누는 코드 실행시)
int main() {
  printf("Hello World!\n");
  int data;
  int divider = 0;
  data = 1 / divider; //이 부분에서 발생
  return 0;
}

  1. 타이머 인터럽트

정한 시간주기로 cpu에 인터럽트를 발생시켜 프로세스를 변경할 수 있음.

  1. 입출력 인터럽트
    하드웨어 사용 완료를 cpu에 알려줌.

내부 인터럽트 = 소프트웨어 인터럽트
외부 인터럽트 = 하드웨어 인터럽트

인터럽트 내부 동작

시스템콜 인터럽트

시스템콜도 인터럽트 방식으로 실행된다.
시스템콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어 CPU에게 실행 시켜야 함.

시스템 콜 실제 코드

mov eax, 1
mov ebx, 0
int 0x80 //시스템콜 인터럽트 명령(인텔계열)

eax: 시스템콜 번호 입력
ebx: 시스템콜에 해당하는 인자값 입력
소프트웨어 인터럽트 명령 호출 및 Ox80값 입력

동작 방식

  1. cpu는 사용자모드 -> 커널모드 변경
  2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아 실행
  3. system_call()함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
  4. 해당 시스템콜 함수 실행 후 다시 커널모드에서 사용자 모드로 변경 및 다음 코드 진행.

리눅스 예

  • 0~31: 예외 상황 인터럽트
  • 32~47: 하드웨어 인터럽트
  • 128: 시스템콜

profile
개발자준

0개의 댓글