지금 CSAPP 8장 8.3절에서는 시스템 콜의 에러 처리(error handling)를 다루고 있습니다. 시스템 콜이 실패했을 때 함수는 일반적으로 -1을 반환하고, 전역 변수 errno를 통해 오류 종류를 알려줍니다. 먼저, 이 에러 핸들링 메커니즘을 이해하기 전에 시스템 콜 자체가 무엇인지부터 정리해 보겠습니다.
1. 시스템 콜이란?
1.1 정의
시스템 콜(system call)은 응용 프로그램이 운영체제 커널에 정의된 서비스를 요청하기 위한 공식 인터페이스입니다.
핵심 요약
사용자 공간(User Space)의 프로그램이 커널 영역(Kernel Space)의 자원(파일 I/O, 프로세스 제어, 네트워크 통신 등)을 안전하게 사용하기 위해 반드시 거쳐야 하는 유일한 통로입니다.
1.2 비유로 한눈에 이해하기
- 사용자 영역: 일반 프로그램이 실행되는 안전한 공간.
- 커널 영역: 운영체제의 핵심이 실행되며 모든 자원에 대한 제어 권한을 가집니다.
- 비유: 집 안 거주자는 수도·전기 같은 자원을 직접 제어할 수 없고, 반드시 관리 사무소(커널)에 요청해서 이용해야 하는 것과 같습니다.
2. 왜 시스템 콜이 필요한가?
2.1 보안 유지
직접 하드웨어나 파일 시스템에 접근할 수 있다면 악성 코드가 자유롭게 파일을 삭제·변조하거나 민감 데이터를 유출할 수 있습니다.
2.2 안정성 확보
서로 다른 프로그램이 무분별하게 자원을 제어하면 충돌이 발생하고, 하나의 오류가 전체 시스템을 중단시킬 수 있습니다.
핵심 요약
시스템 콜을 통한 요청만 허용함으로써 커널은 자원 접근을 통제·조정하여 전체 시스템의 보안과 안정성을 보장합니다.
3. 시스템 콜 동작 원리
시스템 콜은 다음 네 단계로 처리됩니다.
단계 | 설명 | 비유 |
1. 요청 준비 | 호출 번호(syscall number)와 매개변수를 레지스터 또는 스택에 저장 | 사무소에 제출할 서류 양식 작성 |
2. 트랩 발생 | int 0x80(x86) 또는 syscall 명령어로 cPU를 커널 모드로 전환 | 호출 벨 누르기 |
3. 커널 처리 | 시스템 콜 테이블에서 번호에 해당하는 핸들러 함수를 찾아 실행 | 담당 공무원이 서류 접수 후 처리 |
4. 결과 반환 | 성공 시 반환 값, 실패 시 -1과 errno 설정 후 사용자 모드로 복귀 | 처리 결과 안내문 받기 |
4. 시스템 콜 분류 및 주요 예시
4.1 분류 기준
대표적인 시스템 콜은 프로세스 제어, 파일 관리, 장치 제어, 정보 조회, 통신(IPC/네트워크)으로 나뉩니다.
분류 | 함수 예시 | 주요 인자/반환 값 | 비유 |
프로세스 제어 | fork(), execve() | fork(): () → childPID(0)/-1 execve(path,argv,envp) → -1 |
새로운 사람 복제/변신 |
파일 관리 | open(), read(), write(), close() | open(path,flags) → fd/-1 read(fd,buf,n) → bytes write(fd,buf,n) → bytes |
서류 꺼내기/읽기/작성/반납 |
장치 제어 | ioctl(), lseek() | ioctl(fd,req,arg) → 0/-1 lseek(fd,off,whence) → newOff |
수도꼭지·보일러 조절 |
정보 조회 | getpid(), sleep() | getpid(): → PID sleep(sec) → 0 |
내 정보 조회/알람 설정 |
통신(IPC/네트워크) | pipe(), socket(), mmap() | pipe(fds) → 0/-1 socket(dom,type,proto) → sd/-1 |
쪽지 주고받기/전화 통화/게시판 공유 |
'CSAPP > 8장' 카테고리의 다른 글
[CSAPP] 8 예외적인 제어 흐름(Exceptional Control Flow) 8.4 ~ 8.8 (1) | 2025.04.21 |
---|---|
[CSAPP] 8 예외적인 제어 흐름(Exceptional Control Flow) 8.1 ~ 8.3 (0) | 2025.04.19 |