반응형

커널과 통신

  1. 시스템 호출은 하드웨어와 사용자 공간 프로세스 사이에 있는 계층
  2. 이 계층은 세가지 역할을 수행
  • 사용자 공간에 하드웨어 인터페이스를 추상화된 형태를 제공
  • 시스템 호출은 시스템보안 및 안정성을 제공
  • 사용자 공간과 기타 시스템 사이에 계층을 둠으로써 프로세스 별 가상 시스펨 환경을 제공

 

API, POSIX, C 라이브러리

  • 애플리캐이션으 일반적으로 시스템 호출을 직접 사용하지 않고 사용하지 않고, 사용자 공간에 구현된 애플리케이션 프로그래밍 인터페이스(API)를 이용
  • API는 애플리케이션이 사용하는 프로그래밍 인터페이스
  • API는 하나 또는 이상의 시스템 호출을 사용해 구현되며 경우에 따라 시스템 호출을 사용하지 않을 수 있다.

  < printf() 호출 시 애플리케이션, C 라이브러리, 커널사이의 관계>

 

 

  • 유닉스에서 가장 유명한 API는 POSIX 표준이다.
  • POSIX는 API와 시스템 호출간의 관계를 보여주는 예
  • 리눅스의 시스템 호출 인터페이스는 다른 유닉스 시스템과 마찬가지로 C라이브러리 형태로 제공
  • C라이브러리는 표준 C라이브러리와 시스템 호출 인터페이스 등 유닉스 시스템의 주요 API가 구현
  • C라이브러리는 모든 C프로그램이 사용하며, 대다수의 POSIX API를 추가로 제공
  • 유닉스 인터페이스의 공통적인 모토는 "정책이 아닌 방식을 제공하라" → 유닉스 시스템 호출은 특정 기능을 아주 일반적인 형태로 제공

 

시스콜

  • 시스템 호출 (리눅스에서는 syscall)은 보통 C 라이브러리에 정의된 함수를 호출하는 방식으로 사용
  • 이 함수는 0개 혹은 하나 이상의 인자를 받고 하나 이상 부수효과를 발생 가능
  • 시스템 호출에서 오류가 발생할 경우 C라이브러리는 전역 변수인 errno에 특정 오류 코드를 기록
  • 라이브러리 함수인 perror() 를 사용하여 이 변수를 사람이 보기 편한 문자열 형태로 변환 가능
  • 시스템 호출은 정의된 특정 동작을 수행, 그렇지만 함수 정의로는 구현 내용에 대해 아무것도 알 수없음에 주의
  • 시스템 호출 정의 방법 : 함수 정의 부분에 asmlinkage 지시자가 있으며 이 자시자는 해당 함수의 인자를 스택에서만 찾으라고 컴파일러에게 알려준다 → 이는 리눅스의 모든 시스템 호출이 사용하는 명명규칙

 

 

 

시스템 호출 번호

  • 리눅스의 모든 시스템 호출에는 시스콜 번호가 할당
  • 이 번호는 특정 시스템 호출을 참조하는데 사용하는 고유번호
  • 사용자 공간 프로세스가 시스템 호출을 실행 할 때 시스콜 번호를 통해 실행 할 시스템 호출을 확인
  • 프로세스는 이름을 사용해 시스콜을 참조하지 않는다
  • 시스콜 번호는 한번 할당 하면 변경할 수 없으므로 매우 중요
  • 커널은 등록된 모든 시스템 호출의 목록을 sys_call_table이라는 시스템 호출 테이블에 저장

 

시스템 호출 성능

  • 리눅스 시스템 호출은 다른 운영체제 보다 빠르다.
  • 첫번째, 리눅스의 빠른 Context switch 시간이며
  • 다음은 시스템 호출 핸드러의 구현이 간단하게 되어 있다.

 

반응형

+ Recent posts