거대한 콘서트장에 있다고 상상해 보세요. 일반 관객석에서 특별 백스테이지로 이동하려면 그냥 걸어갈 수 없습니다. 특정 경비가 지키는 문을 통과할 수 있는 특별한 패스가 필요합니다. 컴퓨팅 세계에서 **시스템 호출 (system calls)**은 바로 그러한 특별한 패스입니다.
시스템 호출이란 무엇인가?
시스템 호출 (System calls) 은 종종 'syscalls'로 약칭되며, 사용자 공간 (user-space) 프로세스가 커널에 직접 서비스를 요청할 수 있는 방법을 제공합니다. 커널은 시스템 호출 API 를 통해 일련의 서비스를 노출합니다. 이러한 서비스는 파일 읽기/쓰기, 메모리 관리, 네트워크 연결 처리와 같은 작업에 필수적입니다. 사용 가능한 시스템 호출의 수는 고정되어 있으며 임의로 새로 추가할 수 없습니다. 시스템은 각 시스템 호출이 고유 ID 로 등록된 syscall 테이블을 유지 관리합니다.
리눅스의 시스템 호출 메커니즘
ls와 같은 프로그램을 실행할 때, 그 안에 있는 코드가 시스템 호출 리눅스 (system call linux) 명령을 직접 실행하는 것이 아닙니다. 대신, 래퍼 (wrapper) 역할을 하는 라이브러리 함수를 사용합니다. 이 래퍼 함수는 필요한 매개변수를 설정한 다음 소프트웨어 인터럽트, 즉 "트랩 (trap)"을 발생시킵니다.
이 트랩은 프로세서에게 권한이 없는 사용자 모드에서 권한이 있는 커널 모드로 전환하도록 신호를 보냅니다. 커널 모드에 들어가면 시스템 호출 핸들러가 작업을 인계받습니다. 핸들러는 고유 ID 를 사용하여 syscall 테이블에서 요청된 함수를 조회한 다음 실행합니다. 예를 들어, 파일 상태를 쿼리하는 데 사용되는 stat() 시스템 호출은 이러한 방식으로 찾아 실행됩니다. 커널이 작업을 완료하면 컨텍스트를 사용자 모드로 다시 전환하고 성공 또는 오류를 나타내는 상태 코드를 프로세스에 반환합니다.
strace 를 사용하여 시스템 호출 보기
strace 명령을 사용하면 프로세스가 실시간으로 수행하는 시스템 호출을 관찰할 수 있습니다. 이 도구는 디버깅과 프로그램이 커널과 상호 작용하는 방식을 이해하는 데 매우 유용합니다.
ls 명령이 수행하는 시스템 호출을 보려면 다음을 실행합니다.
strace ls
그러면 ls가 실행되는 동안 수행하는 모든 시스템 호출에 대한 자세한 목록이 출력됩니다.