운영체제의 커널이 제공하는 서비스에 대해 응용프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
운영체제는 커널모드와 사용자모드로 나뉘어서 구동된다.
운영체제에서 프로그램이 구동되는데 있어 많은 부분이 커널 모드를 사용한다.
시스템 콜은 이러한 커널 영역의 기능을 사용자 모드에서 사용할 수 있게 해준다.
해커가 악의적으로 시스템 콜을 사용하거나, 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게나 함수를 호출했을 경우 시스템 전체를 망가트릴 수도 있기 때문에 이러한 명령어들은 커널 모드에서만 실행될 수 있도록 설계되었다.
운영체제가 두 개의 독립된 동작 모드인
사용자 모드(User Mode)
와커널 모드(Kernel Mode)
로 돌아가는 것을 말한다.
하드웨어에 모드 비트
라는 것이 있는데 이 모드비트가 0이면 커널 모드, 1이면 사용자 모드이다.
최초 부팅 시 하드웨어는 커널 모드에서 시작해서 운영체제가 올라오고, 여기서부터 사용자모드가 시작된다.
인터럽트 또는 트랩이 발생할 때 마다 하드웨어는 모드 비트를 0으로 바꾸고 커널 모드로 전환한다.
커널 모드
프로그램 카운터(CPU 레지스터로 실행될 다음 명령어의 주소를 가지고 있다.)가 운영체제가 존재하는 부분을 가리키고 있다면, 현재 운영체제의 코드를 수행중이며 이를 CPU가 커널 모드에서 수행중이라고 한다.
시스템 자원이나 하드웨어 직접적으로 접근하여 컨트롤 한다.
사용자 모드
프로그램 카운터가 사용자 프로그램이 존재하는 메모리 위치를 가리킬 경우, 사용자 프로그램을 수행중이며 이를 CPU가 사용자 모드에서 수행 중이라고 한다.
일반 응용 프로그램이 동작하는 비특권 모드로 시스템의 자원이나 하드웨어를 직접적으로 컨트롤 할 수 없으며 이를 위해서는 시스템 콜을 사용해야 한다.
open()
시스템 콜을 호출했을 때 운영체제에서 처리가 이루어지는 과정이다.
각 시스템 콜 마다 번호가 할당되고, 시스템 콜 인터페이스는 이 번호들로 인덱싱된 테이블을 유지한다.
필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때, 좀 더 많은 정보가 필요할 수 있다.
그러한 정보를 담은 파라미터를 운영체제에 전달하기 위해서는 대략 3 가지 정도의 방법이 있다.
레지스터에 담아서 전달한다.
파라미터 개수에 제한이 있다. CPU내의 레지스터 갯수보다 파라미터의 갯수가 많을 경우 사용할 수 없다.
파라미터를 시스템 콜 마다 사용자가 자신의 프로그램 안에 별도의 메모리 공간을 할당해서 저장한 후, 그 주소를 레지스터에 담아서 전달한다.
스택을 통해 전달한다.
프로그램에 의해 스택에 넣어지고 운영체제에 의해 꺼내지고 사용되어진다.
프로세스 제어
프로세스 생성, 적재, 실행, 대기, 메모리 할당 등
파일 조작
파일 생성, 삭제, 열기, 닫기, 읽기, 쓰기, 위치 변경 등
장치 관리
장치 요구 및 해제, 읽기, 쓰기 등
정보 유지
시간과 날짜의 설정 및 획득, 프로세스 파일, 장치 속성의 설정 및 획득 등
통신
통신 연결의 생성, 제거, 메시지의 송수신, 상태정보 전달 등
Reference
https://velog.io/@woo00oo/시스템-콜System-Call
https://fjvbn2003.tistory.com/306
https://limjunho.github.io/2021/05/11/SystemCall.html