오늘 끝나면
가상 메모리와 MMU
- ✓가상 메모리와 MMU의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 가상이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
가상→물리 주소·page table walk·TLB 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 37
가상 메모리와
MMU
프로그램은 진짜 메모리 주소를 모른다.
가짜 주소(가상 주소)를 쓰고, MMU가 그걸 진짜 주소로 바꿔준다.
이 한 겹이 보호와 격리, 큰 주소공간을 다 만든다.
프로그램은 가상 주소를 쓴다
프로그램이 보는 주소는 진짜가 아니다. 전부 가상 주소(VA)다.
모든 프로그램이 자기만 0번지부터 쭉 메모리를 가진 것처럼 짜인다. 실제 DRAM의 어느 칸에 올라가는지는 신경 쓰지 않는다.
그 가상 주소를 진짜 물리 주소(PA)로 바꾸는 하드웨어가 MMU(Memory Management Unit)다.
CPU가 메모리에 접근할 때마다 MMU가 중간에서 VA를 PA로 변환한다.
덕분에 두 프로그램이 똑같이 0x1000을 써도 서로 다른 물리 칸으로 간다. 충돌도 없고 남의 메모리도 보지 못한다.
이 변환 한 겹이 운영체제의 기반이다. 여기서 정한 MMU가 최종 MyChip에 들어간다.
page 단위로 쪼개 관리한다
주소를 한 칸씩 변환하면 표가 끝없이 커진다. 그래서 page라는 덩어리로 묶는다.
메모리를 같은 크기(보통 4KB, 여기 데모는 256B)의 page로 잘게 자른다.
가상 주소는 위쪽 비트가 VPN(어느 page냐), 아래쪽 비트가 offset(page 안 몇 번째냐)으로 갈린다.
변환은 VPN만 물리 page 번호 PFN으로 바꾼다. offset은 그대로 따라간다.
page 단위라 한 page에 권한(읽기·쓰기·실행)을 통째로 걸 수 있다. 보호와 격리가 여기서 나온다.
또 안 쓰는 page는 디스크로 내려두고 필요할 때만 올려서, 실제 DRAM보다 큰 주소공간을 쓰는 것처럼 보이게 한다.
그대로
page table walk, 변환은 원래 느리다
VPN을 PFN으로 바꾸는 사전이 page table이다. 메모리 안에 있다.
MMU는 VPN을 색인 삼아 메모리의 page table을 읽어 PFN을 꺼낸다. 이걸 page table walk라 한다.
문제는 이게 메모리 접근이라는 것이다. 변환 한 번 하려고 메모리를 한 번, 다단계면 여러 번 다녀와야 한다.
진짜 칩의 page table은 한 장이 아니라 여러 층으로 쌓인다. 64비트 주소공간을 한 장에 못 담아서 4단계쯤으로 나눈다.
그러면 변환 한 번에 메모리를 네 번 걸어 들어가야 한다. 명령마다 이러면 너무 느리다.
그래서 변환 결과를 어딘가에 캐시해 둬야 한다. 그게 다음 장의 TLB다.
단계가 N층이면 변환 한 번에 메모리를 N번 다녀온다 · 명령마다 이러면 느리다
TLB, 변환을 캐시한다
매번 page table을 걸으면 느리다. 그래서 변환 결과만 담는 작은 캐시를 두는데, 그게 TLB다.
TLB(Translation Lookaside Buffer)는 최근에 쓴 VPN→PFN 변환을 몇십에서 몇백 개 담아둔다.
CPU가 주소를 낼 때 MMU는 page table보다 먼저 TLB를 본다.
TLB hit이면 변환이 1 사이클에 끝난다. walk를 통째로 건너뛴다.
TLB miss면 그제야 page table walk를 하고, 찾은 변환을 TLB에 채워 넣는다. 다음에 같은 page를 부르면 hit이다.
page 단위라 한 변환이 page 전체(여기선 256바이트)를 덮는다. 코드나 배열처럼 한 page 안을 죽 훑는 접근은 거의 다 hit이 된다. 이 지역성 덕에 TLB가 작아도 잘 먹힌다.
직접 주소를 변환해 본다
오른쪽에서 가상 주소를 직접 골라 MMU를 한 단계씩 돌려본다.
STEP을 누르면 주소가 VPN과 offset으로 쪼개지고, TLB를 조회하고, miss면 page table을 걸어 PFN을 찾아 물리 주소를 조립한다. 근거 패널에 TLB와 page table이 그대로 보인다.
같은 page를 처음 부르면 miss라 walk를 한 번 하고 TLB에 채워진다. 그 page를 다시 부르면 이번엔 hit으로 walk를 건너뛴다.
FLUSH로 TLB를 비우면 다시 전부 miss가 된다. 문맥 전환 때 일어나는 일이다.
여기서 고른 page 크기와 TLB가 그대로 MyChip의 MMU 경로가 된다.
Q. TLB가 캐시하는 것은 무엇인가?
정답은 가상→물리 주소 변환(자주 쓰는 page의 VPN→PFN)이다.TLB는 데이터를 담는 캐시가 아니라 page table walk의 결과(변환)를 담는 캐시다.
hit이면 page table을 안 걸고 1 사이클에 PFN을 준다. 변환 비용이 사라진다.
page 단위라 변환 하나가 page 전체를 덮어서, 한 page를 훑는 접근은 거의 다 hit이 된다.
STEP을 눌러 VPN을 TLB에 먼저 물어본다.
STEP으로 분해 → TLB 조회 → walk → 물리 주소를 한 단계씩 따라가 본다. 같은 page를 다시 부르면 이번엔 TLB hit.
여기서 정한 page 크기(256B)와 TLB, 자주 쓰는 VPN→PFN 변환을 담는 작은 캐시가 최종 MyChip의 MMU 경로가 된다.