본문 바로가기
OS(운영체제)

시스템 콜 (System Call)

by 걸어가는 신사 2021. 10. 21.

시스템 콜 (System Calls)

운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스.
즉, 사용자와 커널 사이의 통로

 

1. 시스템 콜의 목적

  • 추상화된 하드웨어 인터페이스를 유저 프로세스에게 제공한다.
  • 시스템의 보안과 안정성을 보장한다.
  • 가상화된 유저 프로세스와 시스템이 소통할 수 있는 유일하고 공통적인 소통수단

 

2. 시스템 콜의 이해

  • 우리는 그동안 표준 라이브러리 함수를 사용하였다.
  • 예를 들어 printf 함수를 사용 시에 우리는 입출력 장치를 이용해야 한다. 이때 반드시 OS 즉 커널의 도움이 필요하다.
    • 거의 모든 Program들은 user mode에서만 동작할 수 없다. 결국 OS의 service(kernel mode)가 필요하다.
  • printf 함수를 사용하면 내부적으로 시스템콜(write())를 이용해서 kernel에 도움받아서 리턴 받은 후 terminal에 출력한다. 

 

3. System Call의 동작

  • 운영체제가 제공하는 시스템 콜에 대한 연결고리 역할을 하는 시스템 콜 인터페이스를 제공한다.
  • 시스템 콜에는 번호가 할당되고 시스템 콜 인터페이스는 이 번호에 따라 색인되는 테이블을 유지한다.
  • 시스템 콜 인터페이스는 의도하는 시스템 콜을 부르고 시스템 콜의 상태와 반환 값을 돌려준다.
  • 사용자는 시스템 콜이 어떻게 구현되고 실행 중 무슨 작업을 하는지 알 필요가 없다.

 

4. System Call의 동작 (Linux)

  • 사용자 프로세스 -> 시스템 콜 호출 -> lib.a -> 0x80 인터럽트 발생 -> 커널에서 처리

  • user process에서 시스템 콜 호출 시
  • C 라이브러리에서 fork 시스템콜의 고유번호 '2'를 eax 레지스터에 저장한 후 0x80 인터럽트 발생
    • 0x80 인터럽트는 소프트웨어 인터럽트인 trap이다.
  • 인터럽트 발생시 "사용자 모드"(user mode)에서 "커널 모드"(kernel mode)로 전환된다.
  • 커널은 IDT에서 0x80 주소를 통해 인터럽트가 시스템 콜에 의해 발생된 것을 알게 된다.
    • IDT(Interrupt discriptor table) : trap에 대한 정보를 table로 가지고 있다.
  • system_call() 함수에서는 호출된 시스템 콜 번호와 레지스터들을 스택에 저장하고 올바른 시스템 콜 번호인지 검사 후 sys_call_table에서 시스템 콜 번호에 해당하는 함수를 호출한다.
  • 함수가 종료되면 user process로 반환된다.
반응형

댓글