Page Fault는 CPU가 아직 메모리에 존재하지 않는 가상 주소를 접근하려고 할 때 발생하는 예외(Exception)입니다.

Lazy Loading: 프로그램 시작 시 전체 메모리를 로드하지 않고, 접근 시 로딩
Swapping: 메모리가 부족해 디스크로 내린 페이지를 다시 올릴 때
Stack Growth: 스택이 점진적으로 확장될 때
잘못된 접근: 존재하지 않는 주소(NULL 등)에 접근시. (segmentation fault)
페이지 폴트가 발생하면 다음과 같은 절차로 처리됩니다.
만약, 실패할 경우 → Segmentation Fault OR Page Fault Panic 를 출력합니다.

주요 경로 요약하면 다음과 같습니다.
userprog/exception.c → page_fault() 함수가 호출됩니다.vm.c → vm_try_handle_fault() 내부에서 원인을 파악하고 처리 시도합니다.page.c → 해당 주소에 매핑된 struct page 검색 (spt_find_page())pml4_set_page()로 페이지 테이블에 매핑 등록/* Page fault handler */
static void
page_fault (struct intr_frame *f) {
void *addr = f->cr2; // faulting address
vm_try_handle_fault (f, addr, user, write, not_present);
}
Pintos에서는 Page Fault가 다음과 같은 상황에 발생할 수 있습니다.
| 상황 | 처리 방식 |
|---|---|
exec() 실행 시 지연 로딩 | lazy_load_segment()에서 aux 정보로 나중에 로딩 |
malloc() 후 첫 사용 | anonymous page 할당 후, 접근 시 frame 할당 |
esp 확장(stack growth) | vm_stack_growth()에서 새 페이지 할당 |
| 스왑 아웃된 페이지 접근 | swap_in()으로 다시 불러옴 |
| 항목 | 설명 |
|---|---|
| Page Fault란? | 아직 메모리에 없는 페이지 접근 시 발생하는 예외 |
| 발생 원인 | lazy loading, swap, stack growth, 잘못된 접근 등 |
| 처리 과정 | fault → handler → 원인 파악 → 메모리 확보 → 매핑 등록 → 재시도 |
| OSTEP 개념 | 주소 변환 실패 → OS介입 → 물리 프레임 할당 및 page table 수정 |
| Pintos 구현 | page_fault() → vm_try_handle_fault() → 페이지 타입에 따라 처리 |