CS/운영체제

시스템 콜

이충무 2022. 9. 20. 22:00

권한 모드


 

  • 운영체제는 커널 모드(Kernel Mode)와 사용자 모드(User Mode)**로 나뉘어 구동된다. 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.

 

  • 사용자 모드 (user mode): by application
    • 사용자 모드에서는 코드를 실행할 때는 응용 프로그램이 하드디스크, 메모리, printer, 그리고 다른 I/O device 들과 같은 특정 리소스들에 직접 접근할 수 없다.(이런 리소스들에 접근하려면 시스템 콜을 호출해 커널 모드로 전환해야 한다.)
  • 커널 모드 (kernel mode): by OS
    • OS가 CPU를 쓸 때 모드 
    • OS는 커널모드에서 실행된다. 커널 모드에서는, OS가 모든 하드웨어에 접근이 가능하고 제어가 가능하다.하드웨어 구성요소들로는 RAM, HARD, CPU, printer, 그리고 다른 I/O device 들이 있다.
    • 운영 프로그램(User Process)은 사용자 모드(User Mode)에서 특정 하드웨어 리소스들에 직접 접근할 권한이 없기 때문에 하드웨어에 접근할 때에는 모든 하드웨어를 제어하는 권한이 있는 운영체제가 필요하고 따라서 커널모드로 전환되어야 한다.

 

시스템 호출(System Calls)


  • OS는 다양한 서비스들을 수행하기 위해 하드웨어를 직접적으로 관리한다. 이와 반면 응용 프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다. OS가 제공하는 이러한 인터페이스를 시스템 콜(System Call) 라고 한다.

 

  • 시스템 콜은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다.

 

  • 프로그램 이식성(Portability)과 사용의 편리함 때문에 직접적인 시스템 콜보단 API(Application Program Interface)를 통해서 사용된다.  주로 사용하는 API는 Window에선 Win32, UNIX/Linux/Mac OS X 등에서는 POSIX-API, JVM(Java Virtual Machine)에서는 Java API가 있다.

 

  • 각각의 시스템 콜은 숫자로 구별된다. 시스템 콜 인터페이스(System Call Interface)가 이 숫자에 따라 매핑된 테이블을 유지한다. 시스템 콜 테이블(System Call Table)은 메모리 주소의 모음인데, 해당 메모리 주소는 인터럽트 서비스 루틴을 가리키고 있다.  시스템 콜 인터페이스는 OS 커널에서 의도된 시스템 콜을 발생시키고, 시스템 콜의 상태나 기타 값들을 반환한다.  호출자(Caller)는 시스템 콜이 어떻게 구현되는지 알 필요는 없고, 어떻게 API를 사용하는지, 시스템 콜의 결과로 OS가 어떤 작업을 하는지만 알면 된다.

 

시스템 콜 처리 과정


  • 아래 그림은 open() 시스템 콜을 호출 했을 때 운영체제에서 어떻게 처리되는지를 보여준다.

  1. 사용자 프로세스가 시스템 콜을 요청하면 제어가 커널로 넘어옴(사용자 모드 -> 커널 모드)
  2. 커널은 내부적으로 각각의 시스템 콜을 구분하기 위해 기능별로 고유번호를 할당하고 그 번호에 해당하는 제어루틴을 커널 내부에 정의
  3. 커널은 요청받은 시스템 콜에 대응하는 기능번호를 확인
  4. 커널은 그 번호에 맞는 서비스 루틴을 호출
  5. 서비스 루틴을 모두 처리하고 나면 커널 모드에서 사용자 모드로 다시 전환
  • 필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때 좀 더 많은 정보가 필요할 수 있다. 그러한 정보가 담긴 매개변수를 운영체제에 전달하기 위해서는 대략 3가지 방법이 있다
    1. 1. 매개변수를 CPU 레지스터 내에 전달한다.(Call by Value)
      • 이 경우에 매개변수의 갯수가 CPU 내의 총 레지스터 개수보다 많을 수 있다.
    2. 2. 위와 같은 경우에 매개변수를 메모리에 저장하고 메모리의 주소가 레지스터에 전달된다. (아래 그림 참고)(Call by Reference)

 

  1. 3. 매개변수는 프로그램에 의해 스택(stack)으로 전달(push) 될 수도 있다.
    • 2, 3번 방법의 경우 전달되는 매개변수의 개수나 길이에 제한이 없기 때문에 몇몇 운영체제에서 선호하는 방식이다.

 

시스템 콜이 필요한 이유


  • 우리가 일반적으로 사용하는 프로그램은 '응용프로그램'입니다. 유저레벨의 프로그램은 유저레벨의 함수들 만으로는 많은 기능을 구현하기 힘들기 때문에, 커널(kernel)의 도움을 반드시 받아야 합니다. 이러한 작업은 응용프로그램으로 대표되는 유저 프로세스(User Process)에서 유저모드에서는 수행할 수 없습니다. 반드시kernel에 관련된 것은 커널모드로 전환한 후에야, 해당 작업을 수행할 권한이 생깁니다. 커널 모드를 통한 이러한 작업은 반드시시스템 콜을 통해 수행하도록 설계되어 있습니다. 아래 그림(1.13)을 살펴보면 이해가 빠를 것입니다.

그렇다면 권한은 왜 필요한 것일까? 의문이 생길 수 있습니다. 그 이유는 해커가 피해를 입히기 위해 악의적으로 시스템 콜을 사용하는 경우나 초보 사용자가 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 경우에 시스템 전체를 망가뜨릴 수도 있기 때문입니다. 따라서 이러한 명령어들은 특별하게 커널 모드에서만 실행할 수 있도록 설계되었고, 만약 유저 모드에서 시스템 콜을 호출할 경우에는 운영체제에서 불법적인 접근이라 여기고 trap을 발생시킵니다.

 

 

시스템 콜의 유형


시스템 콜은 여섯 가지의 중요한 범주로 나눌 수 있다.

  1. 프로세스 제어
  2. 파일 조작
  3. 장치 조작
  4. 정보 유지보수
  5. 통신
  6. 보호

1 프로세스 제어(Process Control)

  • 끝내기(exit), 중지(abort)
  • 메모리 적재(load), 실행(execute)
  • 프로세스 생성(create process) - fork
  • 프로세스 속성 획득과 설정(get process attribute and set process attribute)
  • 시간 대기(wait time)
  • 사건 대기(wait event)
  • 사건을 알림(signal event)
  • 메모리 할당 및 해제 : malloc, free

2 파일 조작(File Manipulation)

  • 파일 생성(create file), 파일 삭제(delete file)
  • 열기(open), 닫기(close)
  • 읽기(read), 쓰기(write), 위치 변경(reposition)
  • 파일 속성 획득 및 설정(get file attribute and set file attribute)

3 장치 관리(Devide Management)

  • 하드웨어의 제어와 상태 정보를 얻음(ioctl)
  • 장치를 요구(request devices), 장치를 방출release device)
  • 읽기(read), 쓰기(write), 위치 변경
  • 장치 속성 획득, 장치 속성 설정
  • 장치의 논리적 부착(attach) 또는 분리(detach)

4 정보 유지(Information Maintenance)

  • getpid(), alarm(), sleep()
  • 시간과 날짜의 설정과 획득(time)
  • 시스템 데이터의 설정과 획득(date)
  • 프로세스 파일, 장치 속성의 획득 및 설정

5 통신(Communication)

  • pipe(), shm_open(), mmap()
  • 통신 연결의 생성, 제거
  • 메시지의 송신, 수신
  • 상태 정보 전달
  • 원격 장치의 부착 및 분리

6. 보호(Protection)

  • chmod()
  • umask()
  • chown()