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 생성 전체 흐름
- 예약 (Reservation)
page → type = VM_UNINIT, init = anon_initializer, aux = NULL 로 SPT 저장.setup_stack() └ vm_alloc_page_with_initializer(VM_ANON, stack_bottom, true /*writable*/, anon_initializer, NULL) - Page Fault 도착
CPU not‑present fault ▶page_fault()▶vm_try_handle_fault() - 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) - anon_swap_in()
kva이미 0‑fill.page->frame = frame,frame->page = page연결.pml4_set_page(pml4, page->va, kva, page->writable)
- (선택) 스택 성장
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)를 기반으로 작성됨.
'개발' 카테고리의 다른 글
| Pintos Project 3 — Memory‑Mapped Files 구현 흐름 (0) | 2025.06.14 |
|---|---|
| Pintos Project 3 — Stack Growth 구현 흐름 & page_fault 분석 (0) | 2025.06.13 |
| Pintos VM Project - lazy_load_segment & fork-read 디버그 (0) | 2025.06.05 |
| [Pintos] 타이머 인터럽트 때문에 랜덤 커널 패닉이 터진 이유와 해결 방법 (0) | 2025.05.29 |
| [Pintos] userprog- exec 개발하면서 겪었던 문제 (0) | 2025.05.27 |