운영체제에서 사용자 프로그램은 직접 커널에 접근할 수 없다. 그래서 사용자 모드(User Mode)에서 커널 모드(Kernel Mode)로 전환하여 커널의 기능을 사용하는 방법으로 시스템 콜(System Call) 이 존재한다.
이때 시스템 콜을 호출할 때 가장 핵심적인 역할을 하는 레지스터가 바로 RAX 다.

시스템 콜은 사용자 프로그램이 커널 기능을 요청하는 인터페이스다.
예를 들어 다음과 같은 작업이 모두 시스템 콜을 통해 이루어진다:
open)read)fork)exit)mmap)리눅스에서 64비트 시스템 콜은 syscall 어셈블리 명령어로 수행한다.
이때 각 레지스터에 정해진 규약(Calling Convention) 을 따라 값을 설정해야 한다.
| 역할 | 레지스터 |
|---|---|
| 시스템 콜 번호 | RAX |
| 첫 번째 인자 | RDI |
| 두 번째 인자 | RSI |
| 세 번째 인자 | RDX |
| 네 번째 인자 | R10 |
| 다섯 번째 인자 | R8 |
| 여섯 번째 인자 | R9 |
| 반환값 | RAX |
RAX는 시스템 콜 번호 전달과 반환값 수신을 모두 담당하는 핵심 레지스터다.
다음은 리눅스에서 exit(0) 시스템 콜을 호출하는 어셈블리 예제다:
mov rax, 60 ; syscall 번호 60번 = exit
mov rdi, 0 ; 첫 번째 인자 = 종료 코드 0
syscall ; 커널에 요청
mov rax, 60 → 시스템 콜 번호mov rdi, 0 → 인자 설정syscall → 호출| 시스템 콜 이름 | 번호 (RAX에 설정) | 설명 |
|---|---|---|
read | 0 | 파일 읽기 |
write | 1 | 파일 쓰기 |
open | 2 | 파일 열기 |
close | 3 | 파일 닫기 |
exit | 60 | 프로세스 종료 |
getpid | 39 | 현재 프로세스 PID 가져오기 |
※ /usr/include/x86_64-linux-gnu/asm/unistd_64.h 파일에서 syscall 번호 확인 가능
시스템 콜 수행 결과는 커널이 RAX에 반환값을 담아 다시 사용자 영역으로 복귀한다.
예를 들어, open() 시스템 콜의 반환값은 파일 디스크립터 번호고, 이는 RAX에 저장된다.
mov rax, 2 ; syscall: open
mov rdi, filename ; 파일 이름 포인터
mov rsi, 0 ; 읽기 모드
syscall
; RAX에 파일 디스크립터 결과가 저장됨
| 역할 | 설명 |
|---|---|
| 시스템 콜 번호 전달 | 커널에 어떤 기능을 요청할지 지정 (필수) |
| 반환값 수신 | 커널이 처리 후 결과를 반환하는 위치 |
| 필수 순서 | mov rax, <syscall번호> → syscall |
시스템 콜을 이해하려면 RAX의 역할을 명확히 알아야 한다.
RAX는 단순한 산술 레지스터가 아니라 커널과 사용자 공간을 연결하는 관문이다.
실제로 커널 개발, 시스템 프로그래밍, 보안 분석 등 저수준 작업을 하게 될 경우,
RAX와 시스템 콜 인터페이스의 이해는 매우 중요한 기초가 된다.