이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
✅ Dual-mode operation
저번 포스팅에서 Interrupt에 대해 조금 자세히 알아보았다. 오늘 알아볼 system call도 결국 Interrupt의 일종이다.
🎯 Dual-mode operation이란?
System call에 대해 알아보기 전에, 우선 kernel에 대해 알아보자.
OS는 기본적으로 Dual-mode operation을 지원하는데, OS는 User mode와 Kernel mode를 지원한다.
Kernel mode는 system mode라고도 불리며, process가 kernel mode에서 돌아가고 있을 때, hardware 접근에 대해 제약이 없어진다. 즉, 특권 명령(Privileged)을 실행할 수 있는 mode 이다.
User mode는 사용자 프로그램에 대해 특권을 가지고 있지 않은(non-privileged) 모드이다. process가 user mode에서 돌아가고 있을 때, 프로세스는 hardware(CPU와 memory 등)에 대한 접근이 제한된다.
Kernel mode와 User mode는 mode bit를 통해, 해당 프로세스가 Kernel mode인지 User mode인지 구별한다.
mode bit가 1일 때에는 User mode이고, mode bit가 0이면 Kernel mode이다.
그렇다면 이 방법은 왜 사용하는 것일까?
이러한 방법을 사용하는 가장 주된 이유는 시스템을 보호하기 위해서이다.
시스템에 영향을 줄 수 있는 일부 명령을 `특권 명령(privileged instruction)`으로 지정하고 kernel mode일 때에만 실행할 수 있도록 한다.
이를 통해 권한이 있는 경우에만 특권 명령을 실행할 수 있게 하여, 권한이 없는 사용자에게는 시스템에 영향을 줄 수 있는 동작을 하지 못하게끔 보호한다.
🎯 User mode에서 Kernel mode로의 전환
(1) 프로세스가 실행 될 때에는 주로 user mode로 실행된다.
(2) 그러던 중, kernal의 기능이 필요해져 system call을 호출한다.
(3) trap 명령에 의해 kernel mode로 바꾼다. (mode bit을 0으로 변경)
(4) 요청한 system call을 실행
(5) 모든 일이 완료되었다면 user mode로 다시 바꾼다. (mode bit을 1로 변경)
✅ System call
🤔 System call이란?
시스템 호출 또는 시스템 콜(system call), 간단히 시스콜(syscall)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 보통 C나 C++과 같은 고급 언어로 작성된 프로그램들은 직접 시스템 호출을 사용할 수 없기 때문에 고급 API를 통해 시스템 호출에 접근하게 하는 방법이다.
- Wikipedia-
즉 System call은 user mode로 실행되고 있던 서비스가 kernel의 기능을 사용하고자할 때 이용하는 인터페이스이다.
Dual-mode operation에 대해 알아보며 privilege instruction(특권 명령)은 kernel mode일 때에만 사용 가능하다는 이야기를 했다.
사용자 프로세스는 기본적으로 User mode에서 실행되는데, 프로세스가 실행되는 도중 당연하게도 하드웨어의 자원에 대해 접근할 일이 생긴다.
⚠️ 문제는 이러한 operation들은 kernel mode에서만 가능하다는 것이다.
이 때, system call을 통해 프로세스를 kernel mode로 변경하여, 하드웨어의 자원과 관련된 기능을 사용할 수 있게 된다.
직접적으로 system call을 호출하여 사용하기 보다는 API 형식으로 지원하는 라이브러리를 통해 사용한다.
🤔 System call 또한 interrupt의 종류 중 하나이다!
System call은 Interrupt의 종류 중 하나이다.
Interrupt는 하드웨어 인터럽트와 소프트웨어 인터럽트로 나누어지며, 소프트웨어 인터럽트의 종류에는 Trap이 있다.
System call은 의도적으로 일으킨 예외인 Trap에 속한다.
🤔 System call의 일련의 처리 과정
- 실행되고 있던 process에서 system call이 발생하면 User mode에서 Kernel mode로 전환
- system call이 발생했을 때, Kernel에게 system call에 대한 정보를 전달
(Kernel 내에는 system call들을 기능 별로 고유 번호를 부여하고 그 번호에 맞는 제어 루틴을 정의했기 때문에, 전달받은 system call에 대응하는 서비스 루틴을 찾을 수 있음) - Kernel은 요청받은 system call에 대응하는 고유번호를 확인 및 대응하는 서비스 루틴 호출
- Kernel이 서비스 루틴을 처리한 이후, 다시 User mode로 전환
🤔 System call의 유형
system call은 크게 6가지의 종류로 분류할 수 있다.
- 프로세스 제어 (Process control)
- 파일 조작 (File manipulation)
- 장치 관리 (Device manipulation)
- 정보 유지 (Information maintenance)
- 통신 (Communication)
- 보호 (Protection)
✅ 참고 자료 & 링크
- https://dokhakdubini.tistory.com/438
- https://www.baeldung.com/cs/user-kernel-modes
- https://en.wikipedia.org/wiki/System_call
- https://velog.io/@chowisely/Operating-Systems-Interrupt-System-Call