[운영체제] 인터럽트-2

Yeongsan Son·2021년 6월 27일
0

시스템 콜 인터럽트에 관하여 알아보자.

시스템 콜이 무엇인가? 시스템 콜은 운영 체제의 커널이 제공하는 서비스를 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스를 말한다.

  • 응용 프로그램이 컴퓨터의 외부 매체에 접근하는 과정

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

실제 코드에서 시스템 콜의 실행 과정에 대해서 알아보자.

  • eax 레지스터에 시스템 콜 번호를 넣는다
  • ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣는다
  • 소프트웨어 인터럽트 명령을 호출하면서 0x80 값을 넘긴다
    • 어떤 파일을 읽으라는 open 함수에 read only 인자 값
    • 0x80은 시스템 콜에 해당하는 번호
mov eax, 1 // 시스템 콜 번호
mov ebx, 0  // 인자
// CPU op code / 인터럽트 번호
int 0x80 // 소프트웨어 인터럽트 명령

시스템콜 인터럽트 명령을 호출하면 이와 같이 0x80값을 CPU로 넘기면 CPU는 운영체제를 사용자 모드에서 커널 모드로 변경해준다.

그리고 IDT(Interrupt Descriptor Table)라는 인터럽트의 번호가 매핑이 되어 있는 테이블에서 0x80에 해당하는 주소(함수)를 찾아서 실행하게 된다.

  • system_call() 함수가 매핑

이후에 system_call() 함수에서 eax(시스템콜 번호) 인자를 통해서 시스템 콜 번호를 찾아서 해당 번호에 맞는 시스템콜 함수를 실행하고 다시 커널 모드에서 사용자 모드로 변경하고 응용 프로그램의 다음 코드를 실행하게 된다.

  • 첫번째 파란 화살표에서

    • 시스템 콜 호출
      • int 0x80
      • eax 시스템 콜 번호
      • ebx
    • 커널 모드로 변경
    • 시스템 콜에 해당하는 함수 실행
  • 두 번째 파란 화살표에서

    • 다시 유저 모드로 변경
    • 프로세스 A가 실행
  • 세 번째 파란 화살표에서

    • 프로세스 A가 종료
    • 타이머 인터럽트가 실행
    • 커널 모드로 변경
    • 스케쥴러 실행
  • 네 번째 파란 화살표에서

    • 스케쥴러가 다음 실행 프로세스인 B를 호출
    • 사용자 모드로 변경 후 프로세스 B 실행

인터럽트와 IDT

  • 인터럽트는 미리 정의되어 각각 번호와 실행 코드를 가리키는 주소를 기록
    • IDT에 기록
      • 이벤트 번호와 실행 코드의 주소(키-밸류)
    • 컴퓨터 부팅 시에 운영체제가 기록
    • 운영체제 내부 코드
  • 리눅스 IDT 인터럽트 예
    • 0 ~ 31 : 예외상황 인터럽트(내부/소프트웨어 인터럽트)
    • 32 ~ 47 : 하드웨어 인터럽트
    • 128 : 시스템콜 (0x80)

인터럽트와 프로세스

  1. 프로세스 실행 중 인터럽트가 발생
  2. 현재 프로세스 실행 중단 => IDT에서 인터럽트 번호 검색
  3. 커널 모드 변환 => 인터럽트 처리 함수 실행
  4. 사용자 모드 변환 => 중단된 프로세스 재실행

인터럽트와 스케쥴러

선점형 스케쥴러에서는 수시로 타이머 인터럽트가 발생하기 때문에 운영체제가 타이머 인터럽트 발생 횟수를 기억해서 5번 타이머 인터럽트를 발생하면 현재 실행 중인 프로세스를 다른 프로세스로 변경해 실행한다.

profile
매몰되지 않는 개발자가 되자

0개의 댓글