
2025.05.30
오늘한 내용 : PintOS - Project3: Virtual Memory - gitbook 정리 중! - introduction
WEEK 12 : 정글 끝까지(PintOS) - Virtual Memory
type(VM_ANON, VM_FILE, VM_UNINIT), 파일 오프셋, 스왑 인덱스 등 추가 정보 저장vm_try_handle_fault() 구현:palloc_get_page(PAL_USER))pagedir_set_page)에 매핑bitmap 또는 동적 배열로 전역 프레임/스왑 사용 현황 관리vm_try_handle_fault()에 위 3단계 로직 추가-swap-size, mmap 등) 실행해 동작 검증+-------------------------------------+
| 사용자 프로세스 |
| 가상 주소(VA)에 접근 시도 |
+-------------------------------------+
|
v
+-------------------------------------+
| 페이지 폴트 처리기 |
| vm_try_handle_fault 호출 |
+-------------------------------------+
|
v
+-------------------------------------+
| 보조 페이지 테이블 조회 |
| (해시테이블) |
+-------------------------------------+
|
v
+----------------------+ 아니오 +---------------------+
| 엔트리 발견? |────────────> | 프로세스 종료: |
+----------------------+ | 잘못된 접근 |
예 +---------------------+
|
v
+-------------------------------------+
| 페이지 타입·추가 정보 조회 |
+-------------------------------------+
|
v
+-------------------------------------+
| 프레임 테이블에서 프레임 확보 |
| (palloc_get_page(PAL_USER)) |
+-------------------------------------+
|
v
+--------------------------------+ 아니오 +---------------------------+
| 프레임 테이블에 여유 있나? |──────────────>| 희생자 프레임 교체: |
+--------------------------------+ | - 교체 알고리즘으로 선택 |
예 | - 변경된 페이지는 스왑아웃 |
| +---------------------------+
v
+-------------------------------------+
| 페이지 데이터 로드 |
| - 파일 읽기 |
| - 제로 초기화 |
| - 스왑인 |
+-------------------------------------+
|
v
+-------------------------------------+
| 페이지 테이블 엔트리 설치 |
| (pagedir_set_page(pt, upage, frame, |
| writable)) |
+-------------------------------------+
|
v
+-------------------------------------+
| 사용자 명령 재개 |
+-------------------------------------+
1. 사용자 코드가 VA(가상 주소)에 접근 시도
└─ CPU가 PTE의 present 비트 및 권한 비트 확인
├─ present = 1 그리고 권한 허용 → 정상 접근, 그대로 실행
└─ 그렇지 않으면 → 페이지 폴트 예외 발생 → 커널 페이지 폴트 처리기(vm_try_handle_fault)로 이동
2. 페이지 폴트 처리기(vm_try_handle_fault) 진입
a) 보조 페이지 테이블(SPT)에서 upage 조회
├─ 엔트리 없음 → 잘못된 접근으로 프로세스 종료
└─ 엔트리 있음
└─ 추가로 “쓰기 시 읽기 전용” 등 권한 위반 검사 → 위반 시 종료
b) 물리 프레임 확보 (`palloc_get_page(PAL_USER)`)
├─ 빈 프레임 반환 → 즉시 사용
└─ NULL 반환(빈 프레임 없음)
└─ 희생자(victim) 프레임 선정(교체 알고리즘)
├─ 희생자 페이지의 dirty/파일 타입에 따라
│ • dirty → swap-out(스왑 테이블 업데이트)
│ • 파일 페이지 → 파일에 쓰기
└─ 희생자 프레임을 해제 → 빈 프레임 확보
└─ 확보된 프레임 → 프레임 테이블에 “upage ↔ frame” 매핑 정보 갱신
c) 페이지 내용 로드
├─ VM_FILE 타입 → 파일에서 읽기
├─ VM_ANON 타입 → 스왑 슬롯에서 읽기
└─ VM_UNINIT 타입 → 제로 초기화
d) PTE 설치 (`install_page(upage, frame, writable)`)
├─ PTE의 present 비트를 1로 설정
├─ PTE에 물리 프레임 번호 갱신
└─ 내부적으로 프레임 테이블·스왑 테이블 메타데이터 동기화
3. 페이지 폴트 처리 완료 → 사용자 명령 재개
어렵다!