인터럽트

tycode·2021년 4월 14일
0

C.S (Computer Science)

목록 보기
5/40
post-custom-banner

인터럽트

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

  • 선점형 스케쥴러에 프로세스 running 중에 스케쥴러가 이를 중단시키고, 다른 프로세스로 교체하기 위해, 현재 프로세스 실행을 중단시키는 역할.
    • 그러려면, 스케쥴러 코드가 실행이 되서, 현 프로세스 실행을 중지시켜야 함.
  • IO Device와의 커뮤니케이션
    • 저장매체에서 데이터 처리 완료시, 프로세스를 깨워야 한다고 알려줄 때.
      (block/wait state → ready state)
  • 예외 상황 핸들링 (CPU온도 상승, 오류 등등)
    • 운영체제가 해당 프로세스 실행 중지/에러 표시하여 CPU가 핸들링 할 수 있도록 알려준다.

주요 인터럽트(Interrupt)

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

2. 타이머 인터럽트

  • 선점형 스케쥴러를 위해 필요

3. 입출력(IO) 인터럽트

  • 프로세스 실행되고 있을 때 키보드나 마우스를 계속 사용하면 운영체제에 알려주고 운영체제가 어떻게 처리하는지도 인터럽트가 된다.

인터럽트 종류

  • 내부 인터럽트 (또는 소프트웨어 인터럽트)

    • 주로 프로그램 내부에서 잘못된 명ㄹ여 또는 잘못된 데이터 사용시 발생
      • 0으로 나눴을 때
      • 사용자 모드에서 허용되지 않는 명령 또는 공간 접근시 (커널모드에서만 접근 가능할 때)
      • 계산 결과가 Overflow/Underflow 날 때 (int- bit 넘어갈 때 등)
  • 외부 인터럽트 (또는 하드웨어 인터럽트)

    • 주로 하드웨어에서 발생되는 이벤트 (프로그램 외부)
      • 전원 이상
      • 기계 문제
      • 키보드등 IO 관련 이벤트
      • Timer 이벤트

시스템 콜 인터럽트

  • 시스템 콜 실행을 위해서는 강제로 코드에(예: open()) 인터럽트 명령을 넣어, CPU에게 실행시켜야 한다
  • 시스템 콜 실제 코드
    • eax 레지스터에 시스템 콜 번호를 넣고,
    • ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고,
    • 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌.

(자세히..) CPU가 시스템 콜 인터럽트를 받아서 하는 일은,

  • 시스템 콜 인터럽트 명령을 호출하면서 0x80값을 넘겨줌
    i. CPU는 사용자 모드를 커널 모드로 변경 시켜줌
    👉 <int>라는 <opcode>가 변경 역할을 해줌.

    ii. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행
    👉 번호에 맞는 주소 찾으면 그 주소에 있는 함수들을 실행
    인트럽트 번호 : 주소(코드) 🔸이렇게 매칭해준다
    예: 0x80 : system_call()
    ~주르륵~ 실행

    iii. system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템 콜 함수로 이동
    👉eax에는 시스템 콜 번호가 있다. 그럼 그 시스템 콜 번호에 해당하는 함수를 호출(call) 한다.
    시스템 콜 번호 : 함수 (call)

    👉시스템 콜 5번은 (open)이라는 시스템 콜이다. 사용자에서 쓰는 (open)이라는 시스템 콜 함수와 매칭이 되어 있는 커널 코드 안에 있는 sys_open함수를 호출하게 되어 있고, ebx에 있는 인자 값을 같이 넘겨주게 된다.

    iv. 해당 시스템 콜 함수 실행 후, 다시 커널 모드에서 사용자 모드로 변경하고, 다시 해당 프로세스 다음 코드 진행

사용자/커널 모드와 프로세스, 인터럽트

인터럽트와 IDT

  • 인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소가 기록되어 있다.

    • 어디에? IDT에 기록.
      👉 이벤트 (키보드, 마우스, 0으로 나누기 등등) 각각의 번호가 있다. 그 번호에 따라서 실행 코드가 IDT에 써져있다. 즉, 매핑이 되어 있다.
      이벤트 번호 : 실행코드의 주소(함수)

    • 언제? 컴퓨터 부팅시 운영체제가 테이블을 기록한다.

    • 어떤 코드? 운영체제 내부 코드 (커널모드/커널영역)

인터럽트와 프로세스

  1. 프로세스 실행 중 인터럽트 발생
  2. 현 프로세스 실행 중단
  3. 인털버트 처리 함수 실행 (운영체제)
  4. 현 프로세스 재실행

post-custom-banner

0개의 댓글