interrupt

Nam Eun-Ji·2020년 11월 19일
0

인터럽트란?

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

인터럽트가 필요한 이유

  • 선점형 스케쥴러 구현
    프로세스 running 중에 스케쥴러가 이를 중단시키고, 다른 프로세스로 교체하기 위해 현재 프로세스 실행을 중단 시킴. 그럴려면 스케쥴러 코드가 실행이 되서, 현 프로세스 실행을 중지시켜야 함.

  • IO device와의 커뮤니케이션
    저장매체에서 데이터 처리 완료 시, 프로세스를 깨워야함(block state → ready state)

  • 예외 상황 핸들링
    CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생할 경우, CPU가 해당 처리를 할 수 있도록 CPU에 알려줘야 함


인터럽트 처리 예

  • CPU가 프로그램을 실행하고 있을 때,
    • 입출력 하드웨어 등의 장치 이슈 발생
      • 파일 처리가 끝났다는 것을 운영체제에 알려주기
      • 운영체제는 해당 프로세스를 block state에서 ready state 상태로 프로세스 상태 변경하기
    • 또는 예외 상황 발생
      • 0으로 나누는 계산이 발생하여, 예외 발생을 운영체제에 알려주기
      • 운영체제가 해당 프로세스 실행 중지/에러 표시

이벤트와 인터럽트

  • 인터럽트는 일종의 이벤트로 불림
  • 이벤트에 맞게 운영체제가 처리



주요 인터럽트

계산하는 코드에서 0으로 나누는 코드 실행 시 (Divide-by-Zero Interrupt)

# include <stdio.h>

int main()
{
    printf("Hello World!\n");
    int data;
    int divider = 0;
    data = 1 / divider;  // 이 부분에서 인터럽트 발생
    return 0;
}

타이머 인터럽트
선점형 스케쥴러를 위해 필요

입출력(IO) 인터럽트
프린터, 키보드, 마우스, 저장매체(SSD 등) ...




인터럽트 종류

  • 내부 인터럽트
    주로 프로그램 내부에서 잘못된 명령 또는 잘못된 데이터 사용 시 발생, 소프트웨어 인터럽트라고도 함

    • 0으로 나눴을 때
    • 사용자 모드에서 허용되지 않은 명령 또는 공간 접근 시
    • 계산 결과가 overflow/underflow 날 때
  • 외부 인터럽트
    주로 하드웨어에서 발생되는 이벤트(프로그램 외부), 하드웨어 인터럽트라고도 함.

    • 전원 이상
    • 기계 문제
    • 키보드 등 IO관련 이벤트
    • Timer 이벤트



시스템 콜 인터럽트

시스템콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어, CPU에게 실행시켜야 한다.

시스템콜 실제 코드

mov eax, 1
mov ebx, 0
int 0x80   // 소프트웨어 인터럽트 명령
// int : CPU op code
// 0x80 : 인터럽트 번호(시스템콜 -> 0x80)시스템콜은 무조건 0x80
  1. eax 레지스터에 시스템콜 번호를 넣고, (시스템콜마다 각각의 번호가 있음 ex. open함수,...)
    // 시스템콜 예
    open('data.txt', O_RDONLY)
  2. ebx 레지스터에는 시스템콜에 해당하는 인자값(위 예를 보면 'data.txt' 등)을 넣고,
  3. 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌

시스템콜 인터럽트 명령을 호출하면서 0x80값을 넘겨줌

  1. CPU는 사용자 모드를 커널모드로 바꿔줌(int라는 cpu op code가 이 역할을 수행함)
  2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함
    인터럽트 번호 : 주소(코드) 이렇게 맵핑되어 있음.
  3. system_call()함수에서 eax로부터 시스템콜번호를 찾아서, 해당 번호에 맞는 시스템콜 함수로 이동
  4. 해당 시스템콜 함수 실행 후, 다시 커널모드에서 사용자모드로 변경하고, 다시 해당 프로세스 다음 코드 진행



인터럽트와 IDT

  • 인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있음
    • 어디에? IDT(이벤트번호 : 실행코드의 주소(함수))에 기록
    • 언제? 컴퓨터 부팅 시 운영체제가 기록
    • 어떤 코드? 운영체제 내부 코드
  • 리눅스의 예
    • 0 ~ 31 : 예외상황 인터럽트 (일부는 정의 안 된채로 남겨져 있음)
    • 32 ~ 47 : 하드웨어 인터럽트 (주변장치 종류/갯수에 따라 변경 가능)
    • 128 : 시스템콜 (0x80)




인터럽트와 프로세스




인터럽트와 스케줄러

profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글