시스템 콜이란 무엇인가?
시스템 콜(system call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
운영체제는 커널모드(Kernel Mode)와 사용자 모드(User Mode)로 나누어진다.
위 사진과 같이 프로그램이 실행되는 것에 있어 파일을 읽고 쓰기, 출력하기 같은 기능을 커널모드를 사용하여 실행한다.
운영체제는 다양한 유저의 요구사항에 맞춰 하드웨어를 직접적으로 관리한다.
하지만 유저가 직접적으로 하드웨어를 접근하면 치명적인 오류를 일으킬 수 있다.
이를 방지하기 위해 응용 프로그램은 운영체제가 제공하는 인터페이스를 통해서만 하드웨어를 사용할 수 있다.
이러한 인터페이스를 시스템 콜이라고 한다.
1. 우리가 사용하는 시스템 콜의 예시
- 파일 시스템 관련 시스템 콜 : 파일을 열거나 읽고 쓰고 닫기
- 프로세스 관리 시스템 콜 : 프로세스 생성 / 새로운 프로그램 실행 / 프로세스 종료
- 통신 관련 시스템 콜 : 소켓 생성 / 연결 요청/수락
- 메모리 관리 시스템 콜 : 동적 메모리 할당 및 해제
- 시간 및 날짜 관련 시스템 콜 : 현재 시간 가져오기
- 디바이스 관리 시스템 콜 : 장치로부터 데이터를 읽거나 쓰기
2. 시스템 콜 실행 과정
- 사용자 프로그램에서 시스템 콜 호출
- 사용자 프로그램이 운영 체제 기능을 요청하기 위해 해당 시스템 콜을 호출한다.
- 이 호출은 일반적으로 프로그래밍 언어의 함수 호출과 유사한 형태를 가지고 있다.
- 커널 모드로 전환
- 사용자 모드(user mode)에서 실행 중인 프로그램이 운영 체제의 권한이 필요한 기능을 호출하면, CPU는 커널 모드(kernel mode)로 전환된다.
- 이는 보안을 유지하기 위해 필요하다.
- 인터럽트 발생
- 사용자 프로그램이 시스템 콜을 호출하면, 인터럽트(Interrupt)가 발생하여 CPU의 제어를 운영 체제로 넘깁니다.
- 이는 사용자 모드에서 커널 모드로 전환하고, 이 과정에서 특별한 인터럽트 번호나 지정된 레지스터 값이 전달된다.
- 자세한건 이후 포스트에서.
- 시스템 콜 핸들러 실행
- 운영 체제는 해당 시스템 콜을 처리하기 위한 적절한 핸들러 함수를 실행한다.
- 이 핸들러 함수는 요청된 작업을 수행하고, 필요한 경우에는 다시 사용자 모드로 컨텍스트를 전환한.
- 작업 수행
- 시스템 콜 핸들러는 요청된 작업을 수행한다.
- 이는 파일을 읽거나 쓰는 것, 프로세스를 생성하는 것 등 다양하다.
- 결과 반환
- 작업이 완료되면, 결과가 사용자 프로그램에 반환됩니다.
- 이를 통해 프로그램은 계속 실행을 진행할 수 있다.
- 커널 모드에서 사용자 모드로 복귀
- 작업이 완료되고 결과가 반환되면, CPU는 다시 사용자 모드로 전환된다.
- 이후 프로그램은 원래의 실행 위치로 돌아가 계속 실행된다.
3. 시스템 콜 유형
시스템 콜은 주로 다음과 같은 네 가지 유형으로 구분된다.
- 프로세스 제어(System Calls for Process Control):
- 프로세스 생성, 종료, 프로세스 간 통신, 그리고 프로세스 스케줄링과 관련된 시스템 콜이 있다.
- 예시: fork(), exec(), exit(), wait(), kill()
- 파일 관리(System Calls for File Management):
- 파일 및 디렉토리를 생성, 열기, 읽기, 쓰기, 삭제하고 파일 속성을 조작하는 시스템 콜이 있다.
- 예시: open(), read(), write(), close(), mkdir(), rmdir()
- 장치 관리(System Calls for Device Management):
- 하드웨어 및 입출력 장치와 상호 작용하기 위한 시스템 콜이 있다.
- 예시: ioctl(), read(), write()
- 정보 관리(System Calls for Information Management):
- 운영 체제 및 시스템 정보에 접근하고 관리하는 시스템 콜이 있다.
- 예시: time(), getpid(), getuid(), getgid()
4. 운영체제의 Dual Mode
이중 동작 모드는 쉽게 말해 운영체제를 보호하기 위한 기법이다.
사용자와 운영체제는 시스템 자원을 공유하기 때문에, 사용자에게 제한을 두지 않으면 사용자가 메모리 내의 주요 운영체제 자원을 망가뜨릴 수도 있다.
이러한 점을 보호하기 위해 필요한 보호 장치가 이중 동작 모드(Dual Mode)이다.
위 그림을 보면 이중 동작 모드는 사용자 모드와 커널 모드로 구성되어 있다.
이들은 각각 사용자를 위한 동작과 운영체제를 위한 동작을 담당한다.
이 덕분에 사용자 모드에서는 불법적인 명령을 하지 못하게 한다.
중요성
만약 이중동작 모드가 없다면, 잘못된 사용자 프로그램이 데이터를 운영체제 부분에 덮어 기록하게 된다면?
그럼 운영체제가 날라가는거다.
그만큼 중요한 기능이다.
5. 시스템 콜 구분 방법
- 목적에 따른 구분:
- 프로세스 관리(System Calls for Process Management): 프로세스 생성, 종료, 스케줄링 등과 관련된 시스템 콜.
- 파일 관리(System Calls for File Management): 파일 및 디렉토리 관리, 파일 읽기 및 쓰기 등과 관련된 시스템 콜.
- 메모리 관리(System Calls for Memory Management): 동적 메모리 할당 및 해제 등과 관련된 시스템 콜.
- 장치 관리(System Calls for Device Management): 입출력 장치와의 상호 작용과 관련된 시스템 콜.
- 인터페이스에 따른 구분:
- 유저 레벨 시스템 콜(User-Level System Calls): 사용자 레벨에서 호출되는 시스템 콜. 이들은 직접 운영 체제의 커널에 접근하지 않고, 라이브러리 함수를 통해 호출됩니다.
- 커널 레벨 시스템 콜(Kernel-Level System Calls): 커널 내부에서 실행되는 시스템 콜. 이들은 사용자 프로세스가 운영 체제 커널에 직접 요청하는 것으로, 보안 및 권한 관리를 위해 커널 모드에서만 실행됩니다.
- 기능에 따른 구분:
- 입출력 관리(System Calls for I/O Management): 파일, 네트워크, 디바이스 등과의 입출력 관련 시스템 콜.
- 프로세스 제어(System Calls for Process Control): 프로세스 생성, 종료, 신호 처리 등과 관련된 시스템 콜.
- 자원 관리(System Calls for Resource Management): 메모리 할당, 파일 및 디렉토리 생성, 삭제 등과 관련된 시스템 콜.