1. 시스템 호출
ㅇ 사용자 프로세스가 운영체제 커널에게, 어떤 동작의 처리를 요청하는 것
ㅇ 시스템 호출 API
- 커널은, 시스템 호출 API를 통해, 사용자 프로세스에게 광범위한 실시간 서비스를 제공하게 됨
. (API : 실시간으로 제공 가능한 규격화된 응용 서비스들의 모음)
2. 시스템 호출에 따른 제어권의 전달 : (사용자모드 ↔ 커널모드)
ㅇ (호출 방식)
- 프로그램을 작성할 때, 단순히 서브루틴을 호출하는 것처럼, 시스템 호출을 함
ㅇ (제어권 전달)
- 시스템 호출을 수행하면, 제어권은 사용자 모드로부터 커널 모드로 옮겨지고,
- 시스템 호출을 마치면, 제어권은 커널 모드로부터 다시 사용자 모드의 사용자 프로세스로 복귀함
3. 시스템 호출의 유형
ㅇ 프로세스 관리 : 프로세스의 생성,삭제 등과 관련된 시스템 호출
- 프로세스 제어용
. exec() : 자신을 수행 가능한 다른 프로세스로 대치 수행 (사용자 프로그램의 실행)
. fork() : 현재의 프로세스 이미지를 복사하고 child 프로세스를 만듬
. wait
. kill()
- pipe : 파이프
- signal : 소프트웨어 인터럽트 또는 시그널
- exit : 프로세스 종료
- getuid, setuid ... : 사용자 및 그룹 id 접근
ㅇ 메모리 확보,해제
ㅇ 통신 처리 : 소켓 기반의 시스템 호출
- socket(), bind(), listen(), accept(), connect(), ...
ㅇ 파일 I/O : 표준 화일(장치)에 대한 입출력 시스템 호출
- open( ), close( ), read( ), write( ), lseek( ), create( ), ...
* 디스크,파이프,터미널,소켓 등 모든 종류의 파일에 대해, 이같은 시스템 호출을 동일 적용 가능
* 모든 파일I/O 시스템호출은, 파일기술자 번호를 통해, 열려있는 파일을 참조함
ㅇ 기타, 장치 관리, 정보 유지 등
4. Unix/Linux에서, 시스템 호출의 사용 방법
ㅇ 커널 차원에서,
- 사용자 프로세스를 위해 서비스하기 위한 여러 함수들을 마련하고 있는데,
- 이 함수(function)들을 일컬어 시스템 호출 이라고 하며,
ㅇ 시스템 호출 형식
- 이들 형식은, 시스템 헤더파일인 syscall.h, unistd.h 에 정의되어 있음 ☞ 헤더파일 참조
ㅇ 사용 방법 둘
- ① libc (표준 C 라이브러리)를 통한, 포장 함수(Wrapper Function)에 의해 호출하는 방법
. 표준으로써 어느 운영체제라도 모두 동일
- ② syscall() 함수를 이용해서 직접 실행시키는 방법
. 운영체제 종류 마다 다름
ㅇ 시스템 콜의 특징
- 바이트 단위로 만 읽기,쓰기 처리 가능
- 커널 공간에서 실행됨
- 트랩 또는 인터럽트를 일으키며 커널로 진입함
. 한편, 인텔 프로세서(i386)에서는, 소프트웨어 인터럽트 명령인 int 0x80을 통해,
. 시스템 콜 번호, 매개변수 등을 CPU 레지스터에 전달하고,
. 보호된 커널 영역으로 들어가, 인터럽트 핸들러를 실행하게 됨
ㅇ 시스템 호출 例) : (약 90개 정도가 있음)
- exit() : 현재 프로세스의 종료 (소스 위치 : kernel/exit.c)
- fork() : 자식 프로세스의 생성 (소스 위치 : arch/i385/kernel/process.c)
- open() : 파일이나 장치열기 (소스 위치 : fs/open)
- read() : 파일 지정자(fd)로 부터 읽기 (소스 위치 : fs/read_write.c)
. n = read(fd, buf, sizeof buf);
- write(): 파일 지정자(fd)로 쓰기 (소스 위치 : fs/read_write.c)
. n = write(fd, buf, count);
- close(): 파일 지정자 닫기 (소스 위치 : fs/open.c)
ㅇ 용도
- 프로세스 제어, 파일 조작, 디바이스 관리, 시스템 정보 관리, 통신 관리 등