System Call
태그 :
- 개념
- 일반적으로 운영체제(커널)가 하드웨어/시스템에 지정된 또는 특권이 있어야 하는 동작들을 수행토록 요청하는 컴퓨터 하드웨어와 사용자 사이의 인터페이스 또는 함수 프로그래밍 언어에서 지원하지 않는 기능에 대하여 운영체제의 루틴을 호출하여 이용 컴퓨팅 자원을 효율적으로 관리하기 위해 허용하지 않은 사용자의 침범을 방지해 프로그램의 독립적인 수행을 보장 원활한 운영체제의 역할 수행을 위해서는 시스템 소프트웨어를 응용 소프트웨어로부터 보호할 수 있는 메커니즘이 필요
I. H/W와 사용자 사이의 인터페이스, 시스템 호출(System Call)의 개요
가. UNIX OS의 시스템 호출(System Call)의 정의
- 일반적으로 운영체제(커널)가 하드웨어/시스템에 지정된 또는 특권이 있어야 하는 동작들을 수행토록 요청하는 컴퓨터 하드웨어와 사용자 사이의 인터페이스 또는 함수
- 프로그래밍 언어에서 지원하지 않는 기능에 대하여 운영체제의 루틴을 호출하여 이용
- 컴퓨팅 자원을 효율적으로 관리하기 위해 허용하지 않은 사용자의 침범을 방지해 프로그램의 독립적인 수행을 보장
- 원활한 운영체제의 역할 수행을 위해서는 시스템 소프트웨어를 응용 소프트웨어로부터 보호할 수 있는 메커니즘이 필요
나. 시스템 호출의 기본 개념, 특권모드와 사용자 모드
- 사용자 공간과 커널 공간은 권한 레벨을 설정함으로써 구분
- 사용자 모드에서 특권 모드로 권한 레벨을 바꾸지 않으면 커널의 내부 기능을 사용할 수 없음
- 이 경우 보호 오류를 발생시켜 커널 영역에 대한 침범을 차단
- 단순히 커널 영역으로 들어가는 것이 아니라 특권 레벨로 변경하는 것임
II. 시스템 호출의 구조 및 종류
가. UNIX OS의 시스템 호출 구조
- 시스템 호출은 소프트웨어적인 인터럽트 인트랩(SWI:S/W Interrupt)을 발생
- 리눅스의 경우 0x80 인터럽트를 발생
나. 시스템 호출의 종류
구분 |
종류 |
프로세스 관리 |
fork(), execve(), getpid(), signal() 등 |
파일시스템 |
open(), read(), write(), close() 등 |
메모리 관리 |
brk() 등 |
네트워크 관리 |
socket(), bind(), connect() 등 |
시스템정보/제어 |
time() 등 |
- 특히 디바이스 드라이버 관련 시스템 호출은 가상 파일 시스템을 통하므로 파일시스템과 관련 있음
- 커널(Kernel)에 사용자 정의함수를 추가함으로써 사용자 정의 시스템 호출 함수를 구현할 수 있음
III. 시스템 호출의 동작과정 및 예시
가. 시스템 호출의 동작과정
- 유닉스는 사용자 프로그램이 커널에 대한 서비스를 요청할 경우 이에 대한 서비스를 할 수 있는 잘 정의된 제한된 종류의 함수인 시스템 호출을 제공
- 사용자가 운영체제의 기능 혹은 모듈을 활용하려면 반드시 시스템 호출을 이용
- 사용자 모드에서 시스템 호출을 수행하면 시스템 모드로 전환되며, 커널에서 시스템 호출을 종료하면 사용자 모드로 다시 돌아옴
- 사용자 프로세스가 표준 라이브러리를 사용해 커널에 접근하는 것도 내부적으로 시스템 호출을 사용
나. 시스템 호출의 동작과정 예시 – fork() 경우
단계 |
설명 |
1단계 |
fork() 시스템호출 함수를 사용하려면 fork() 함수 정보가 있는/include/unistd.h 헤더파일을 include. 링커로 라이브러리에서 대응하는 함수와 연결 |
2단계 |
라이브러리 내부의 fork() 함수: “swi 900002” 의미 소프트웨어 인터럽트를 통해 사용자 모드에서 커널 모드로 전환되어 커널 자원을 접근 |
3단계 |
호출 번호 2에 해당하는 시스템 호출 함수 sys_fork() 실행 |
4단계 |
가상 파일시스템을 통해 커널 자원인 파일, 디렉토리, 디바이스 등을 하나의 파일처럼 접근 |
IV. 시스템 호출 구현 및 절차
가. 시스템 호출 구현의 개요
- 유닉스 OS에서 태동한 Linux OS의 경우 시스템 호출 함수를 커널을 재빌드 함으로써 구현할 수 있음
- 시스템 호출 함수를 구현하려면 커널 수준의 프로그래밍 작업을 해야 하고, 구현된 시스템 호출 함수를 테스트하려면 사용자 수준의 응용프로그램을 작성해야 함
- 시스템 호출을 커널에 구현하려면 시스템 호출 함수를 정의해야 할 뿐만 아니라 시스템 호출 번호를 할당하고 시스템 호출 함수를 등록해야 함
나. 시스템 호출 구현의 절차
- UNIX OS의 경우는 Open Source일 경우가 드물지만 Linux의 경우 위와 같은 절차로 사용자 정의 시스템 호출 함수를 구현함
- 시스템 호출은 커널에서 서비스를 요청하는 효과적인 방법이지만, 표준화된 인터페이스라는 점과 새로운 시스템 호출을 커널에 추가하기 어렵다는 문제점 있음
< System Call 예시 >