[Assembly Language] 시스템콜

System call

시스템 콜 관련 header들

cd /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys

시스템콜

시스템 콜이란 프로그램이 운영체제의 커널에게 특정 작업을 수행해달라고 요청하는 것으로 다음과 같은 종류가 있다

  1. 프로세스 제어(process Control)
  2. 파일 조작(file manipulation)
  3. 장치 관리(Device Management)
  4. 정보 유지(Information maintenance)
  5. 통신(Communication)

시스템 콜 번호

  • 시스템 콜을 호출하기 위해서는 시스템 콜의 번호를 알아야한다

  • 아래 경로의 syscall.h에서 찾아볼 수 있다

vim /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/syscall.h

시스템콜 호출 번호 구하기

  • MacOS나 BSD는 시스템 콜을 여러 class로 나눈다.

  • 시스템콜 호출 번호의 첫 bit (upper order bit)는 바로 이 시스템 콜 class를 구분짓는 번호다

    • write, read, exit 등의 함수들은 SYSCALL_CLASS_UNIX 클래스에 담긴 시스템 콜들이며 해당 클래스의 번호는 2다
    #define SYSCALL_CLASS_NONE	0	/* Invalid */
    #define SYSCALL_CLASS_MACH	1	/* Mach */	
    #define SYSCALL_CLASS_UNIX	2	/* Unix/BSD */
    #define SYSCALL_CLASS_MDEP	3	/* Machine-dependent */
    #define SYSCALL_CLASS_DIAG	4	/* Diagnostics */

    syscall_sw.h

호출 번호 예시

  • 모든 Unix 시스템 콜의 번호는0x200000 + unix syscall #

  • write 번호는 4번이기 때문에 0x2000004 가 된다

system call number


register

  • 시스템 콜의 매개변수(parameter)는 연산을 위해 레지스터라는 것에 담긴다
  • 시스템 콜 호출 동안 사용되는 레지스터는 다음 6가지며 나머지는 stack에 저장된다: rdi, rsi, rdx, rcx, r8d, r9d
  • 시스템 콜 번호화 리턴 값은 rax에 담긴다

x86 64 register

시스템콜 매개변수 (parameter)

  • 시스템 콜에 사용되는 6개의 레지스터는 다음의 순서로 시스템 콜의 매개변수로 사용된다

    rdi
    rsi
    rdx
    rcx
    r8
    r9

    system call tutorial

  • 따라서 다음 함수의 선언을 보고 rdi에 fd, rsi에 *buf 그리고 rdx에 count가 담길 것을 알 수 있다

    ssize_t read(int fd, void *buf, size_t count);
    • 만약 세가지 인자 외의 값을 담을 곳이 필요하다면 rdi, rsi, rdx가 아닌 다른 레지스터나 스택을 사용해야 한다
  • 다음 문서는 각 시스템 콜이 어느 레지스터를 매개변수로 사용하는지 정리해두었다

    system call parameters

    • 예시

좋은 웹페이지 즐겨찾기