시스템 호출(system call)은 운영 체제의
커널
이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스
사용자 프로그램이 디스크 파일을 접근하거나 화면에 결과를 출력하는 등의 작업이 필요한 경우, 즉 사용자 프로그램이 특권 명령의 수행을 필요로 하는 경우, 운영체제에게 특권 명령의 대행을 요청하는 것이 시스템 콜이다.
1. 사용자 프로세스가 시스템 콜 호출(커널 모드 진입)
2. 커널은 내부적으로 시스템 콜을 구분하기 위해 기능별로 고유번호를 할당하고 그 번호에 해당하는 제어 루틴을 정의
3. 커널은 요청받은 시스템 콜에 대응하는 고유번호 확인하고 번호에 맞는 서비스 루틴 호출
4. 커널은 서비스 루틴을 처리하고, 사용자 모드로 전환
5. open()에 매칭된 커널 함수 sys_open()를 실행
사용자가 프로그램을 통해 in.txt의 내용을 out.txt에 복사하고 싶을 때, 다음과 같은 과정이 이루어진다.
먼저, 프로그램은 in.txt 파일을 열어야 한다. 이를 위해 시스템에 open 명령을 내리게 되며, 파일을 성공적으로 열게 되면 파일의 내용을 읽어올 준비가 된다. 그 다음, 프로그램은 read 명령을 사용해 파일의 내용을 읽어 메모리에 저장한다.
다음 단계에서 프로그램은 out.txt라는 새 파일을 만들거나 기존의 파일을 열어야 한다. 만약 파일이 이미 존재한다면 내용을 덮어쓸지의 여부를 결정하게 되며, 이 경우에는 기존의 파일을 열게 된다.
이제 in.txt에서 읽어온 내용을 out.txt에 쓰게 된다. 이를 위해 프로그램은 write 명령을 사용해 메모리에 저장된 내용을 해당 파일에 기록하게 된다.
마지막으로, 모든 작업이 완료되면 프로그램은 두 파일을 모두 닫게 된다. 이때 close 명령을 사용하여 시스템에 파일을 닫도록 요청하게 된다.
이렇게 간단한 파일 복사 작업조차도 여러 개의 시스템 콜을 필요로 하며, 이를 통해 사용자와 시스템 간의 상호작용이 이루어진다.
바로 시스템을 보호하기 위함이다. 예를 들어 사용자가 권한 없이 시스템 내부의 데이터를 만질 수 있다고 가정해보자. 이럴 경우 쉽게 내부 데이터 접근이 가능하여 의도치 않게 또는 악의적으로 시스템을 해칠 수가 있다. 이런 경우를 대비해 시스템을 보호하기 위해서 이중 동작 모드로 구동이 된다. 이렇게 구동되어 유저 애플리케이션이 함부로 시스템 자원에 접근할 수 없게 되는 것.
사용자 모드는 접근할 수 있는 메모리 영역이 사용자에게 허용된 정도로 제한되어 있고, 하드웨어에 직접적으로 접근할 수 없다.
커널 모드는 모든 세스템 메모리와 CPU Instruction에 접근 가능하고, 하드웨어에 직접적으로 접근할 수 있다.
한 마디로 커널 모드가 사용자 모드보다 높은 권한을 가져 사용자 모드에서 유저 애플리케이션의 필요에 따라 커널 모드로 변환하여 시스템 영역에 접근할 수 있다. 이렇게 사용자 모드에서 커널 모드로 전환하기 위해 필요한 인터페이스를 시스템 콜이라고 합니다.
open(): 파일을 열거나 새 파일을 생성합니다.
read(): 파일로부터 데이터를 읽어옵니다.
write(): 파일에 데이터를 씁니다.
close(): 열린 파일을 닫습니다.
fork(): 새로운 프로세스를 생성합니다.
exec(): 프로세스를 새로운 프로그램으로 대체합니다.
wait(): 자식 프로세스가 종료될 때까지 부모 프로세스를 대기시킵니다.
exit(): 현재 프로세스를 종료합니다.
mmap(): 메모리 영역을 매핑하거나 이미 매핑된 메모리 영역의 속성을 변경합니다.
brk(): 데이터 세그먼트의 최상위 주소를 설정하거나 리턴합니다.
ioctl(): 장치 드라이버의 I/O 제어를 수행합니다.
socket(): 소켓을 생성합니다.
bind(): 소켓에 주소를 할당합니다.
listen(): 연결 요청을 대기합니다.
accept(): 연결 요청을 수락합니다.