한 문장 정의

Page Table Walk는 TLB miss 시 MMU가 메모리에 있는 다단계 페이지 페이블을 순차적으로 조회하여 가상 주소를 물리 주소로 변환하는 과정입니다.

가상 주소 쪼개는 기준

가상 주소
---------
- x86-64 가상 주소는 48비트 사용
  이걸 9/9/9/9/12 비트로 쪼갬

Page Table 예시
---------------
- 가상 주소: 0x00007f1234567890
┌────────┬────────┬────────┬────────┬────────────┐
│ PML4   │ PDPT   │  PD    │  PT    │  Offset    │
│ 9bit   │ 9bit   │ 9bit   │ 9bit   │  12bit     │
│ 인덱스 │ 인덱스  │ 인덱스 │ 인덱스 │ 페이지 내   │
│        │        │        │        │ 위치       │
└────────┴────────┴────────┴────────┴────────────┘
9bit = 0~511 → 각 테이블의 512개 엔트리 중 하나를 선택
12bit = 0~4095 → 4KB 페이지 안에서의 위치

데이터 구조
-----------
PML4 1개에 최대 PDPT 512개
PDPT 1개에 최대 PD 512개
PD   1개에 최대 PT 512개
PT   1개에 최대 물리 프레임 512개

page table walk 동작

page table walk는 주소를 통해 다음 테이블로 넘어가 결국 실제 데이터를 찾아오는 과정
--------------------------------------
포인터 -> 포인터 -> 포인터 -> 포인터 -> 실제 데이터
PML4      PDPT      PD        PT       물리 프레임(RAM)

page table walk 비용

비용

원래 x86-64에서 기본 "물리 프레임 크기"는 "4KB"

이때 TLB miss 시 RAM 접근 4번을 하게 되고 이는 "성능 저하"까지 이어짐.

보완 - THP 사용 효과 중 1개

THP(2MB 페이지)를 쓰면 -> TLB 1엔트리가 2MB 커버
												-> walk도 3단계로 줄어듦(PD에서 바로 2MB 프레임)

비교

일반 4KB 페이지 :
┌────────┬────────┬────────┬────────┬────────────┐
│ PML4   │ PDPT   │  PD    │  PT    │  Offset    │
│ 9bit   │ 9bit   │ 9bit   │ 9bit   │  12bit     │
└────────┴────────┴────────┴────────┴────────────┘
  1단계    2단계    3단계    4단계    페이지 내 위치

PML4 -> PDPT -> PD -> PT -> 4KB 물리 프레임
												|
												|- PD 엔트리가 "PT 테이블 주소"를 가르킴
													 PT 엔트리가 "4KB 물리 프레임"을 가르킴
							
													 
2MB Huge Page :
┌────────┬────────┬────────┬─────────────────────┐
│ PML4   │ PDPT   │  PD    │  Offset              │
│ 9bit   │ 9bit   │ 9bit   │  21bit               │
└────────┴────────┴────────┴─────────────────────┘
  1단계    2단계    3단계    페이지 내 위치 (2MB 안에서)

PML 4 -> PDPT -> PD -> 2MB 물리 프레임
                  |
                  |- PD 엔트리가 직접 "2MB 물리 프레임"을 가르킴
		                 PT 단계가 없음

그럼 THP로 2MB로 지정하는지?

PT 1개가 커버하는 범위 = 512 엔트리 x 4KB = 2MB

즉, PT 테이블 하나를 통째로 건너뛰어 RAM에 접근하는 횟수 1번을 줄임

만약 1GB로 하면 PD 단계까지도 제거하여 RAM에 접근 2번만 함.