Pintos Project 3: Anonymous Page 구현 흐름 집중 해부

2025. 6. 12. 15:34개발

 

 

Pintos Project 3 ⸺ Anonymous Page 구현 흐름

0. 개념 스냅샷

  • Anonymous Page : 실행 파일 블록이 없고, “접근 시 0‑fill” 로 초기화되는 가상 페이지. 주 용도는 스택·힙·BSS.
  • 핵심 특징 : 예약 단계 RAM 사용 0 → 접근 때 Fault In → palloc + 0‑fill → PTE 매핑.

1. GitBook 기준 필수 함수 & 테스트 함수 매핑

함수 역할 (GitBook 섹션) 테스트에서 호출 지점
supplemental_page_table_init 쓰레드 생성 시 SPT 해시 초기화 (vm_management) 커널 부팅 Self‑test
vm_alloc_page_with_initializer 가상 주소 예약. type=VM_ANON + anon_initializer 저장(anon) setup_stack(), load BSS
anon_initializer UNINIT→ANON 전환·page->operations = &anon_ops 첫 page fault 시 자동
vm_get_frame 빈 물리 프레임 할당(PAL_USER|PAL_ZERO) & 메타 등록 vm_do_claim_page()
anon_swap_in kva 0‑fill, PTE 매핑 (Demand Paging) page fault 핸들러 경로
vm_claim_page SPT→Frame 연결·swap_in 호출·락 관리 모든 not‑present fault
vm_try_handle_fault user fault → SPT 조회 → vm_claim_page 하드웨어 Page‑Fault ISR
setup_stack USER_STACK –PGSIZE 예약+claim (시작 스택) process_exec()

2. Anonymous Page 생성 전체 흐름

  1. 예약 (Reservation)
    setup_stack()
      └ vm_alloc_page_with_initializer(VM_ANON, stack_bottom,
                                       true /*writable*/, anon_initializer, NULL)
    
    page → type = VM_UNINIT, init = anon_initializer, aux = NULL 로 SPT 저장.
  2. Page Fault 도착
    CPU not‑present fault ▶ page_fault()vm_try_handle_fault()
  3. SPT Lookup & Claim
    page = spt_find_page(spt, va);
    vm_claim_page(va)      /* 내부 */
      └ vm_get_frame()     /* PAL_USER|PAL_ZERO 프레임 확보 */
      └ anon_swap_in(page, frame->kva)
    
  4. anon_swap_in()
    • kva 이미 0‑fill.
    • page->frame = frame, frame->page = page 연결.
    • pml4_set_page(pml4, page->va, kva, page->writable)
    Fault 재시도 시 정상 실행.
  5. (선택) 스택 성장
    Fault 주소가 SP – 8 && addr < USER_STACK_TOP && … 조건 → 추가 vm_alloc_page_with_initializer(VM_ANON, new_bottom, …)로 연속 성장.

3. 핵심 체크리스트 (테스트 기준)

  • echo hi / args‑none : 스택 1 page + BSS 예약·클레임 통과
  • read‑boundary : File‑backed + Anon 공존 테스트
  • multi‑oom : 수백 개 ANON fault‑in → 프레임 부족 시 PANIC 없이 claim (swap 미구현이면 메모리 크게 할당)

본 문서는 KAIST Pintos GitBook (anon section)과 실습 코드(userprog/vm)를 기반으로 작성됨.