Computer Science/Operating System

System Call(시스템 콜)

호준송 2023. 3. 3. 21:58
728x90
728x90

 

시스템 콜에 들어가기 앞서 자주 언급되는 단어들에 대해 간단하게 정리했다.

 

운영체제(OS, Operating System)


컴퓨터 하드웨어와 컴퓨터 사용자 간의 인터페이스로서 동작하는 시스템 소프트웨어다.

컴퓨터를 동작시키는 데 도움을 주고, 컴퓨터 하드웨어 바로 윗 단에 설치된다.

  • 종류 : Windows 10, UNIX, LINUX 등

 

 

커널(Kernel)


프로그램은 메모리에 적재되어야 소프트웨어로서 실행이 된다. 운영체제 역시 마찬가지로 메모리에 적재 되어야 실행된다. 운영체제는 규모가 커 항상 필요한 부분만을 메모리에 올린다 나머지는 필요할 때에 메모리에 올린다. 메모리에 상주하는 운영체제의 이 부분을 커널이라고 한다.

 

 

CPU 모드


커널 모드(Kernel Mode)

운영체제가 CPU를 사용하는 모드를 말한다. System Mode, Control Mode 라고도 불리며, 커널모드에서 운영체제는 하드웨어를 제어하는 명령어를 실행할 수 있다.

사용자 모드(User Mode)

사용자 애플리케이션 코드가 실행되는 모드를 말한다. 사용자 애플리케이션은 하드웨어(디스크, I/O)등에 접근할 수 없다. 따라서, 관련 작업이 필요한 경우 System Call 을 사용해야 한다.

 

 

시스템 콜(System Call)


운영체제가 제공하는 서비스를 사용하기 위한 프로그래밍 인터페이스이다.

사용자 애플리케이션은 User Mode에서 실행된다. 운영체제가 제공하는 서비스를 사용하기 위해, Kernel Mode에 접근하기 위해서는 System Call을 통해야만 한다.

💡 사용자와 운영체제는 시스템 자원을 공유한다. 사용자에게 제한을 두지 않으면 사용자가 메모리 내의 주요 운영체제 자원을 망가뜨릴 위험이 생기게 된다. 따라서, 사용자의 시스템 자원 접근을 제한하는 보호 장치가 필요하다. System Call은 이 보호 장치 역할을 한다.

 

 

시스템 콜의 종류


  1. 프로세스 제어 (Process Control)
    더보기
    • 끝내기(exit), 중지 (abort)
    • 적재(load), 실행(execute)
    • 프로세스 생성(create process) - fork
    • 프로세스 속성 획득과 속성 설정
    • 시간 대기 (wait time)
    • 사건 대기 (wait event)
    • 사건을 알림 (signal event)
    • 메모리 할당 및 해제
  2. 파일 조작 (File Manipulation)
    더보기
    • 파일 생성 / 삭제 (create, delete)
    • 파일 열기 / 닫기 / 읽기 / 쓰기 (open, close, read, wirte)
    • 파일 위치 변경 (reposition)
    • 파일 속성 획득 및 설정 (get file attribute, set file attribute)
  3. 장치 관리 (Device Manipulation)
    더보기
    • 하드웨어의 제어와 상태 정보를 얻음 (ioctl)
    • 장치를 요구(request device), 장치를 방출 (relese device)
    • 장치 읽기 (read), 쓰기(write), 위치 변경
    • 장치 속성 획득 및 설정
    • 장치의 논리적 부착 및 분리
  4. 정보 유지 (Information Maintenance)
    더보기
    • 시간과 날짜의 설정과 획득 (time)
    • 시스템 데이터의 설정과 획득 (date)
    • 프로세스 파일, 장치 속성의 획득 및 설정
  5. 통신 (Communication)
    더보기
    • 통신 연결의 생성, 제거
    • 메시지의 송신, 수신
    • 상태 정보 전달
    • 원격 장치의 부착 및 분리
  6. 보호 (Protection)
    더보기
    • 권한 관리

 

시스템 콜의 작동방식


  1. 라이브러리 함수(printf)를 호출한다.
  2. 라이브러리 함수 내부에서 시스템 콜(write)를 호출한다.
  3. 해당 시스템 콜의 인덱스(4)를 CPU 레지스터에 저장한다.
  4. 0x80 인터럽트를 발생시킨다.(커널 모드로 전환)
  5. IDT(Interrupt Descriptor Table)를 참조하여 system_call()을 호출한다.
  6. 이때 3에서 저장한 인덱스를 system_call() 함수 내에 전달한다.
  7. sys_call_table을 참조해 해당 인덱스에 맞는 기능(sys_write)을 호출한다.
  8. 수행이 모두 끝나면 사용자 모드로 전환된다.

 

 

추가 질문


Q. 서로 다른 시스템 콜을 어떻게 구분할 수 있을까요?

더보기
커널은 내부적으로 각각의 시스템 콜을 구분하기 위해 기능별로 고유번호를 할당하고 그 번호에 해당하는 제어루틴을 커널 내부에 정의한다.

 

 

 

728x90
728x90