[Assembly Language] 시스템콜
System call
시스템 콜 관련 header들
cd /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys
시스템콜
시스템 콜이란 프로그램이 운영체제의 커널에게 특정 작업을 수행해달라고 요청하는 것으로 다음과 같은 종류가 있다
- 프로세스 제어(process Control)
- 파일 조작(file manipulation)
- 장치 관리(Device Management)
- 정보 유지(Information maintenance)
- 통신(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 */
- write, read, exit 등의 함수들은
호출 번호 예시
-
모든 Unix 시스템 콜의 번호는
0x200000 + unix syscall #
-
write 번호는 4번이기 때문에
0x2000004
가 된다
register
- 시스템 콜의 매개변수(parameter)는 연산을 위해 레지스터라는 것에 담긴다
- 시스템 콜 호출 동안 사용되는 레지스터는 다음 6가지며 나머지는 stack에 저장된다: rdi, rsi, rdx, rcx, r8d, r9d
- 시스템 콜 번호화 리턴 값은 rax에 담긴다
시스템콜 매개변수 (parameter)
-
시스템 콜에 사용되는 6개의 레지스터는 다음의 순서로 시스템 콜의 매개변수로 사용된다
rdi rsi rdx rcx r8 r9
-
따라서 다음 함수의 선언을 보고
rdi
에 fd,rsi
에 *buf 그리고rdx
에 count가 담길 것을 알 수 있다ssize_t read(int fd, void *buf, size_t count);
- 만약 세가지 인자 외의 값을 담을 곳이 필요하다면 rdi, rsi, rdx가 아닌 다른 레지스터나 스택을 사용해야 한다
-
다음 문서는 각 시스템 콜이 어느 레지스터를 매개변수로 사용하는지 정리해두었다
-
예시
-
Author And Source
이 문제에 관하여([Assembly Language] 시스템콜), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jehjong/Assembly-Language-시스템콜저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)