
page: 가상 메모리의 연속적인 영역
frame: 물리 메모리의 연속적인 영역
page table: 가상 주소를 물리 주소로 변환하는 자료구조
eviction: 페이지를 프레임에서 제거하고 swap table이나 파일 시스템에 잠재적으로 write하는 것
swap table : swap partition에서 evicted pages가 written 되는 곳

page ↔ frame)frame = frame_number + offset가상 주소(VA) → 물리 주소(PA)로 변환하는 4단계 테이블 구조
VA
↓
PML4[VA >> 39] → PDPT
↓
PDPT[VA >> 30] → PD
↓
PD[VA >> 21] → PT
↓
PT[VA >> 12] → Physical Frame
↓
+ VA의 마지막 12비트 offset → 최종 물리 주소


Page Fault → 페이지 불러오기
유저 프로그램이 아직 메모리에 올라오지 않은 페이지에 접근함
→ Page Fault 발생
→ page_fault()에서 처리
→ SPT를 참고해서 적절히 처리
⸻
Page Fault 발생
• rcr2() 로 fault 주소 가져옴
• 커널 주소 or 이상한 접근이면 → 바로 종료
SPT에서 페이지 정보 찾기
page = spt_find_page(fault_addr);
없으면: 종료 (invalid access)
있으면: 어떤 타입인지 확인 (파일, 스왑, all-zero 등)
프레임 확보 (vm_do_claim_page)
• 유저 프레임 할당 (palloc_get_page(PAL_USER))
• 프레임 테이블에 기록 (누가 사용하는 중인지 등)
• 여유 프레임 없으면 → eviction(교체) 수행
⸻
프레임 테이블이란?
• 메모리에 있는 모든 “프레임”을 추적하는 자료구조
• 각 프레임은 누가 사용 중인지(struct page *) 들고 있음
프레임이 없을 때는?
• evict_frame() 호출
• 교체할 프레임 고르기 (알고리즘 기반, e.g. clock)
• accessed, dirty 비트를 사용
• 해당 페이지를 파일에 쓰거나, 스왑에 저장
accessed / dirty 비트?
• 하드웨어가 자동으로 설정
• OS는 이 비트를 보고: “최근에 사용됐는지” “수정됐는지” 판단함
• OS가 비트를 리셋해서 다시 체크 가능
⸻
• 디스크의 “스왑 슬롯” 상태 추적 (비어있는지/사용중인지)
페이지를 스왑할 때
• 여유 슬롯 찾아서 저장
• 슬롯 번호를 SPTE에 저장
다시 메모리에 올릴 때
• 해당 슬롯에서 읽어서 메모리에 복원
• 복원되면 스왑 슬롯은 다시 free
⸻
| 유형 | 설명 | 처리 방식 |
|---|---|---|
| 파일 기반 페이지 | 코드, 데이터 영역 | file_read_at() 사용 |
| 스왑된 페이지 | 교체되며 스왑에 저장 | swap_in() 사용 |
| all-zero 페이지 | 초기화 영역 | memset(frame, 0, PGSIZE) 사용 |
⸻
mmap()은 파일을 가상 주소 공간에 직접 매핑page_fault()이 발생하면 → 해당 파일에서 읽어서 메모리에 올림munmap() 호출 시:⸻