728x90
Page Table
페이지 테이블은 가상 주소를 물리 주소로 변환하기 위해 운영체제가 유지하는 자료 구조입니다.
목적
- 가상 주소 공간을 물리 주소 공간으로 매핑하기 위해 존재합니다.
- 페이지 단위로 메모리를 관리하기 위한 핵심 메커니즘입니다.
- 프로세스마다 개별적으로 존재합니다. (주소 공간 격리)
동작 방식
가상 주소는 다음과 같은 구조를 가집니다.
+----------------+-------------+
| Virtual Page # | Offset |
| (상위 비트) | (하위 비트) |
+----------------+-------------+
- Virtual Page Number (VPN): 어떤 페이지인지를 식별합니다.
- offset: 해당 페이지 내에서의 위치를 의미합니다.
운영체제는 VPN → 물리 프레임 번호(PFN)
을 매핑하는 페이지 테이블을 통해 다음과 같은 작업을 합니다
- VPN 추출
- 페이지 테이블에서 해당 VPN의 엔트리 찾기
- 해당 엔트리에 저장된 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 처리)
- 유저 프로그램이 아직 매핑되지 않은 주소에 접근
- 하드웨어가 페이지 테이블에서 매핑을 찾지 못함 → page fault 발생
page_fault()
→vm_try_handle_fault()
호출find_victim_page()
→ 페이지를 찾아 프레임 확보pml4_set_page()
로 페이지 테이블에 매핑 등록- 재실행하면 변환이 정상적으로 수행됨
728x90
'크래프톤 정글(PintOS WEEK 9 ~ 14)' 카테고리의 다른 글
Page Fault (페이지 폴트) (0) | 2025.06.08 |
---|---|
TLB(Translation Lookaside Buffer) (0) | 2025.06.08 |
VM (가상메모리) (0) | 2025.06.08 |
WEEK 12 PintOS TIL(6월1일 일요일) (0) | 2025.06.08 |
WEEK 12 PintOS TIL(5월31일 토요일) (0) | 2025.06.08 |