[운영체제] 시스템 콜

Letmegooutside·2022년 1월 10일
0

운영체제

목록 보기
6/16

시스템 콜 (System Call)

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

운영체제는 커널모드와 사용자모드로 나뉘어서 구동된다.
운영체제에서 프로그램이 구동되는데 있어 많은 부분이 커널 모드를 사용한다.
시스템 콜은 이러한 커널 영역의 기능을 사용자 모드에서 사용할 수 있게 해준다.

해커가 악의적으로 시스템 콜을 사용하거나, 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게나 함수를 호출했을 경우 시스템 전체를 망가트릴 수도 있기 때문에 이러한 명령어들은 커널 모드에서만 실행될 수 있도록 설계되었다.

이중 동작 모드 (Dual-Mode Operation)

운영체제가 두 개의 독립된 동작 모드인 사용자 모드(User Mode)커널 모드(Kernel Mode)로 돌아가는 것을 말한다.

하드웨어에 모드 비트라는 것이 있는데 이 모드비트가 0이면 커널 모드, 1이면 사용자 모드이다.
최초 부팅 시 하드웨어는 커널 모드에서 시작해서 운영체제가 올라오고, 여기서부터 사용자모드가 시작된다.
인터럽트 또는 트랩이 발생할 때 마다 하드웨어는 모드 비트를 0으로 바꾸고 커널 모드로 전환한다.

  • 커널 모드
    프로그램 카운터(CPU 레지스터로 실행될 다음 명령어의 주소를 가지고 있다.)가 운영체제가 존재하는 부분을 가리키고 있다면, 현재 운영체제의 코드를 수행중이며 이를 CPU가 커널 모드에서 수행중이라고 한다.
    시스템 자원이나 하드웨어 직접적으로 접근하여 컨트롤 한다.

  • 사용자 모드
    프로그램 카운터가 사용자 프로그램이 존재하는 메모리 위치를 가리킬 경우, 사용자 프로그램을 수행중이며 이를 CPU가 사용자 모드에서 수행 중이라고 한다.
    일반 응용 프로그램이 동작하는 비특권 모드로 시스템의 자원이나 하드웨어를 직접적으로 컨트롤 할 수 없으며 이를 위해서는 시스템 콜을 사용해야 한다.

시스템 콜 처리

open() 시스템 콜을 호출했을 때 운영체제에서 처리가 이루어지는 과정이다.
시스템 콜 마다 번호가 할당되고, 시스템 콜 인터페이스는 이 번호들로 인덱싱된 테이블을 유지한다.

  1. 사용자 프로세스가 시스템 콜을 요청하면 제어가 커널로 넘어온다 (커널모드로 변경)
  2. 커널은 내부적으로 시스템 콜을 구분하기 위해 기능 별로 고유 번호를 할당하고, 그 번호에 해당하는 제어 루틴을 커널 내부에 정의한다.
  3. 커널은 요청 받은 시스템 콜에 대응하는 번호를 확인하고 그 번호에 맞는 서비스 루틴을 호출한다.
  4. 서비스 루틴을 모두 처리하고 나면 커널 모드에서 사용자 모드로 다시 전환된다.

운영체제에 파라미터를 전달하는 방법

필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때, 좀 더 많은 정보가 필요할 수 있다.
그러한 정보를 담은 파라미터를 운영체제에 전달하기 위해서는 대략 3 가지 정도의 방법이 있다.

  • 레지스터에 담아서 전달한다.
    파라미터 개수에 제한이 있다. CPU내의 레지스터 갯수보다 파라미터의 갯수가 많을 경우 사용할 수 없다.

  • 파라미터를 시스템 콜 마다 사용자가 자신의 프로그램 안에 별도의 메모리 공간을 할당해서 저장한 후, 그 주소를 레지스터에 담아서 전달한다.

  • 스택을 통해 전달한다.
    프로그램에 의해 스택에 넣어지고 운영체제에 의해 꺼내지고 사용되어진다.

시스템 콜의 유형

  • 프로세스 제어
    프로세스 생성, 적재, 실행, 대기, 메모리 할당 등

  • 파일 조작
    파일 생성, 삭제, 열기, 닫기, 읽기, 쓰기, 위치 변경 등

  • 장치 관리
    장치 요구 및 해제, 읽기, 쓰기 등

  • 정보 유지
    시간과 날짜의 설정 및 획득, 프로세스 파일, 장치 속성의 설정 및 획득 등

  • 통신
    통신 연결의 생성, 제거, 메시지의 송수신, 상태정보 전달 등




Reference
https://velog.io/@woo00oo/시스템-콜System-Call
https://fjvbn2003.tistory.com/306
https://limjunho.github.io/2021/05/11/SystemCall.html

0개의 댓글