[TIL/크래프톤 정글] DAY 82

배재준·2025년 5월 30일

크래프톤 정글 - TIL

목록 보기
74/93
post-thumbnail

2025.05.30

TIL(TODAY I LEARN)


  • 오늘한 내용 : PintOS - Project3: Virtual Memory - gitbook 정리 중! - introduction

  • WEEK 12 : 정글 끝까지(PintOS) - Virtual Memory


Project3: Virtual Memory

Introduction

목표

  • 물리 메모리(RAM) 크기에 구애받지 않고 여러 사용자 프로그램이 동시에 실행되도록 가상 메모리 환경을 구축
  • 페이지 교체(swap-in/out), 파일 매핑, 익명 메모리 등으로 “무한 메모리” 환상 제공

핵심 개념

  1. 페이지(Page)
    • 가상 주소 공간의 기본 단위(4 KB)
    • 페이지-정렬(4096바이트 경계)에 따라 시작 주소가 결정
  2. 프레임(Frame)
    • 물리 메모리(RAM)의 4 KB 단위 블록
    • 페이지가 실행되려면 반드시 프레임에 매핑돼 있어야 함
  3. 페이지 테이블(Page Table)
    • CPU가 가상 주소 → 물리 주소 변환에 사용하는 자료구조
    • 각 가상 페이지가 어느 프레임에 올라가 있는지 매핑 정보 저장
  4. 스왑 슬롯(Swap Slot)
    • 디스크 상의 4 KB 블록, RAM 부족 시 페이지를 내릴 공간
    • 스왑 슬롯에 쓰고, 나중에 다시 읽어오면 해당 페이지 복원

구현 과제

  1. 보조 페이지 테이블
    • 기본 페이지 테이블만으로는 “이 페이지는 어디서 오나요?” 알 수 없음
    • 각 가상 페이지별로 type(VM_ANON, VM_FILE, VM_UNINIT), 파일 오프셋, 스왑 인덱스 등 추가 정보 저장
  2. 프레임 테이블
    • 시스템 전체 프레임을 전역 자료구조로 관리
    • 프레임 상태(비어 있음/차지 중), 매핑된 페이지 정보 추적
    • 빈 프레임 없으면 교체 후보 선정 → 스왑 또는 파일에 내리기
  3. 스왑 테이블
    • 디스크 스왑 영역의 사용 현황 관리(비트맵 또는 배열)
    • 페이지 내릴 때 빈 슬롯 할당, 읽어올 때 슬롯 해제
  4. 페이지 폴트 처리
    • 유저 프로세스가 아직 메모리에 없는 주소 접근 시 발생
    • vm_try_handle_fault() 구현:
      1. 보조 페이지 테이블 조회 → 유효성(주소, 권한) 검사
      2. 프레임 확보(palloc_get_page(PAL_USER))
      3. 데이터 로드(제로 페이지, 파일 읽기, 스왑 읽기)
      4. 페이지 테이블(pagedir_set_page)에 매핑

작업 순서 예시

  1. 보조 페이지 테이블 설계
    • 해시테이블 또는 리스트로 “가상 주소 → 메타정보” 매핑 구현
  2. 프레임·스왑 테이블 구현
    • bitmap 또는 동적 배열로 전역 프레임/스왑 사용 현황 관리
    • 프레임 교체 정책(예: 순환, LRU 유사) 간단히 구현
  3. 페이지 폴트 핸들러 완성
    • vm_try_handle_fault()에 위 3단계 로직 추가
    • 익명·파일·언인잇 타입별로 분기 처리
  4. 테스트 및 검증
    • 프로젝트 2 테스트가 여전히 통과하는지 확인
    • VM 전용 테스트(-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. 페이지 폴트 처리 완료 → 사용자 명령 재개  

어렵다!

0개의 댓글