한 문장 정의
TLB는 MMU 내부에 있는 하드웨어 캐시로, 최근 사용된 "가상 주소 -> 물리 주소" 변환 결과를 저장해서 페이지 테이블 조회 없이 빠르게 주소 변환을 하기 위한 장치입니다.
필요한 이유
CPU가 메모리에 접근할 때마다 "가상 -> 물리" 변환이 필요.
x86-64 페이지 테이블은 4단계 구조라서 한 번 변환에 메모리 접근 4번이 필요함.
매 명령어마다 이러면 너무 느림.
구조
TLB 엔트리 = 딱 한 줄짜리 메모
일반적 4KB 페이지일 때 :
┌──────────────────────────────────────┐
│ 가상 페이지 번호 → 물리 프레임 번호 │
│ 0x7f1234000 → 0xAB000 │
│ + 권한 (r/w/x) + 페이지 크기 (4KB) │
└──────────────────────────────────────┘
이 엔트리 하나가 4KB 범위를 커버
(0x7f1234000 ~ 0x7f1234FFF)
2MB 페이지일 때:
┌──────────────────────────────────────┐
│ 가상 페이지 번호 → 물리 프레임 번호 │
│ 0x7f1200000 → 0x800000 │
│ + 권한 (r/w/x) + 페이지 크기 (2MB) │
└──────────────────────────────────────┘
이 엔트리 하나가 2MB 범위를 커버
(0x7f1200000 ~ 0x7f13FFFFF)
보통 2단계로 나뉨
L1 TLB : 매우 빠름, 작음 (64~128 엔트리)
명령어용(iTLB)과 데이터용(dTLB) 분리
L2 TLB : 약간 느림, 더 큼 (512~2048 엔트리)
통합
동작
CPU : 가상 주소 0x7f1234 접근
-> L1 TLB 확인 -> miss
-> L2 TLB 확인 -> miss
-> 페이지 테이블 조회 (page table walk)
-> 변환 결과를 TLB에 등록
-> 다음에 가은 페이지 접근 시 TLB hit
질문
Q. TLB miss가 많으면 어떻게 되나요?
A. 매번 페이지 테이블을 조회해야 해서 메모리 접근 지연이 커집니다.
이를 줄이는 방법으로 THP를 사용해서 하나의 TLB 엔트리가 4KB 대신 2MB를 커버하게 하거나,
메모리 접근 패턴의 지역성을 높이는 방법이 존재합니다.
Q. TLB와 CPU 캐시(L1/L2/L3)의 차이는?
A. TLB는 "주소 변환 결과"를 캐싱하고
CPU 캐시는 "실제 데이터"를 캐시합니다.
메모리 접근 시 TLB로 먼저 물리 주소를 얻고,
그 물리 주소로 CPU 캐시에서 데이터를 찾는 순서입니다.