1 분 소요


▶ 시스템 콜

  • 시스템 콜이란?
    • 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

태그: ,

카테고리:

업데이트:

댓글남기기