학습 목표
논리 주소를 페이지 번호 + 오프셋으로 나누고 페이지 테이블로 물리 주소를 구하는 과정을 설명할 수 있다.
페이지 테이블 엔트리(PTE) 의 valid·frame·protection 비트 역할을 설명할 수 있다.
TLB가 주소 변환 비용을 줄이는 원리와 TLB miss 시 동작을 설명할 수 있다.
다단계 페이징이 큰 주소 공간에서 테이블 크기 문제를 완화하는 이유를 설명할 수 있다.
문제 상황
- 프로세스마다 페이지 테이블이 수 MB인데, 매 메모리 접근마다 테이블을 읽으면 너무 느리다
- TLB·캐시 계층 필요
- 64비트 주소 공간에 단일 수준 페이지 테이블을 두면 엔트리 수가 천문학적
- 다단계·역페이징 등 구조적 완화
segfault/SIGSEGV— valid=0 페이지 접근, 보호 위반- PTE 비트와 직결
perf에서 dTLB load misses 가 높다- TLB 미스·페이지 walk 비용
앞 편에서 페이징 개요를 봤다. 이번엔 MMU가 실제로 어떻게 변환하는지 — 테이블·TLB·다단계다.
1. 논리 주소 분해와 페이지 테이블
페이지 크기가 4KB(2¹²)이면 하위 12비트는 페이지 내부 오프셋, 상위 비트는 페이지 번호다.

| 단계 | 동작 |
|---|---|
| 1 | CPU가 논리 주소 생성 |
| 2 | MMU가 페이지 번호로 페이지 테이블 인덱싱 |
| 3 | PTE에서 프레임 번호 읽기 (valid 확인) |
| 4 | 물리 주소 = (프레임 번호 × 페이지 크기) + 오프셋 |
PTE에 자주 들어가는 필드:
| 필드 | 역할 |
|---|---|
| valid | 페이지가 메모리에 있고 매핑 유효한지 |
| frame # | 물리 프레임 번호 |
| protection | 읽기/쓰기/실행 허용 (R/W/X) |
| dirty | 페이지가 수정됐는지 (스왑·백업 시) |
| referenced | 최근 접근 여부 (교체 알고리즘 힌트) |
- OS는 프로세스마다 페이지 테이블 베이스 레지스터(PTBR) 를 갖고, 컨텍스트 스위치 시 갱신
- 페이지 테이블 자체도 물리 메모리에 저장 — 접근마다 추가 메모리 읽기 발생
2. TLB (Translation Lookaside Buffer)
페이지 테이블 walk는 매번 메모리 접근이 추가된다. CPU 옆 TLB는 최근 (페이지#, 프레임#) 쌍을 캐시한다.

| 경우 | 동작 | 비용 |
|---|---|---|
| TLB hit | PTE 없이 TLB에서 프레임 번호 획득 | 낮음 |
| TLB miss | 메모리에서 페이지 테이블 walk → TLB에 적재 | 높음 |
- TLB는 완전 연관(fully associative) 또는 세트 연관 — 하드웨어·아키텍처마다 다름
- 컨텍스트 스위치 시 TLB flush — 다른 프로세스 PTE와 섞이면 안 됨
- ASID(Address Space ID)로 프로세스별 TLB 엔트리 구분 → flush 완화 (일부 CPU)
- 큰 배열 순회·포인터 체이스는 TLB 미스가 쌓여 느려질 수 있음 —
perf stat -e dTLB-load-misses
3. 페이지 테이블의 크기 문제
32비트·4KB 페이지·4B PTE라면 엔트리 약 2²⁰개 → 테이블만 4MB. 64비트에 단일 수준을 그대로 쓰면 비현실적.
완화 전략:
| 방식 | 아이디어 |
|---|---|
| 다단계 페이징 | 상위 인덱스로 하위 테이블만 필요할 때 할당 |
| 역페이징 | 물리 프레임마다 엔트리 (프레임 수가 적을 때) |
| 해시 페이지 테이블 | 해시로 PTE 탐색 (64비트 등) |
Linux x86-64는 4단계 페이지 테이블(PGD → PUD → PMD → PTE)을 쓴다. 개념은 2단계로 이해하면 충분하다.
4. 다단계 페이징
논리 주소를 외부 인덱스 | 내부 인덱스 | 오프셋 으로 나눈다. 외부 페이지 테이블 엔트리가 내부 페이지 테이블 주소를 가리킨다.

| 장점 | 설명 |
|---|---|
| 희소 할당 | 쓰지 않는 상위 영역의 내부 테이블을 만들지 않음 |
| 크기 절감 | 전체 주소 공간을 한 테이블로 덮지 않음 |
| 단점 | 변환 시 메모리 접근 2~4회 — TLB·캐시가 더 중요 |
- 내부 테이블도 페이지 단위로 물리 메모리에 올라감
- 페이지 폴트로 테이블 페이지 자체를 디스크에서 올리는 경우도 있음 (가상 메모리 편)
5. 하드웨어와 OS 역할
| 주체 | 역할 |
|---|---|
| MMU | 페이지 번호 추출, 테이블 walk, TLB, 보호 검사 |
| OS | 페이지 테이블·프레임 할당, PTE 갱신, page fault 처리 |
| 컴파일러/런타임 | 논리 주소 생성 — 프로세스는 물리 주소를 모름 |
mmap,mprotect는 결국 PTE 비트·매핑 변경- 컨테이너·VM은 별도 페이지 테이블(또는 중첩)로 격리
6. 정리
- 논리 주소 = 페이지 번호 + 오프셋, PTE가 프레임 번호·보호 제공
- TLB는 변환 캐시 — hit는 빠르고, miss는 테이블 walk
- 다단계 페이징은 큰 주소 공간에서 테이블을 희소하게 유지
- 다음: 가상 메모리, 요구 페이징, 페이지 폴트, 교체 알고리즘
다음에 다룰 것
- 가상 메모리
- 요구 페이징, 페이지 폴트, 교체 알고리즘
해당 내용은 Operating System Concepts, 10/E (Avraham Silberschatz, Peter Baer Galvin, Greg Gagne) 의 내용을 기반으로 합니다.