Search

시스템 콜 vs 페이지 폴트

둘 다 예외긴 한데, 핀토스 코드에서 어떤 차이가 있는걸까?

정의

시스템 콜(System Call)

Trap이라고도 함
사용자 프로그램이 의도적으로 운영체제의 서비스를 요청하기 위해 발생시키는 소프트웨어적인 예외 (동기적으로 발생하며, 시스템 콜이 대표적인 예시)
예시 : 파일 열기 / 쓰기 / 읽기, 프로세스 생성 등

페이지 폴트(Page fault)

프로그램 실행 중에 발생하는 예상치 못한 문제로, 대개 프로그램의 버그나 잘못된 동작으로 인해 발생 (오류는 복구 가능)

차이

시스템 콜
페이지 폴트
의도성
의도적(사용자 프로그램이 요청)
비의도적(자동 발생)
명령어
syscall
메모리 접근
분류
Software Interrupt
Exception(Fault)
번호
인터럽트 벡터 0x80
인터럽트 벡터 14

예시

테스트 코드를 예시로 들어보겠습니다

시스템 콜

write-normal.c
int main(void) { int fd; // 1. create 시스템 콜 (의도적 호출) CHECK(create("test.txt", 100), "create test.txt"); // 2. open 시스템 콜 (의도적 호출) CHECK((fd = open("test.txt")) > 1, "open test.txt"); // 3. write 시스템 콜 (의도적 호출) char buf[100] = "Hello World"; CHECK(write(fd, buf, 11) == 11, "write test.txt"); return 0; }
C
복사
동작 과정은 다음과 같습니다 :
사용자: write(fd, buf, 11) ↓ (syscall 명령어) 커널: syscall_handler() ↓ 커널: sys_write() 실행 ↓ 사용자: 결과 반환
Markdown
복사

페이지 폴트

pt-grow-stack.c
int main(void) { // 사용자는 그냥 배열 선언 (시스템 콜 없음!) int array[1024]; // 4KB 배열 // 배열 사용 (그냥 메모리 접근) for (int i = 0; i < 1024; i++) { array[i] = i; // 페이지 폴트 자동 발생! } return 0; }
C
복사
동작 과정은 다음과 같습니다 :
사용자: array[0] = 0 (그냥 메모리 접근) ↓ CPU: "이 주소에 페이지 없네?" (자동 감지) ↓ (Exception #14) 커널: page_fault() 자동 호출 ↓ 커널: vm_try_handle_fault() ↓ 커널: vm_claim_page() (스택 증가) ↓ 사용자: 계속 실행 (사용자는 모름)
Markdown
복사