취업 준비/운영체제

인터럽트

openingsound 2020. 12. 30. 19:47

이벤트와 인터럽트(Interrupt)

  • CPU가 프로그램을 실행하고 있을 때, IO등의 장치나 예외 상황이 발생하여 처리가 필요한 경우에 CPU가 해당 처리를 할 수 있도록 CPU에 알려줘야 함
  • CPU가 실행하는 명령은 하나인데 다른 장치와 어떻게 커뮤니케이션을 할까?
    • 파일읽기를 하는동안 프로세스가 block상태가 되는데 읽기가 끝나면 인터럽트가 알려준다.
  • 프로세스 running중에 스케쥴러가 이를 중단을 시키는 선점형 스케쥴러를 구현하기 위해 필요하다.
  • 이벤트가 발생하고 처리하는것은 운영체제가 한다.
  • ex
    • 입출력 하드웨어 등의 장치 이슈 발생
      • 파일 처리가 끝났다는것을 운영체제에 알려주기
      • 운영체제는 해당 프로세스를 block state에서 ready state로 프로세스 상태 변경하기
    • 에외 상황
      • 0으로 나누기
        • CPU가 실행하는 순간 문제가 생김 (프로세스가 멈춘다) 프로세스를 죽여야 한다.
      • 운영체제가 해당 프로세스 실행 중지/ 에러 표시

주요 인터럽트

  • 0으로 나누는 코드 실행시
    • 프로세스를 끄고 에러 표시를 보여준다.
    • Floating point exception (core dumped) 에러를 보여준다.
  • 타이머 인터럽트
    • 하드웨어로 부터 일정 시간마다 타이머 인터럽트를 운영체제에 알려준다.
    • 선점형 스케쥴러를 위해 필요하다.
  • IO(입출력) 인터럽트
    • 프린터, 키보드, 마우스, 저장매체(HDD, SSD)
  • 내부인터럽트 & 외부 인터럽트
    • 내부 인터럽트(소프트웨어 인터럽트)
      • 프로그램 내부에서 발생
        • 0으로 나누기
        • 사용자 모드에서 허용되지 않은 명령 or 공간 접근(포인터 접근 실수)
        • 계산결과 Overflow/ Underflow
    • 외부 인터럽트(하드웨어 인터럽트)
      • 주로 하드웨어에서 발생하는 이벤트 (프로그램 외부)
        • 전원 이상
        • 기계 문제
        • IO 관련 이벤트
        • Timer 이벤트

인터럽트 내부 동작

  • 시스템 콜 인터럽트

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

    • 실제 코드

      • eax 레지스터에 시스템 콜 번호를 넣고
      • ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고
      • 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줌 (시스템 콜에 해당하는 번호)
      • 1
        2
        3
        4
        5
        6
        mov eax, 1 //시스템콜 번호 system call number (sys_exit)
        mov ebx, 0 // 인자 file descriptor
        int 0x80 // 소프트웨어 인터럽트 명령 . CPU 명령어  call kernel
         
        > int 는 OP code이다. (연산 종류)
        > 0x80 : Interrupt Number (systemcall의 인터럽트 번호가 0x80이다.)
        cs
  1. 시스템 콜 인터럽트 명령을 호출하며


- 0x80 → CPU는 User Mode를 Kernel Mode로 바꿔준다.
2. IDT( Interrupt Descriptor Table)에서 0x80에 해당하는 주소(함수)를 찾아서 실행함


- system_call()함수가 있다.
- 이벤트 번호 : 실행코드의 주소 (함수)
- eax 에 담긴 systemcall number에 매칭되는 kernel function을 호출한다.
3. kernel function(system call) 수행 후

  1. 해당 시스템콜 함수 실행후, 다시 커널 모드 → 사용자 모드 , 다시 해당 프로세스 다음 코드 진행
  • 인터럽트와 IDT

    • 인터럽트는 미리 정의되어 각각 번호(이벤트를 발생 시키는)와 실행 코드를 가리키는 주소가 기록되어 있다.
      • IDT(어디)에 컴퓨터 부팅시(언제) 운영체제가 운영체제 내부코드를(커널 영역) 기록한다.
    • ex
      • 항상 인터럽트 발생시 , IDT를 확인
      • 커널 모드로 변경
      • 시스템콜 인터럽트 명령은 0x80 번호가 미리 정의
      • 인터럽트 0x80에 해당하는 운영체제 코드는 system_call()이라는 함수
      • 즉, IDT에는 0x80 → system_call()와 같은 정보가 기록되어 있음
    • 리눅스 ex
      • 0~31 : 예외상황(내부/소프트웨어 인터럽트)
      • 32~47 : 하드웨어 인터럽트 (변경가능)
      • 128 : 시스템 콜
  • 인터럽트 우선순위

    • 여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행중 인터럽트가 발생할 경우 우선 순위를 따져서 처리한다.
    • 전원 이상 → 기계 착오 → 외부 신호 → 입출력 → 명령어 잘못 → 프로그램 검사 → SVC (SuperVisor Call)
    • 일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선 순위가 높고 내부보다는 외부 인터럽트의 우선 순위가 더 높다.