1. syscall이란?
- 어셈블리를 사용하다 보면, syscall이라는 함수를 보게 될텐데 syscall은 뭘까..?
section .text
global _main
_main :
mov rax, 0x2000004
mov rdi, 1
mov rsi, msg
mov rdx, 12
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg db "Hello World"
2. syscall사용법.
- sys 콜을 부르기 전에, rax 레지스터에 원하는 함수 주소르 넣어주면 해당 함수를 부를수 있다.
- 아래는 리눅스 기반 시스콜 테이블표이다.
linux 시스콜

- 맥 os의 유닉스 기반 시스콜은 아래와 같지만 linux와 차이점은 linux의 경우 rax에 그냥 sys콜 인덱스를 넣어주면 되지만, unix에서는 bsd layer에 접근해주기 위해, 0x2000001(exit함수를 불러올떄) 이런식으로 앞에 16진수의 입력값도 해주어야한다.
- 아래는 맥 os 유닉스 기반 syscall 테이블

If you use assembly you have to add 0x2000000
to mark them for the BSD layer (rather than 0x1000000,
which would mean Mach traps, or 0x3000000, which would mean machine dependent).
- 유닉스에서 시스콜을 사용할때 리눅스와 가장큰 차이는 0x2000000 을 이용해서, bsd주소에 따로 접근해주어야한다는 점이다.
syscall 함수의 특징.
- 일반적으로 user는 shell을 통해 컴퓨터와 대화를 하지만, 커널에 접근할 수는 없다.
- 고로 하드웨어를 바꾸는 명령은 할수없다.
- 하지만, syscall을 사용하면 user에서 커널에 접근할수 있게 된다. 커널관련 정리 블로그
