본문 바로가기
야미스터디/OS

[OS] 시스템 콜 (System Call) 📌

by 의정부핵꿀밤 2022. 8. 24.
728x90

https://yummy0102.tistory.com/484

 

[쉬운코드] 인터럽트와 시스템 콜

https://www.youtube.com/watch?v=v30ilCpITnY 위 영상을 보며 공부한 내용을 정리한 글입니다! 🎭 User mode & Kernel mode 1) User mode 우리가 개발하는 프로그램은 일반적으로 User mode에서 실행된다 2) User..

yummy0102.tistory.com

우선 시스템 콜의 이해도를 높이기 위해 유튜브 영상을 통해 공부했다!


🖐 들어가기 전에

  • 운영체제는 인터럽트 구동식이다
  • 즉, 인터럽트가 발생하여 신호를 보내는 구조이다
  • 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라간다면 한정된 메모리 공간의 낭비가 심하다
  • 따라서 항상 필요한 부분만을 전원이 켜질 때 메모리에 올리고 그렇지 않은 부분은 필요할 때 메모리에 올리게 된다
  • 이 때 항상 메모리에 상주하는 운영체제의 부분을 커널이라고 한다
  • POSIX : 이식 가능 운영체제 인터페이스

 

 

 

커널 (Kernel)

  • 파일 입출력, 프로세스 관리 등과 같이 운영체제의 기능을 담당한다
  • 그러나 일반 사용자(사용자 모드)는 커널에 접근할 수 없기 때문에 원칙적으로 파일 입출력, 프로세스 생성 등 커널의 기능을 사용하지 못한다
  • 커널의 기능을 사용하기 위해 운영체제에서 시스템 콜(system call)을 제공한다

 

 

커널 모드 (Kernel mode)

  • 프로세스의 특권 레벨로 프로세서의 모든 명령을 처리하며 시스템의 자원이나 하드웨어를 직접적으로 엑세스하여 컨트롤할 수 있는 모드
  • 실제 장치 드라이버나 운영체제 프로그램이 구동하는 모드

 

 

사용자 모드 (User mode)

  • 일반 응용 프로그램이 동작하는 비특권 모드
  • 시스템의 자원이나 하드웨어를 직접적으로 컨트롤할 수 없으며, 이를 하기 위해서는 System call (시스템 콜)을 사용해야 한다

 

 

 

 


시스템 콜 (System Call)

  • 사용자와 커널 사이의 통로
  • 운영체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
  • 시스템 콜은 위와 같은 커널 영역의 기능을 사용자 모드(User mode)가 사용 가능하게 한다
    • 시스템 콜은 커널과 사용자 사이의 인터페이스 역할을 하는 것으로 쉘(Shell)에서 명령어나 서브 루틴 형식으로 운영체제의 기능을 호출할 수 있다
    • 즉, 사용자가 직접 커널에 접근을 할 수 없기 때문에 시스템 콜을 활용해야 한다
    • 보통 시스템 콜을 사용하기보다 해당 시스템 콜을 사용해서 만든 각 언어별 라이브러리(API)를 사용한다
    • 이 때 API는 운영체제의 기능을 호출하는 함수이다
  • 즉, 사용자 프로세스가 소프트웨어 인터럽트를 통해 커널을 이용하기 위한 서비스를 요청하는 하나의 방법이다
  • System call은 내부 인터럽트(소프트웨어 인터럽트, trap)의 한 종류로 볼 수 있다

 

 

 

 

System Call의 목적

  • 우리가 일반적으로 사용하는 프로그램은 '응용 프로그램'이다
  • 유저레벨의 프로그램은 유저레벨의 함수들만으로는 많은 기능을 구현하기 힘들다
  • 따라서 커널의 도움을 반드시 받아야 한다
  • 커널(kernel)에 관련된 것은 커널 모드로 전환한 후에야 해당 작업을 수행할 권한이 생긴다
  • 커널 모드를 통한 작업은 반드시 시스템 콜을 통해 수행하도록 되어 있다
  • 시스템 콜은 추상화된 하드웨어 인터페이스(커널의 기능)를 유저 프로세스에게 제공한다
  • 시스템의 보안과 안전성을 보장한다
  • 가상화된 유저 프로세스와 시스템이 소통할 수 있는 유일하고 공통적인 소통 수단이다
  • 즉, 커널의 기능을 사용하기 위해 운영체제에서 제공하는 인터페이스이다!

 

 

 

 

 

System Call의 이해

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

 

 

 

 

System Call의 기능

  • 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 한다
  • 시스템 호출 시 사용자 모드에서 커널 모드로 변경된다
  • 커널에서 시스템 호출을 처리하면 커널 모드에서 사용자 모드로 돌아가 작업을 계속 진행한다

 

 

 

System Call 호출 방식

1. 쉘(Shell)

  • 운영체제는 쉘을 통해서 사용자 인터페이스를 제공한다
  • 즉, 쉘을 사용자가 운영체제 기능과 서비스를 조작할 수 있도록 인터페이스를 제공하는 프로그램이다
  • 쉘은 터미널 환경(CLI)와 GUI 환경, 두 종류로 나뉜다

 

2. API (Application Programming Interface)

  • 운영체제는 사용자 뿐만 아니라 응용프로그램을 위해서도 인터페이스를 제공한다
  • 응용프로그램에서 프로그래밍 언어를 통해 운영체제에 무언가를 요청할 수 있기 때문에 API라는 형태로 응용 프로그램을 위한 인터페이스를 제공해준다
  • API는 함수로 제공된다 (ex. C언어의 open() 함수)
  • 보통은 종류별로 묶어 라이브러리 형태로 제공한다
  • API는 각 언어별 운영체제 기능 호출 인터페이스 함수이다

 

 

 

System Call의 동작

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

 

 

 

System Call의 동작 순서

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

 

 

 

 

 

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로 반환된다

 

 

 

System Call의 매개변수

필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때 좀 더 많은 정보가 필요할 수 있다

이러한 정보가 담긴 매개변수를 운영체제에 전달하는 방법은 다음과 같다

  1. 레지스터를 통한 전송
    • 매개변수를 CPU 레지스터 내에 전달한다
    • 이 경우에 매개변수의 개수가 CPU 내의 총 레지스터 개수보다 많을 수 있다
    • 매개변수가 레지스터로 직접 전달되지만, 레지스터 크기보다 더 많은 매개변수가 존재하므로 좋지 않은 방법이다
  2. 블록 or 테이블을 통한 전송
    • 매개변수를 메모리 내의 블록이나 테이블에 저장하고 해당 메모리의 주소가 레지스터에 전달된다
  3. 스택을 통한 전송
    • 매개변수는 프로그램에 의해 스택(stack)으로 전달(push)될 수 있다
    • 매개변수는 프로그램에 의해 스택에 넣어지고 운영체제에 의해 꺼내진다

 

2, 3번의 경우 전달되는 매개변수의 개수나 길이에 제한이 없기 때문에 몇몇 운영체제에서 선호하는 방식이다

 

 

 

 

 

System Call 유형

실제 UNIX System Calls

  1. 프로세스 제어 (Process Control)
    • fork()
    • exit()
    • wait()
    • 끝내기(end), 중지(abort)
    • 적재(load), 실행(execute)
    • 프로세스 생성(create process)
    • 프로세스 속성 획득과 설정(get process attribute and set process attribute)
    • 시간 대기(wait time)
    • 사건 대기(wait event)
    • 사건을 알림(signal event)
    • 메모리 할당 및 해제 : malloc, free
  2. 파일 조작 (File Manipulation)
    • open()
    • read()
    • write()
    • close()
    • 파일 생성(create file), 파일 삭제(delete file)
    • 열기(open), 닫기(close)
    • 읽기(read), 쓰기(write), 위치 변경(reposition)
    • 파일 속성 획득 및 설정(get file attribute and set file attribute)
  3. 장치 관리 (Device Management)
    • ioctl()
    • read()
    • write()
    • 장치를 요구(request devices), 장치를 방출release device)
    • 읽기, 쓰기, 위치 변경
    • 장치 속성 획득, 장치 속성 설정
    • 장치의 논리적 부착(attach) 또는 분리(detach)
  4. 정보 유지 (Information Maintenace)
    • getpid()
    • alarm()
    • sleep()
    • 시간과 날짜의 설정과 획득(time)
    • 시스템 데이터의 설정과 획득(date)
    • 프로세스 파일, 장치 속성의 획득 및 설정
  5. 통신 (Communication)
    • pipe()
    • shm_open()
    • mmap()
    • 통신 연결의 생성, 제거
    • 메시지의 송신, 수신
    • 상태 정보 전달
    • 원격 장치의 부착 및 분리
  6. 보호 (Pretection)
    • chmod()
    • umask()
    • chown()
    • 권한(Permission) 설정

 


💡 정리

  • 운영체제는 사용자 인터페이스를 제공하기 위해 쉘 프로그램을 제공한다
  • 운영체제는 응용 프로그램이 운영체제 기능을 요청할 수 있도록 시스템 콜을 제공한다
  • 보통 시스템 콜을 직접 사용하기보다는 해당 시스템 콜을 사용해서 만든 각 언어별 라이브러리 API를 사용한다
  • API는 각 언어별 운영체제 기능 호출 인터페이스 함수이며, 시스템 콜은 운영체제 기능을 호출하는 함수이다

 

 

 


참고)

https://luckyyowu.tistory.com/133

 

운영체제 04 : 시스템 콜 (시스템 호출, System Call)

참고 도서는 'Operating System Concepts 8th' 입니다. (포스팅 하단부 참고) 개인공부 후 자료를 남기기 위한 목적으로 포스팅합니다. 내용 상에 오류가 있을 수 있습니다. 2.3 시스템 호출 (System Calls) 정

luckyyowu.tistory.com

https://gona.tistory.com/37

 

시스템 콜(System Call)

시스템 콜이 필요한 이유 커널(kernel) 파일 입출력, 프로세스 관리 등과 같이 운영체제의 기능을 담당 일반 사용자(사용자 모드)는 커널에 접근 할 수 없기 때문에 원칙적으로는 파일 입출력, 프

gona.tistory.com

https://choiyeonho903.tistory.com/58

 

시스템 콜 (System Call)

시스템 콜 (System Calls) 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스. 즉, 사용자와 커널 사이의 통로 1. 시스템 콜의 목적 추상화

choiyeonho903.tistory.com

https://luckyyowu.tistory.com/133

 

운영체제 04 : 시스템 콜 (시스템 호출, System Call)

참고 도서는 'Operating System Concepts 8th' 입니다. (포스팅 하단부 참고) 개인공부 후 자료를 남기기 위한 목적으로 포스팅합니다. 내용 상에 오류가 있을 수 있습니다. 2.3 시스템 호출 (System Calls) 정

luckyyowu.tistory.com

https://limjunho.github.io/2021/05/11/SystemCall.html

 

시스템 콜(System Call) - limjunho

Summry 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많으 부분이 커널 모드를 사용한다. 시스템 콜은 이러한 커널 영역의 기

limjunho.github.io

 

728x90

'야미스터디 > OS' 카테고리의 다른 글

[OS] 커널 (Kernel) 📌  (0) 2022.08.26
[OS] 인터럽트와 시스템 콜  (0) 2022.08.24
[OS] Critical Section 📌  (0) 2022.08.05
[OS] 세마포어와 뮤텍스 📌  (0) 2022.07.24
[OS] 교착 상태 (Dead Lock) 📌  (0) 2022.07.21

댓글