PintOS_Project03_UmMunsik

전두엽힘주기·2025년 6월 1일

PintOS

목록 보기
14/20
post-thumbnail

virtual memory in PintOS

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

페이지

  • 페이지는 4KB 크기의 가상 메모리 연속 영역
  • 반드시 page-aligned 되어야 함 (주소가 0x1000의 배수)
  • 64비트 가상 주소의 하위 12비트는 page offset
  • 상위 비트는 페이지 테이블 인덱스로 사용됨
  • 사용자 프로세스는 독립적인 user page를 가지고, 커널은 전역적인 kernel page를 가짐
  • 유저 프로세스는 자신의 user page만 접근 가능, 커널은 둘 다 접근 가능

frame

  • 프레임은 물리 메모리의 4KB 정렬된 영역
  • 페이지와 1:1 매핑됨 (page ↔ frame)
  • frame = frame_number + offset
  • x86-64에서는 물리 주소 직접 접근 불가 → Pintos는 커널 가상 메모리로 물리 메모리를 직접 매핑

페이지 테이블 (x86-64 기준)

가상 주소(VA) → 물리 주소(PA)로 변환하는 4단계 테이블 구조

VA
↓
PML4[VA >> 39] → PDPT
  ↓
PDPT[VA >> 30] → PD
  ↓
PD[VA >> 21] → PT
  ↓
PT[VA >> 12] → Physical Frame
  ↓
+ VA의 마지막 12비트 offset → 최종 물리 주소

스왑 슬롯

  • 스왑 슬롯은 디스크에 있는 페이지 크기(4KB)의 공간
  • 프레임을 교체할 때 사용됨 (Eviction 대상)
  • 역시 page-aligned 되어야 함
  • 읽거나 쓸 때는 해당 스왑 슬롯 번호를 SPTE에 저장하거나 참조함

page fault 다루기

Page Fault → 페이지 불러오기

유저 프로그램이 아직 메모리에 올라오지 않은 페이지에 접근함
→ Page Fault 발생
→ page_fault()에서 처리
→ SPT를 참고해서 적절히 처리

  1. Page Fault 발생
    • rcr2() 로 fault 주소 가져옴
    • 커널 주소 or 이상한 접근이면 → 바로 종료

  2. SPT에서 페이지 정보 찾기

    page = spt_find_page(fault_addr);

    없으면: 종료 (invalid access)
    있으면: 어떤 타입인지 확인 (파일, 스왑, all-zero 등)

  3. 프레임 확보 (vm_do_claim_page)
    • 유저 프레임 할당 (palloc_get_page(PAL_USER))
    • 프레임 테이블에 기록 (누가 사용하는 중인지 등)
    • 여유 프레임 없으면 → eviction(교체) 수행

프레임 테이블 관리 (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된 파일 처리

  • mmap()은 파일을 가상 주소 공간에 직접 매핑
  • 이후 메모리 접근만으로 파일 데이터 접근 가능
  • page_fault()이 발생하면 → 해당 파일에서 읽어서 메모리에 올림
  • munmap() 호출 시:
    • dirty 페이지는 파일에 다시 write
  • mmap된 주소 → SPTE에 등록되어 있어야 함

0개의 댓글