https://gyumingomin.tistory.com/94
vm - Page Fault 구현
https://gyumingomin.tistory.com/92 Pintos - vm [페이지 할당 초기화 과정을 위한 흐름도]https://gyumingomin.tistory.com/91 Pintos - SPT(Supplemental Page Table)와 Hash TableSPT(Supplemental Page Table)에서 hash table을 왜 쓸까?Pintos V
gyumingomin.tistory.com
위 글을 먼저 보고 오시면 많은 도움이 됩니다 (아마두)
접은글 : vm_try_handle_fault 구현 코드
1. vm_do_claim_page
접은글 : vm_do_claim_page 구현
1. vm_get_frame()으로 사용할 물리 프레임을 확보한다.
2. 확보한 frame과 page fault가 발생한 page를 서로 연결한다.
3. pml4_set_page()로 현재 프로세스의 pml4에 page->va → frame->kva 매핑을 추가한다.
4. swap_in()을 호출해서 해당 page의 내용을 실제 메모리 frame->kva에 올린다.
ⓐ. vm_get_frame();
이 코드를 구현하기에 앞서 전역 frame_table을 만들어 줘야 한다.




전역 테이블을 생성한 후, vm_get_frame에서 물리 프레임 영역 할당
접은글 : vm_get_frame() 구현
1. 커널 힙에서 struct frame 메타데이터를 동적 할당한다. 할당에 실패하면 NULL을 반환
2. 유저 프로세스용 물리 페이지를 user pool에서 할당받아 frame->kva에 저장하고, 아직 어떤 page와도 연결되지 않았으므로 frame->page는 NULL로 초기화
3. user pool 할당에 성공하면 새 frame을 frame table에 등록한다. 실패하면 방금 만든 frame 메타데이터는 해제하고, vm_evict_frame()으로 기존 frame table에서 희생 프레임을 골라 비운 뒤 재사용한다.
1 - ⓑ. vm_evict_frame();
접은글: vm_evict_frame 구현
1. vm_get_victim()을 호출해 eviction 대상 frame을 선택한다.
2. victim frame이 들고 있던 page를 가져와 swap_out(page)를 호출한다.
이때 page 타입에 따라 swap disk에 저장하거나, file-backed page라면 파일에 write-back한다.
3. pml4_clear_page()로 기존 page의 가상주소 매핑을 제거한다.
즉 owner 프로세스의 page table에서 page->va가 더 이상 victim frame을 가리키지 않게 한다.
4. page->frame과 victim->page 연결을 끊어서 victim frame을 빈 frame 상태로 만든 뒤 반환한다.
1 - ⓒ. vm_get_victim();
접은글: vm_get_victim 구현
1. frame table을 동시에 수정하지 못하도록 frame_lock을 걸고, frame_table이 비어있다면 victim을 고를 수 없으므로 PANIC 처리한다.
2. clock_hand elem가 없거나, 리스트 끝을 가리킨다면, frame_table의 처음 위치로 초기화한다.
3. clock_hand가 가리키는 frame을 확인하고, 그 frame이 연결 중인 page를 가져온다.
4. clock_hand elem는 다음 frame elem로 이동시키고, 만약 끝까지 갔다면, 다시 처음으로 되돌린다.
5. 만약 frame에 연결된 page가 없다면 (즉 비어 있는 frame), 바로 victim으로 반환한다.
6. page가 존재한다면 해당 page의 accessed bit를 확인하고, accessed bit가 1이면 최근 사용된 페이지이므로 victim으로 고르지 않고, accessed bit를 0으로 내린 뒤 다음 frame을 검사한다. (second change algorithm)
7. accessed bit가 0이면최근 사용되지 않은 페이지라고 판단하고, 이 frame을 victim으로 반환한다.
- pml4_is_accessed

1. pml4e_walk로 현재 프로세스의 가상주소가 가지고 있는 실제 물리프레임 주소를 가져온다.
2. 물리 프레임 주소가 존재하거나, PTE_A(Accessed Bit)가 1일 경우 true를 반환한다.
- pml4_set_accessed

1. 현재 설정할 접근여부가 true일 경우 실제 pte에 0x20을 넣어준다. 반대의 경우 지워준다.
2. 현재 활성화된 pml4를 수정한 경우 TLB를 지워준다는 의미

invlpg는 특정 가상주소에 대한 TLB 캐시를 무효화하는 함수
addr이 속한 가상 페이지의 TLB entry를 버려라 라는 의미
CPU는 매번 page table을 직접 보지 않고, 최근 가상주소 -> 물리주소 변환 결과를 TLB에 캐싱함. 그래서 PTE를 수정했는데 TLB를 그대로 두면 CPU가 예전 매핑/예전 flag를 계속 쓸 수 있음
"invlpg (%0)" → %0에 들어간 주소가 포함된 page의 TLB entry를 invalidate
: : "r" (addr) → 입력 operand로 addr 레지스터를 넣음
: "memory" → 컴파일러에게 "메모리 상태에 영향이 있다"고 알려, 이 명령 전후의 메모리 접근을 함부로 재배치하지 못하게 함.
중요한 점 : addr은 물리주소가 아니라 가상주소이다.
'정글캠프-WIL > 핀토스' 카테고리의 다른 글
| pintos - vm [setup_stack] 초기 스택 영역 메모리 관리 대상 추가 (0) | 2026.05.18 |
|---|---|
| vm - Page Fault 구현 (0) | 2026.05.16 |
| Pintos - interrupt 비교 (#PF(page fault), Timer Interrupt) (0) | 2026.05.15 |
| Pintos - vm [페이지 할당 초기화 과정을 위한 흐름도] (0) | 2026.05.14 |
| Pintos - SPT(Supplemental Page Table)와 Hash Table (1) | 2026.05.12 |




