[OS] #4 시스템 콜
1. 시스템 콜 개요
1.1 시스템 콜이란?
OS 서비스를 사용하기 위해 커널 모드로 전환하는 방법이다.
- OS의 커널 모드로 동작하는 관리자(중개자) 역할을 수행한다.
- 시스템 콜은 직접 사용하기에 어려움이 있어 API를 통해 접근한다. (사용자 프로그램 -> API 사용 -> 시스템 콜)
1.2 시스템 콜 구현
① 사용자 응용프로그램에서 open( ) 함수를 통해 시스템 콜 API 호출
② 시스템 콜 인터페이스를 통해 커널모드로 전환
③ 시스템 콜 테이블을 통해 open( )과 매핑되는 인덱스 i 찾기 (각 시스템 콜에 대하여 index(숫자)가 부여)
④ 찾은 인덱스 i 에 해당하는 실제 시스템 콜 위치정보 찾기
⑤ 해당 위치 정보가 가르키는 시스템 콜 수행 후 ( 해당 파일 열기 ), 다시 유저모드로 전환
1.3 시스템 콜 종류
프로세스 제어, 파일 관리, 장치 관리, 정보 관리, 통신, 보호
2. 시스템 콜 파라미터 전달
2.1 레지스터를 통한 전송
매개변수를 CPU 레지스터 내에 전달
가장 단순한 방법, but 레지스터 개수보다 더 많은 매개변수가 있는 경우, 한계가 있다.
2.2 블록 or 테이블을 통한 전송
매개변수를 블럭 또는 테이블에 저장하고 해당 메모리 주소가 레지스터에 전달
2.3 스택을 통한 전송
매개변수를 프로그램의 스택(stack)으로 전달(push)하고 OS에 의해 꺼냄(pop off)
💡 블록 or 테이블을 통한 전송, 스택을 통한 전송 => 매개변수들의 개수나 길이 제한하지 않아 많이 사용한다.
3. 시스템 콜 사용 예시
3.1 파일 읽기: 표준 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(...)
}
...
}
3.2 파일 복사
4. 시스템 콜 확인
시스템 콜을 직접 확인해보자!
https://kangtegong.github.io/self-learning-cs/system_calls/syscalls.html
개발자는 시스템 콜이 어떻게 구현되는지 알 필요가 없다
개발자는 API를 제대로 사용하고, 운영체제가 시스템 콜의 결과로 무슨 일을 하는지만 알면 된다.
댓글남기기