[OS] 시스템 콜
▶ 시스템 콜
- 시스템 콜이란?
- OS 서비스를 사용하기 위해 커널 모드로 전환하는 방법이다.
- OS의 커널 모드로 동작하는 관리자(중개자) 역할을 수행한다.
- 시스템 콜은 직접 사용하기에 어려움이 있어 API를 통해 접근한다. (사용자 프로그램 -> API 사용 -> 시스템 콜)
▷ 시스템 콜 구현
① 사용자 응용프로그램에서 open( ) 함수를 통해 시스템 콜 API 호출
② 시스템 콜 인터페이스를 통해 커널모드로 전환
③ 시스템 콜 테이블을 통해 open( )과 매핑되는 인덱스 i 찾기 (각 시스템 콜에 대하여 index(숫자)가 부여)
④ 찾은 인덱스 i 에 해당하는 실제 시스템 콜 위치정보 찾기
⑤ 해당 위치 정보가 가르키는 시스템 콜 수행 후 ( 해당 파일 열기 ), 다시 유저모드로 전환
▷ 시스템 콜 파라미터 전달
- 레지스터를 통한 전송
- 매개변수를 CPU 레지스터 내에 전달
- 가장 단순한 방법, but 레지스터 개수보다 더 많은 매개변수가 있는 경우, 한계가 있다.
- 블록 or 테이블을 통한 전송
- 매개변수를 블럭 또는 테이블에 저장하고 해당 메모리 주소가 레지스터에 전달
- 스택을 통한 전송
- 매개변수를 프로그램의 스택(stack)으로 전달(push)하고 OS에 의해 꺼냄(pop off)
블록 or 테이블을 통한 전송, 스택을 통한 전송 => 매개변수들의 개수나 길이 제한하지 않아 많이 사용한다.
▶ 시스템 콜 종류
프로세스 제어, 파일 관리, 장치 관리, 정보 관리, 통신, 보호
▷ 시스템 콜 사용 예시
파일 읽기: 표준 C 라이브러리
① printf() 함수는 유저 모드에서 수행되어 stdio 라이브러리를 호출한다.
#include <stdio.h>
int main(void){
printf("Greetings");
}
② stdio 라이브러리는 시스템 콜인 write()를 호출하고, 유저 모드에서 커널 모드로 전환한다. 즉, 아래 코드와 같이 printf 함수 내부에 시스템 콜 함수인 write가 있는 것을 확인할 수 있다.
- 커널은 호출을 실행하여 모니터에 문자열을 출력하고 다시 유저 모드로 돌아온다.
③ write 함수 부분이 컴파일 되고 나면 아래와 같은 명령어들로 이루어져 있을 것이다.
...
movl 5, %eax
int $0x80
④ 즉, C 프로그램이 printf() 호출 → 표준 “C 라이브러리”가 write() 시스템 콜 수행한다.
#include <stdio.h>
int main(void){
...
printf(){
...
write(...)
}
...
}
파일 복사
▶ 시스템 콜 확인
시스템 콜을 직접 확인해보자!
- https://kangtegong.github.io/self-learning-cs/system_calls/syscalls.html
개발자는 시스템 콜이 어떻게 구현되는지 알 필요가 없다
- 개발자는 API를 제대로 사용하고, 운영체제가 시스템 콜의 결과로 무슨 일을 하는지만 알면 된다.
📎참조
- 성결대학교 강영명 교수님 운영체제 (2023)
- https://limjunho.github.io/2021/05/11/SystemCall.html
댓글남기기