시스템 콜 관련 header들
cd /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys
시스템 콜이란 프로그램이 운영체제의 커널에게 특정 작업을 수행해달라고 요청하는 것으로 다음과 같은 종류가 있다
시스템 콜을 호출하기 위해서는 시스템 콜의 번호를 알아야한다
아래 경로의 syscall.h에서 찾아볼 수 있다
vim /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/syscall.h
MacOS나 BSD는 시스템 콜을 여러 class로 나눈다.
시스템콜 호출 번호의 첫 bit (upper order bit)는 바로 이 시스템 콜 class를 구분짓는 번호다
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 */
모든 Unix 시스템 콜의 번호는0x200000 + unix syscall #
write 번호는 4번이기 때문에 0x2000004
가 된다
시스템 콜에 사용되는 6개의 레지스터는 다음의 순서로 시스템 콜의 매개변수로 사용된다
rdi
rsi
rdx
rcx
r8
r9
따라서 다음 함수의 선언을 보고 rdi
에 fd, rsi
에 *buf 그리고 rdx
에 count가 담길 것을 알 수 있다
ssize_t read(int fd, void *buf, size_t count);
다음 문서는 각 시스템 콜이 어느 레지스터를 매개변수로 사용하는지 정리해두었다
예시