Home System Call
Post
Cancel

System Call

SystemCall


  • system call은 커널에게 I/O 작업을 요청하는 것이다.
  • 하드웨어의 mode bit 를 사용하여 커널모드와 유저모드로 나눈다.
    • cpu의 mode bit 가 0이면 kernel mode 이며, cpu는 어떤 메모리의 영역이든 접근할 수 있다.
    • mode bit이 1이면 user mode로 cpu는 파일에 영향을 주는 명령은 사용이 불가능하다.

특권 명령과 일반 명령이라도 부른다.



  • mode bit을 검사하는 과정을 알아보자.
    1. 우선 PC레지스터로 명령어의 주소를 보낸다.
      • 이때 MMU를 통과한다.
      • 요청된 명령어의 주소가 로컬 범위 밖이라면 cpu를 빼앗긴다.
    2. Decode 단계에서 명령어를 파악 및 검사한다.
      • 만약 권한을 넘어서면 빼앗긴다.

사용자 입장 / Source code


컴파일

  • 우리가 코드를 짤 때는 I/O 코드를 짠다.
  • 사실 컴파일 과정에서 컴파일러가 chmodk 명령을 집어 넣는다.
  • 그리고 I/O statements는 바이너리( a.out )에서 보이지 않고 커널에서 존재하게 된다.

    change mode (protection) kernel

실행

  • chmodk는 privilieged 명령이다.
    • 즉 user_mode에서 실행이 불가능하다.
  • 이때 cpu 뺏기며 HW trap이 걸리게 된다.
    • Cpu state vector를 저장해둔다.
  • trap handler가 작동하며 kernel mode로 바뀐다.
    • trap handler는 trap을 일으킨 정보를 통해 kernel 함수를 실행한다.
  • 이후 cpu 모드를 user_mode로 돌리고, 저장된 state vector 복구한다.
  • interrupted 된 address로 복귀한다,



  • 모든 프로그램은 두 개의 스택이 필요하다.
    • 커널용, 유저용
    • 함수 호출 시 사용된다.

System call 흐름 정리


System call 자세히…


system call 흐름

  1. printf를 하면 라이브러리로 달려간다.
  2. 라이브러리에서 system call wrapper 함수를 부름 ( write(2) )

  • write( ) 에서 system call number를 넘김, 그리고 trap을 발생시킴
    • system call number는 정해져 있다. 컴파일러마다 다르다.

    여기까지 컴파일러 / 이후 OS

  • sys_call()에서 number를 이용해 system call table에서 sys_write( )를 찾아 실행함

정보는 어떻게 교환하는가

  • kernel 모드로 변경되면 이때 발생하는 I/O 정보는 어떻게 user 에게 전달 될까?
  • kernel 은 user와 달리 모든 메모리에 접근 할 수 있다.
    • 즉 kernel은 user의 정보를 얻거나 전달할 수 있다.
  • 다음과 같은 함수들을 통해 구현된다.

This post is licensed under CC BY 4.0 by the author.