[2023.03.29] Daily Posting

HeeJun·2023년 3월 29일
0

Operating System

목록 보기
7/9

이 블로그의 목적은 학습한 내용의 정리와 더 나아가 다양한 기술들에 대한 정리와 정보 공유가 목적입니다.

혹시 글의 내용 중 틀린 부분이 있다면 댓글 남겨주세요!!!

시스템 콜(System Call)

오늘 포스팅 내용은 시스템 콜에 관한 내용이다.

우리가 사용하는 PC에서 CPU는 사용자 애플리케이션(User Application)에 의한 시스템 손상을 방지하기 위해 2가지 CPU 모드를 제공한다.

CPU에 존재하는 Mode bit를 통해 CPU 모드를 구분하며 0은 커널 모드(Kernel Mode), 1은 사용자 모드(User Mode)를 나타낸다.

Kernel Mode는 Superviosr Mode라고도 불리우며 운영체제의 프로세스를 실행하고, User Mode는 사용자 프로세스를 실행한다.

사용자 모드(User Mode)

  • 사용자 모드에서는 사용자 애플리케이션 프로세스가 실행된다. 사용자가 접근할 수 있는 영역이 제한되어 있기에 해당 모드에서는 시스템 자원(하드웨어)에 직접 접근할 수 없다
  • 사용자 모드에서 시스템 자원의 접근을 위해 System Call을 사용한다

커널 모드(Kernel Mode)

  • 운영체제가 CPU를 사용하는 모드이다
  • System Call을 통해 커널 모드로 전환이 되면 운영체제는 하드웨어를 제어하는 명령어를 실행한다
  • 커널 모드에서만 실행 가능한 Privileged Instructions은 사용자 모드에서 실행하면 exception이 발생한다.

시스템 콜(System Call)

  • 운영체제의 커널 서비스를 사용하기 위한 프로그래밍 인터페이스
  • 보통 System Call은 API를 통해 운영체제 서비스를 사용자 애플리케이션에 제공한다
  • System Call은 Trap의 한 종류로 볼 수 있다(그 이유는 아래 그림에서 System Call이 처리되는 과정으로 설명할 수 있다)
  • 아래의 그림은 System Call 중 하나인 read()를 처리하는 전반적인 과정이다

System Call 종류

  • System Call은 프로세스 제어, 파일 관리, 디바이스 관리, 정보 유지, 통신, 보호 6가지 영역으로 분류할 수 있다.
  1. 프로세스 제어(Process Control)
  • 프로세스 생성/제거
  • 프로세스 종료, 대기, 중지
  • 프로세스 적재, 실행
  • 프로세스 속성 get/set
  • 메모리 할당/해제
  1. 파일 관리(File Management)
  • 파일 생성/제거
  • 파일 열기/닫기, 읽기/쓰기, 위치 변경
  • 파일 속성 get/set
  1. 디바이스 관리(Device Management)
  • 장치 요청/해제
  • 장치 읽기/쓰기, 위치 변경
  • 장치 속성 get/set
  • 논리적으로 장치 연결 또는 분리
  1. 정보 유지(Information Maintenance)
  • 날짜 또는 시간 get/set
  • 시스템 날짜 get/set
  • 프로세스, 파일 또는 장치 속성 get/set
  1. 통신(Communication)
  • 통신 연결 생성/제거
  • 메세지 송신/수신
  • 상태 정보 전송
  • 원격 장치 연결/분리
  1. 보호(Protection)
  • 권한 get/set

    위의 그림은 Linux 기준 System Call 함수들이다 (Window는 함수명이 조금씩 다르다)

System Call & Library

  • System Call

    • 시스템 자원을 사용자가 사용할 수 있도록 만들어 놓은 함수들이며 호출할 경우 커널 모드로 전환되어 실행된다. return type은 대부분 int 타입이고 정상적으로 수행이 되면 0 이상의 값을, 오류가 발생하면 -1을 반환한다
  • Library Call

    • 문자열/입출력 등의 사용자가 많이 사용하는 기능들을 미리 함수로 만들어 놓은 것
    • 라이브러리 호출 시에 내부적으로 시스템 콜이 발생하지만 라이브러리 호출 자체는 사용자 모드에서 실행된다
    • 목적에 따라 다양한 종류의 return type을 갖으며 개발을 쉽게 하거나 시스템 콜의 호출을 최소화 하기 위해 제공된다
    • 예를 들어 파일 입출력 시에 System Call 함수인 read()와 write()를 호출하면 호출할 때마다 커널 모드로 전환되어 바로 파일에 read/write가 된다. 반면에 라이브러리 함수인 fread(), fwrite()의 경우에는 buffer를 사용해 내부적으로 한 번만 read(), write()를 호출하기 때문에 시스템 자원의 효율적인 사용과 접근 횟수를 줄일 수 있다.
    • 내부적으로 System Call을 감싸고 있다고 해서 wrapper 함수라고도 부른다
    • Windows API, POSIX API, Java API 등이 존재한다

위의 그림을 가지고 최종적으로 Library와 System Call이 동작하는 방식을 설명하겠다

  1. 라이브러리 함수 fork() 호출
  2. 라이브러리 함수 내부에서 시스템 콜 호출
  3. 해당 시스템 콜의 인덱스(2)를 CPU 레지스터에 저장
  4. 0x80 인터럽트 발생(동시에 커널 모드로 전환)
  5. IDT(Interrupt Desciptor Table)를 참조하여 System_call() 호출(동시에 3번에서 저장한 인덱스(2)를 System_call() 함수에 전달)
  6. sys_call_table을 참조해 인덱스에 맞는 sys_fork()를 호출
  7. 모든 수행이 끝나면 사용자 모드로 전환

이로써 System Call에 대한 포스팅을 마치고 다음 포스팅은 PCB(Process Control Block)과 Context Switching에 관한 내용을 다룰 예정이다.

3.30 ~ 3.31은 지방에 일이 생겨 지방에 내려가는 관계로 포스팅은 없을 예정이다.

profile
내가 작성한 코드 한 줄로 누군가를 편하게

0개의 댓글