사용자 공간(App)이 커널 공간(OS)의 기능을 빌려 쓰기 위한 '공식 요청 창구(API)'
리눅스는 '모든 것이 파일'이라는 철학에 따라, 하드웨어 제어(드라이버)도 파일 시스템 호출을 공유함
사용자 어플리케이션이 운영체제(커널)의 자원이나 서비스를 요청하기 위해 커널 모드로 진입하는 관문. 시스템 콜 = 커널 API 라고도 부른다.(외부로 노출된 커널 함수).
read(), write()get_thread_area()set_tid_address()CPU 아키텍처마다 커널 모드로 전환(Context Switch)하기 위한 어셈블리 명령어가 다릅니다.
| 아키텍처 | 호출 명령어 (Trigger) | 비고 |
|---|---|---|
| i386 (32bit) | int 0x80 | 레거시 인터럽트 방식 |
| x86_64 (64bit) | syscall | 고속 시스템 콜 전용 명령어 (약 300여 개 존재) |
| ARM / EABI | swi 0x18 | Software Interrupt (또는 svc) |
개발자가 어셈블리(int 0x80 등)를 직접 짜지 않아도 되는 이유는 C 라이브러리(glibc)가 감싸주고 있기 때문입니다.
glibc (GNU C Library) 내부에 존재open() (Wrapper Routine)sys_open (System Call Handler)| 관리 영역 (Subsystem) | 역할 | 대표 시스템 콜 |
|---|---|---|
| 프로세스 관리 | 프로세스 생성, 실행, 제어, 신호 처리 | fork(), execve(), getpid(), signal() |
| 파일 시스템 | 파일 열기, 읽기/쓰기, 닫기 | open(), read(), write(), close() |
| 메모리 관리 | 데이터 세그먼트 크기 변경 (힙 메모리 할당) | brk(), sbrk() |
| 네트워크 | 소켓 통신 연결 및 데이터 전송 | socket(), bind(), connect(), listen(), accept() |
| 디바이스 드라이버 | 독자적인 시스템 콜 없음 (파일 시스템 콜을 빌려 씀) | open, read, write, ioctl()(하드웨어 제어 핵심) |
/dev/ 아래의 특수 파일(Device File)로 취급됩니다.open, read, write)을 그대로 사용하여 하드웨어를 제어합니다.write() 사용, 센서 설정을 바꾸기 위해 ioctl() 사용.하드웨어를 제어하는 소프트웨어를 디바이스 드라이버라고 한다.
Wrapper(요청 준비) → Interrupt(커널 진입) → Handler(실제 수행) → Return(복귀) 의 순환 과정
open(), read() 등 표준 함수 호출int 0x80 (소프트웨어 인터럽트)sysenter 또는 syscall (고속 전용 명령)sys_open, sys_read)iret (Interrupt Return)sysexit 또는 sysret

swi : 소프트웨어 인터럽트
레지스터에 '주문 번호(Syscall No)'를 넣고 SVC 명령을 실행하면, CPU가 익셉션 벡터(Exception Vector)로 점프하여 커널 모드로 진입
x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어와 레지스터가 다릅니다.
x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어와 레지스터가 다릅니다.
glibc 래퍼가 레지스터에 인자값과 시스템 콜 번호를 저장SVC (Supervisor Call) 명령어 실행 (구 SWI)vector_swi(32bit) 또는 el0_svc(64bit) 루틴이 실행됨개발자가 가장 신경 써야 할 "데이터 전달 약속"입니다.
| 구분 | ARM 32-bit (EABI) | ARM 64-bit (AArch64) | 비고 |
|---|---|---|---|
| 명령어 | svc 0 (또는 swi) | svc 0 | Supervisor Call |
| 시스템 콜 번호 | R7 | X8 | "몇 번 함수 실행해줘?" |
| 인자 (Args) | R0 ~ R6 | X0 ~ X5 | 함수 파라미터 전달 |
| 결과값 (Return) | R0 | X0 | 실행 결과 (성공/에러) |
| 모드 전환 | User → SVC Mode | EL0 → EL1 | Exception Level 상승 |
open() 호출.glibc 내부:R0 = 파일 경로 포인터R1 = 플래그 (Read/Write)R7 = 5 (open의 시스템 콜 번호)svc 0 실행!SVC 명령을 만나면 CPU는 하드웨어적으로 정해진 주소(Vector Base Address + Offset)로 강제 점프함.entry-common.S)가 실행됨.sys_call_table에서 R7(또는 X8)에 해당하는 함수 주소를 찾음.sys_open 함수 실행.sys_open이 파일 디스크립터(fd)를 반환.R0(또는 X0)에 저장.movs pc, lr (32bit) 또는 eret (64bit) 명령어로 유저 모드 복귀.