ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 운영체제 3: 인터럽트 (Interrupt)
    CS기초/OS,HW 2021. 12. 28. 00:25
    728x90
    반응형

    인터럽트란?

     CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황 처리가 필요할 경우에 CPU에 알려서 처리하는 기술. 쉽게 말해서 CPU가 다른 장치와 커뮤니케이션을 할 수 있도록 하는 기술이다. 예를 들어 파일을 읽는 작업을 위해 blocking 상태로 빠진 프로세스가 있었다면, 파일을 다 읽었다는 메세지를 CPU에 전달함으로써 해당 프로세가 ready 상태로 전환되었음을 알리는 것이다. 또는 선점형 스케줄러에서 프로세스를 running상태에서 ready상태로 바꾸기 위해서도 이 기술이 이용된다.

    • CPU가 프로그램을 실행하는 도중 입출력 하드웨어 등 CPU외의 장치에서 예외(e.g. 0으로 3을 나눠라), 이슈 발생 또는 파일 처리가 끝남 → 해당 장치에서 운영체제에 이슈를 알림 → 운영체제는 이에 걸맞게 해당 프로세스의 상태를 변경함 (block → ready 또는 해당 프로세스 실행 중지 등)

     인터럽트는 특정 상황이 발생해야 작동하기 때문에 '이벤트'라고도 불린다.

     

    인터럽트 종류

    • 내부 인터럽트 (=소프트웨어 인터럽트)
      • 프로그램 내부에서 잘못된 명령 또는 데이터를 사용했을 때
        e.g. 0으로 나눴을 때, 사용자 모드에서 허용되지 않은 명령 또는 메모리의 공간 접근 시, 계산 결과가 overflow/ underflow(변수가 표현할 수 있는 비트의 범위를 벗어나는 것) 날 때
    • 외부 인터럽트 (=하드웨어 인터럽트)
      • 주로 하드웨어(프로그램 외부)에서 발생되는 이벤트
        e.g. 전원 이상, 기계문제, IO관련 이벤트, Timer 이벤트

    대표적인 인터럽트의 예

    1. Divide-by-Zero Interrupt

     특정 숫자를 0으로 나누려고 할 때 OS에서 인터럽트를 발생시키고 해당 프로세스를 종료한다.

    2. Timer Interrupt

     하드웨어로부터 프로세스를 교체하기로 정해놓은 시간 주기마다 타이머 인터럽트를 운영체제에 알려줌.

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

     입출력 요청을 알려줌

     

    인터럽트 내부 동작

    인터럽트는 이벤트마다 각각 번호와 실행코드(또는 함수)를 가리키는 주소로 IDT(Interrupt Descriptor Table)에 기록되어 있다. 이 IDT는 컴퓨터를 부팅할 때 운영체제가 기록한다. 이렇게 기록된 코드들은 시스템 내부 코드이기 때문에 커널 모드에서 실행된다. 

    리눅스에서 IDT는 하기와 같이 기록되어 있다.

    • 0~31: 예외상황 인터럽트 (내부/ 소프트웨어 인터럽트)
    • 32~47: 하드웨어 인터럽트 (주변 장치의 종류 및 개수에 따라 변경 가능)
    • 128: 시스템 콜

    시스템 콜 인터럽트

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

    1. eax레지스터에 시스템 콜 번호를 넣고
    2. ebx레지스터에 시스템 콜의 인자값을 넣은 후
    3. 소프트웨어 인터럽트 명령을 호출하면서 0x80이라는 값을 넘겨준다. 여기서 0x80은 시스템 콜 인터럽트의 번호다 (0x80을 10진수로 바꾸면 128이다)
    4. CPU가 0x80이라는 인터럽트를 받으면 사용자 모드를 커널 모드로 바꿔준 후 IDT에서 0x80에 해당하는 주소를 찾아서 해당 주소의 함수를 실행함
    5. system_call() 함수에서 eax로부터 시스템 콜 번호를 찾아서 해당 번호의 시스템 콜 함수로 이동
    6. 해당 시스템 콜 함수 실행 후 다시 커널 모드에서 사용자 모드로 변경하고 이어서 프로세스 진행
    728x90
    반응형

    댓글