둘 다 예외긴 한데, 핀토스 코드에서 어떤 차이가 있는걸까?
정의
시스템 콜(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
복사

