시스템 콜(system call)
시스템 콜(System Call)은 운영체제의 커널이 제공하는 서비스에 대해,
응용 프로그램이 커널에 접근하기 위한 인터페이스입니다.
응용 프로그램 ——————→ 커널
( System Call)
간단히 말해서, 사용자 프로그램이 특권 명령(하드웨어 제어, 파일 접근 등)을 수행해야 할 때,
운영체제에게 "이거 좀 대신 해주세요!"라고 요청하는 방법이에요.
우리가 사용하는 프로그램들은 직접 하드웨어를 건드릴 수 없어요.
왜냐하면:
- 보안상 위험해요 (해커의 악의적 접근)
- 시스템이 불안정해질 수 있어요 (초보자의 실수)
- 여러 프로그램이 동시에 하드웨어를 제어하면 충돌이 일어나요
그래서 운영체제가 중간에서 안전하게 모든 하드웨어를 관리하고,
프로그램들은 시스템 콜을 통해 정중하게 부탁해야 합니다.
집에 비유하면?
- 운영체제 = 집주인
- 애플리케이션 = 세입자
- 시스템 콜 = 세입자가 집주인에게 하는 요청
세입자가 "전기 좀 써도 될까요?", "화장실 좀 써도 될까요?" 하고 물어보는 것처럼,
프로그램도 "파일 좀 읽어도 될까요?", "네트워크 좀 써도 될까요?" 하고
시스템 콜을 통해 요청하는 거예요.
시스템 콜이 동작하는 원리
시스템 콜 테이블
모든 시스템 콜에는 고유한 번호가 할당되어 있어요.
운영체제는 시스템 콜 테이블이라는 것을 관리하는데,
이 테이블에는:
- 시스템 콜 번호
- 해당 기능을 처리하는 함수의 주소
가 저장되어 있어요.

시스템 콜 실행 과정
- 프로그램에서 `open()` 같은 시스템 콜 호출
- CPU가 커널 모드로 전환
- 운영체제가 시스템 콜 테이블에서 해당 번호 찾기
- 해당 인덱스가 가리키는 주소의 루틴 실행
- 작업 완료 후 인터럽트 발생으로 완료 알림
- 사용자 모드로 복귀
사용자 모드 vs 커널 모드
CPU는 보안을 위해 두 가지 모드로 동작해요.
Mode bit라는 것으로 구분하는데:
- 0: 커널 모드
- 1: 사용자 모드

사용자 모드 (User Mode) - Ring 3
- 일반 애플리케이션이 실행되는 공간
- PC(Program Counter) 레지스터가 사용자 프로그램 영역을 가리킬 때
- 일반 명령만 실행 가능 (메모리 읽기/쓰기, CPU 계산 등)
- 하드웨어에 직접 접근 불가능 ❌
- 잘못된 접근 시 즉시 trap 발생하여 프로세스 종료
- 각 프로세스는 독립된 메모리 공간 사용
- 안전하지만 제한적
커널 모드 (Kernel Mode) - Ring 0
- 운영체제와 드라이버가 실행되는 공간
- PC 레지스터가 운영체제 코드 영역을 가리킬 때
- 특권 명령 실행 가능 (I/O 장치 제어, 타이머 설정 등)
- 모든 하드웨어 자원에 접근 가능 ✅
- 모든 메모리 영역 접근 가능
- 강력하지만 위험
왜 이렇게 나누나요?
인텔 x86 CPU의 `HLT` 명령어를 예로 들어볼게요.
이 명령어는 CPU를 완전히 멈춰버릴 수 있어요.
만약 일반 프로그램에서 이런 명령어를 마음대로 쓸 수 있다면?
컴퓨터가 먹통이 되겠죠!
그래서 이런 위험한 명령어들은 커널 모드에서만 실행할 수 있게 제한하는 거예요.
시스템 콜의 6가지 종류
1. 프로세스 제어 (Process Control)
프로그램의 생명주기를 관리해요.
- `exit()`, `abort()` - 프로그램 종료/중지
- `fork()` - 새로운 프로세스 생성
- `exec()` - 프로그램 실행
- `wait()` - 다른 프로세스 기다리기
- 메모리 할당/해제
예시: "새로운 프로그램을 실행해주세요!"
2. 파일 조작 (File Manipulation)
파일과 관련된 모든 작업을 담당해요.
- `open()`, `close()` - 파일 열기/닫기
- `read()`, `write()` - 파일 읽기/쓰기
- `create()`, `delete()` - 파일 생성/삭제
예시: "이 파일을 읽어서 화면에 보여주세요!"
3. 장치 관리 (Device Management)
하드웨어 장치들을 제어해요.
- `ioctl()` - 하드웨어 제어
- 키보드, 마우스, 프린터 등 관리
- 장치 연결/해제
예시: "프린터로 이 문서를 출력해주세요!"
4. 정보 유지 (Information Maintenance)
시스템 정보를 관리해요.
- `getpid()` - 프로세스 ID 확인
- `time()`, `date()` - 현재 시간/날짜 조회
- `sleep()`, `alarm()` - 잠시 대기/알람 설정
- 시스템 데이터 확인/설정
예시: "현재 시간이 몇 시인지 알려주세요!"
5. 통신 (Communication)
프로세스 간 데이터 교환을 도와요.
- `pipe()` - 파이프 통신
- `mmap()` - 메모리 맵핑
- `shm_open()` - 공유 메모리
- 네트워크 통신
- 원격 장치 연결
예시: "다른 프로그램과 데이터를 주고받고 싶어요!"
6. 보호 (Protection)
보안과 권한을 관리해요.
- `chmod()` - 파일 권한 변경
- `chown()` - 파일 소유자 변경
- `umask()` - 기본 권한 설정
예시: "이 파일을 읽기 전용으로 만들어주세요!"
실제 예시: 파일 복사하기
리눅스에서 `cp in.txt out.txt` 명령어를 입력했을 때
어떤 시스템 콜들이 순차적으로 호출될까요?

단계별 시스템 콜 호출 과정

1. 사용자 입력 받기
- I/O 시스템 콜 호출로 키보드 입력을 받아요
2. 'in.txt' 파일 접근 가능 확인
- 파일 존재 여부를 확인하는 시스템 콜 호출
- 접근 불가능하면 → 에러 발생 → 프로그램 종료 시스템 콜 호출
3. 'out.txt' 파일명 검사
- 출력 파일명이 이미 존재하는지 확인하는 시스템 콜 호출
4. 파일 처리
- 파일이 존재하면 → 덮어쓸지 사용자에게 물어보기
- 파일이 없으면 → 새로 생성하기
- 두 경우 모두 시스템 콜 사용
5. 실제 파일 복사
- 원본 파일 읽기 시스템 콜
- 대상 파일 쓰기 시스템 콜
이렇게 간단한 파일 복사 하나에도 수많은 시스템 콜이 사용되는 거예요!
드라이버는 뭔가요?
드라이버는 운영체제와 하드웨어 사이의 번역기예요!
관계 정리
- 애플리케이션 ↔ 운영체제: 시스템 콜
- 운영체제 ↔ 하드웨어: 드라이버
하드웨어마다 특성이 다르기 때문에,
각 하드웨어 제조사에서 "우리 제품은 이렇게 사용해주세요"라는 설명서(드라이버)를 만들어서 제공하는 거예요.
예시로 이해하기
그래픽 카드를 새로 샀다고 생각해보세요:
- 하드웨어 = 그래픽 카드
- 드라이버 = NVIDIA나 AMD에서 제공하는 소프트웨어
- 운영체제가 드라이버를 통해 그래픽 카드와 소통
정리하면
핵심 포인트
- 시스템 콜은 사용자 프로그램이 운영체제의 도움을 받기 위한 유일한 방법
- 커널 모드에서만 특권 명령 실행 가능, 사용자 모드에서는 일반 명령만 가능
- 모든 하드웨어 접근은 반드시 시스템 콜을 통해야 함
- 시스템 콜 테이블을 통해 효율적으로 관리됨
우리가 컴퓨터를 사용할 때마다...
- 파일을 클릭해서 열 때 → `open()` 시스템 콜
- 키보드로 타이핑할 때 → I/O 시스템 콜
- 인터넷에 접속할 때 → 네트워크 시스템 콜
- 화면에 뭔가 표시할 때 → 그래픽 시스템 콜
모든 동작 뒤에는 시스템 콜이 숨어있어요!
직접 시스템 콜을 호출하기보다는 보통 라이브러리나 API를 통해 간접적으로 사용하지만,
결국에는 모든 프로그램이 시스템 콜 없이는 아무것도 할 수 없다는 거죠.
왜 이렇게 복잡하게?
시스템 콜과 모드 분리 덕분에 우리는:
- 안전한 컴퓨터 환경을 가질 수 있어요
- 안정적인 멀티태스킹이 가능해요
- 보안이 강화된 시스템을 사용할 수 있어요
만약 모든 프로그램이 하드웨어에 직접 접근할 수 있다면? 컴퓨터는 매번 먹통이 되고,
해킹도 쉬워지고, 프로그램들끼리 충돌이 계속 일어날 거예요.
시스템 콜은 안전과 편의의 완벽한 균형을 제공하는 운영체제의 멋진 설계라고 할 수 있어요!