System Call: 응용 프로그램이 커널에게 일을 부탁하는 통로

응용 프로그램(User level code)이 하드웨어를 조작하고 싶을 때 무엇을 할까?

응용 프로그램(유저 레벨 코드)은 하드웨어를 직접 만질 수 없으므로, 운영체제(OS)가 대신 해준다. 프로세스가 커널에게 무언가를 “요청” 하는 공식 통로가 바로 System Call이다.

  • “파일을 열어 줘(open)”, “데이터를 읽어 줘(read)”, “새 프로세스를 만들어 줘(fork)” 같은 요구를 전달한다
  • 커널은 트랩(trap) 을 통해 특권 모드(커널 모드)로 올라가 작업을 수행한 뒤, 결과(보통 레지스터 값 또는 errno)를 돌려주고 사용자 모드로 복귀한다

1. 호출 흐름 (리눅스 x86-64 예)

단계 사용자 공간 커널 공간
1 라이브러리 wrapper 함수 호출 (read(int fd, void *buf, size_t n))
2 시스템 콜 번호와 인수를 레지스터에 적재 후 syscall(또는 int 0x80) 실행 트랩 발생 → 권한 레벨 전환, 커널 스택 진입
3 디스패처가 번호를 해석해 핸들러(sys_read) 호출 → 실제 I/O 수행, 파일 테이블 등 갱신
4 반환값을 레지스터에 넣고 sysret
5 wrapper가 반환값이 음수면 errno 설정 후 반환

이 과정에서 일어나는 컨텍스트 스위치(레지스터·프로그램 카운터·스택 교체)는 수십~수백 나노초가 걸리므로, 시스템 콜은 일반 함수 호출보다 느리다.

2. 대표 범주

범주 대표 시스템 콜 설명·용도
프로세스 제어 fork, execve, waitpid, exit 프로세스 생성·변경·종료
파일 I/O open/close, read/write, lseek, stat 디스크·파이프·소켓 I/O를 통일한 인터페이스 (“Everything is a file”)
장치 제어 ioctl, mmap, munmap 특수 장치 제어, 파일 매핑 등
메모리 관리 brk, mmap 힙 확장 (malloc 내부에서 사용)

3. 요약

System Call은 사용자 모드와 커널 모드를 잇는 다리다.

  1. 응용 프로그램은 하드웨어를 직접 못 만지므로, 커널에게 작업을 요청한다
  2. 요청은 트랩을 통해 커널 모드로 전환되어 처리되고, 결과는 다시 사용자 모드로 돌아온다
  3. 모드 전환(컨텍스트 스위치) 비용이 있어 함수 호출보다 느리므로, 잦은 시스템 콜은 성능 병목이 될 수 있다

© 2022 JeongHwan Yun.