Page Fault (페이지 폴트)

Devkty·2025년 6월 2일

Page Fault (페이지 폴트)

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

발생하는 이유

Lazy Loading: 프로그램 시작 시 전체 메모리를 로드하지 않고, 접근 시 로딩

Swapping: 메모리가 부족해 디스크로 내린 페이지를 다시 올릴 때

Stack Growth: 스택이 점진적으로 확장될 때

잘못된 접근: 존재하지 않는 주소(NULL 등)에 접근시. (segmentation fault)

처리 흐름

페이지 폴트가 발생하면 다음과 같은 절차로 처리됩니다.

  1. CPU가 예외(Page Fault Exception)를 발생시킵니다.
  2. 커널의 page fault handler 실행합니다.
  3. 해당 가상 주소에 대한 원인을 다음과 같이 분석합니다.
    • 페이지가 disk에 있는지?
    • heap/stack growth인지?
    • 완전한 잘못된 접근인지?
  4. 필요하다면 다음 세가지를 수행할 수 있습니다.
    • 디스크에서 페이지 로드
    • 새 페이지를 메모리에 할당
    • 페이지 테이블에 매핑 등록
  5. 다시 원래 명령어를 재실행합니다.

만약, 실패할 경우 → Segmentation Fault OR Page Fault Panic 를 출력합니다.

Pintos에서…

주요 경로 요약하면 다음과 같습니다.

  1. userprog/exception.cpage_fault() 함수가 호출됩니다.
  2. vm.cvm_try_handle_fault() 내부에서 원인을 파악하고 처리 시도합니다.
  3. page.c → 해당 주소에 매핑된 struct page 검색 (spt_find_page())
  4. 페이지가 없으면 유형에 따라 처리됩니다.
    • Anonymous page면: zero page or swap-in
    • File-backed page면: lazy load from file
  5. 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() → 페이지 타입에 따라 처리
profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글