System call

2021. 9. 27. 13:22Linux

    목차
반응형

System call


    system과 user space process간 상호 작용할 수 있게 해 주는 interface가 ssytem call


커널과 통신


    system call --> OS의 abstraction
   
    system call은
        1) user space에 hardware interface를 abstraction 형태로 제공
        2) system 보안 및 안정성 향상

    trap을 제외하면 system call은 정상적인 방법으로 kernel에 진입하는 유일한 수단
    장치 file이나 /proc file system을 이용하는 다른 interface도 결국은 system call을 통하게 됨


API, POSIC, C library (libc, bionic c)


    application은 일반적으로 system call을 직접 사용하지 않고 API(Application Programming Interface)
    를 사용 - 즉, OS independent하게 됨
   
    API는 하나 혹은 그 이상의 system call을 사용해 구현됨 (전혀 사용하지 않는 경우도 있음)
   
    유닉스에서 가장 유명한 API는 바로 POSIX 표준
    UNIX 기반 OS간의 이식성을 목적으로 정해진 IEEE 표준의 집합
   
   
    Linux system call interface는 C library 형태로 제공됨
   
    UNIX interface의 공통적인 모토는 "정책이 아닌 방식을 제공하라" 임
    즉, UNIX system call은 특정 기능을 아주 일반적인 형태로 제공한다.


Syscall

    System call을 줄여서 syscall이라고 함
    C library에 정의된 함수를 호출하는 방식
   
    system call에서 오류가 발생하는 경우 C library는 전역 변수인 errno에 특정 오류 코드를 기록
    perror()를 사용하면 이 변수의 값을 사람이 보기 편한 문자열 형태로 바꿀 수 있다.
   
   
    ex.
    getpid() system call   
   
    SYSCALL_DEFINE0(getpid)    {
        return task_tgid_vnr(current);      // current->tgid 값을 반환
    }
   
    SYSCALL_DEFINE0은 인자가 없는 system call이며, 실제로 다음과 같은 macro이다.
   
    asmlinkage long sys_getpid(void)
   
        asmlinkage directive는 해당 함수의 인자를 stack에서만 찾으라고 compiler에게 알려줌
        32 bits와 64 bits간의 호환을 위해 int 형 return이 필요한 경우 long을 사용한다.
       
        getpid() system call은 sys_getpid라는 이름으로 정의된다.
        모든 system call이 사용하는 명명규칙
       
        bar()라는 system call은 sys_bar라는 함수로 구현


system call 번호

    모든 system call에는 syscall 번호가 할당됨 (table의 indexing용)
    특정 system call을 참조하는데 사용하는 고유번호
   
    system call 번호는 중요함
        한번 할당되면 변경 불가
        변경 시 실행 안됨
        즉, system call 번호를 재사용하지 않음

    sys_ni_syscall()
        구현되지 않은 system call을 의미
        -ENOSYS (유효하지 않음)을 반환
   
        system call이 제거된 경우 혹은 사용 불가능한 상황 시 이것으로 공백 메우기를 수행

    sys_call_table
        등록된 모든 system call의 목록을 저장하는 table
        CPU architecture 별로 존재
        x86-64의 경우
            arch/i386/kernel/syscal_64.c file에 저장


system call 성능
    Linux의 system call은 다른 OS보다 context switching 속도의 빠름으로 빠르다.


system call handler

    커널에 신호를 보내는 방법으로 Software interrupt (SWI @ ARM) 을 사용
    예외가 발생하면 system은 kernel mode로 전환되고 exception handler가 실행
   
    x86에서는 Software interrupt는 int $0x80 명령을 통해 발생시키는 128번 interrupt임
     -> exception vector의 128번 handler를 실행

    system 호출 handler는 system_call() 함수로 구현되어 있으며,
    x86-64의 경우 entry_64.S file에 assembly로 구현


알맞은 system call 찾기

    user space에서 호출한 sysetm call을 kernel에서 구분하기 위해서는 '번호'를 커널로 전달해야 함
    x86은 eax register에 system call number를 전달.

    system call handler가 eax register에서 값을 read
   
    system_call() 내에서는 주어진 system call number를 NR_syscalls 값과 비교해 유효성 검사
    NR_syscalls값과 같거나 크면 -ENOSYS 오류를 리턴

    call *sys_clal_table(, %rax, 8)   <-- 8x8 = 64

        system call table의 각 item은 64 bits(8 bytes)
        kernel은 system call number * 8 하여 offset 계산


           read()
             |
&nbs

반응형

'Linux' 카테고리의 다른 글

virtual address space  (0) 2021.09.27
input driver  (0) 2021.09.27
Ioremap 코드 분석  (0) 2021.09.27
Linux의 kmalloc과 vmalloc에 대해서  (0) 2021.09.27
pthread_barrier_t 사용법 (pthread barrier)  (0) 2021.09.27