줘이리의 인생적기

인터럽트 본문

공부/운영체제

인터럽트

줘이리 2021. 11. 10. 23:00
728x90

인터럽트란

CPU가 프로그램을 실행하고 있을 때, 여러 이유로 인하여 예외상황이 발생하여 CPU에 알려 처리하는 기술

 

인터럽트가 필요한 상황

1. 선점형 스케쥴러에서 running중인 프로세스를 중단시키고, 다른 프로세스를 교체해야 하는 상황이 있다. 이때 스케쥴러 코드가 실행되어 현재 running중인 프로세스를 중지시켜야 한다.

 

2. I/O device와의 소통 중 데이터 처리 완료 시에 프로세스를 깨워야 하는 상황이 있다.

(파일 처리가 끝났다는 것을 운영체제에 알려주어 운영체제가 해당 프로세스를 block state를 ready state로 변경)

 

3. 예외 상황이 발생한 경우 CPU가 해당 상황을 처리해야 하는 상황이 있다.

(0으로 나누는 게산이 발생하여 예외상황을 운영체제에 알려주어 운영체제가 해당 프로세스 실행 중지 or 에러 표시)

 

 

 

인터럽트 종류

내부 인터럽트(=소프트웨어 인터럽트) : 주로 프로그램 내부에서 잘못된 명령 or 잘못된 데이터 사용 시 발생

  - 0으로 나누었을 때

  - 사용자 모드에서 허용되지 않은 명령 or 공간 접근 시에

  - 계산 결과가 overflow or underflow 시에

 

외부 인터럽트(=하드웨어 인터럽트) : 주로 하드웨어에서 발생

   - 전원 이상

   - 기계 문제

   - 키보드 등 I/O device 관련 이벤트

   - Timer 이벤트

 

 

시스템 콜 인터럽트

시스템콜 실행을 하려면 강제로 인터럽트 명령을 넣어 CPU에게 실행시켜야 한다.

 1. eax 레지스터에 해당하는 kernel function 시스템 콜 번호 넣기

 2. ebx 레지스터에 시스템 콜에 해당하는 인자 값 넣기

 3. 소프트웨어 인터럽트 명령을 호출하면서 0x80 값 넘겨주기

   3-1. CPU는 사용자 모드를 커널 모드로 바꿔줌

   3-2. IDT(Interrupt Descriptor Table)에서 0x80에 해당하는 주소를 찾아서 실행

   3-3. 시스템 콜 함수에서 eax에 해당하는 번호를 찾아 시스템 콜 함수로 이동 

   3-4. 해당 시스템콜 함수 실행 후, 다시 사용자 모드로 변경하고 해당 프로세스 다음 코드 실행

 

 

시스템콜 인터럽트 발생 후 스케쥴러 타이머 인터럽트 발생을 도식화하면 아래와 같다.

 

 

IDT(Interrupt Descriptor Table)

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

운영체제 내부 코드이며, 컴퓨터 부팅 시에 운영체제가 기록한다.

인터럽트 발생 시 항상 IDT를 확인하며, 시스템 콜은 0x80번호로 미리정의되어 있다.

 

리눅스 같은 경우는 아래와 같이 정의되어 있다.

0~31는 예외상황 인터럽트

32~47은 하드웨어 인터럽트(주변장치 갯수에 따라 변경)

128은 시스템 콜