초기 컴퓨터 시스템은 CPU가 직접 PA를 사용하여 메모리에 접근했다
[CPU] ──(주소 4)→ [메모리]
←(주소 4~7 데이터)
나: "게임 실행!"
동생: "유튜브 실행!"
아빠: "엑셀 실행!"
여러개의 프로그램이 동시에 실행되면 서로의 메모리를 침범할 위험이 있고 프로그램을 메모리에 자유롭게 배치하기가 어렵다
각 프로그램마다 가상의 주소 공간을 주고 그 주소를 실제 물리 주소로 변환해서 접근한다
게임은 "0번 주소"에 저장한다고 생각하고, 유튜브도 "0번 주소"에 저장한다고 생각한다
게임이: "0번 주소에서 데이터 꺼내줘!"
MMU가: "오케이, 이건 진짜로는 500번 주소야~"
컴퓨터가: 500번 주소에서 데이터를 꺼내옴
변환테이블은 메인 메모리 (RAM)에 저장되어있고 내용을 OS가 관리, 이 테이블을 페이지 테이블이라고 부르는데 MMU가 이걸 참조해서 변환을 수행한다
[CPU] --VA--> [MMU] --변환--> [PA] --> [메모리]
^ |
| |
Virtual Address Physical Address
↘ 변환 정보는 ↙
[Page Table] ← (OS가 관리)
일종의 사전(lookup table)
ex:
| 가상 주소 페이지 번호 | 진짜 주소 페이지 번호 |
|---|---|
| 0 | 50 |
| 1 | 24 |
| 2 | 85 |
... ...
게임이 말한 "0번 주소"는 → 사전에서 찾아보면 → 진짜 주소는 50번
가상주소:
[ 가상 주소 ]
┌──────────────┬────────────┐
│ 페이지 번호 │페이지 안 위치 │
└──────────────┴────────────┘
예를 들어 0x00001234라는 가상 주소가 있다면:
앞쪽은 "몇 번째 페이지인지" (페이지 번호)
뒤쪽은 "그 페이지 안의 몇 번째 칸인지" (오프셋)
변환 순서 (초간단 버전)
CPU: “가상 주소 0x00001234 접근할래!”
MMU:
페이지 번호(예: 0번)를 뽑음
페이지 테이블에서 0번 → 50번으로 매핑된 걸 찾음
MMU:
물리 주소 = 페이지 50번의 시작 위치 + 오프셋
예: 50번 페이지 시작 주소가 0xC8000, 오프셋이 0x1234라면
물리 주소 = 0xC8000 + 0x1234 = 0xC9234
컴퓨터: 0xC9234에서 데이터를 가져옴!
가상 주소 = 책 번호 + 책 안쪽 페이지 번호
진짜 주소 = 도서관 안의 실제 책 위치 + 책 속의 페이지 번호
MMU = 도서관 사서!
"얘가 말한 책은 실제로 저쪽 선반의 5번째 칸에 있네!" 하고 찾아줌
컴퓨터는 데이터를 꺼내거나 저장할때마다 주소번호를 사용
번호가 이어지는 공간을 주소 공간이라고 함
주소들이 쭉 붙어 있으면 → "선형 주소 공간(linear address space)"
주소를 3비트로 표현할 수 있다면:
2³ = 8개의 주소 가능!
→ 0 ~ 7번 주소 공간 → 이걸 3비트 주소 공간이라고 해!
주소를 32비트로 쓰면?
2³² = 약 43억 개 주소! → 요즘 일반 컴퓨터는 이걸 쓰거나
64비트 주소면?
2⁶⁴
CPU가 프로그램을 실행할 때 쓰는 가짜 주소표
보통 32비트 or 64비트 크기 (2³²개 주소, 2⁶⁴개 주소)
실제 메모리(RAM)에 있는 진짜 주소표
예: 물리 메모리가 8GB면 → 대략 2³³ 정도의 주소 필요
메모리 크기(M)는 꼭 2의 제곱일 필요는 없지만, 편의상 2ᵐ으로 가정함
아빠…😒