크래프톤 정글(PintOS WEEK 9 ~ 14)

Page Table

devkty 2025. 6. 8. 00:19
728x90

Page Table

페이지 테이블은 가상 주소를 물리 주소로 변환하기 위해 운영체제가 유지하는 자료 구조입니다.

목적

  • 가상 주소 공간을 물리 주소 공간으로 매핑하기 위해 존재합니다.
  • 페이지 단위로 메모리를 관리하기 위한 핵심 메커니즘입니다.
  • 프로세스마다 개별적으로 존재합니다. (주소 공간 격리)

동작 방식

가상 주소는 다음과 같은 구조를 가집니다.

+----------------+-------------+
| Virtual Page # | Offset      |
| (상위 비트)      | (하위 비트)    |
+----------------+-------------+
  • Virtual Page Number (VPN): 어떤 페이지인지를 식별합니다.
  • offset: 해당 페이지 내에서의 위치를 의미합니다.

운영체제는 VPN → 물리 프레임 번호(PFN)을 매핑하는 페이지 테이블을 통해 다음과 같은 작업을 합니다

  1. VPN 추출
  2. 페이지 테이블에서 해당 VPN의 엔트리 찾기
  3. 해당 엔트리에 저장된 PFN과 offset 조합하여 물리 주소 생성

페이지 테이블 구조

  • 1 단계 페이지 테이블: 간단한 구조지만 메모리 낭비가 큽니다.
  • 다단계 페이지 테이블: 트리 구조로 공간을 절약합니다.
  • 인버티드 페이지 테이블: 물리 메모리를 기준으로 인덱싱합니다.
  • TLB: 주소 변환 결과를 캐싱하고, 성능 향상에 필수적입니다.

Pintos에서 페이지 테이블은 어떻게 구현되는가?

Pintos는 x86-64 아키텍처의 4단계 페이지 테이블 구조 사용합니다. 이를 pml4 로 다룹니다.

구조 요소 Pintos 위치 설명
pml4 struct thread의 멤버 각 프로세스가 가지는 최상위 페이지 테이블
pml4_activate() userprog/process.c 해당 프로세스의 page table을 활성화
pml4_get_page() userprog/pagedir.c VA에 해당하는 물리 주소(프레임) 검색
pml4_set_page() 페이지 할당 시 사용 VA에 프레임 매핑 등록
vm_try_handle_fault() vm.c 페이지 폴트 발생 시 page table 수정 (lazy loading 등)

매핑 예시는 다음과 같습니다.

/* 주소 0x8048000에 물리 프레임 frame을 매핑 */
pml4_set_page (thread_current()->pml4, (void *)0x8048000, frame, true);

흐름도 (Page Fault 처리)

  1. 유저 프로그램이 아직 매핑되지 않은 주소에 접근
  2. 하드웨어가 페이지 테이블에서 매핑을 찾지 못함 → page fault 발생
  3. page_fault()vm_try_handle_fault() 호출
  4. find_victim_page() → 페이지를 찾아 프레임 확보
  5. pml4_set_page()로 페이지 테이블에 매핑 등록
  6. 재실행하면 변환이 정상적으로 수행됨
728x90