CSAPP 9장 | 가상 주소 → 물리 주소 변환

맹쥐·2025년 4월 25일

9장을 들어가기 앞서, 새로 나오는 몇가지 용어 정리를 조금 하고 가도록 하자.🐭


✔️ 워드 (Word)

컴퓨터가 한 번에 처리할 수 있는 기본 단위의 데이터 크기이다.

  • 예를 들어, 32비트 시스템에서는 1워드 = 4바이트
    64비트 시스템에서는 1워드 = 8바이트

즉, 워드는 시스템마다 다르다. (CPU 아키텍처에 따라 달라진다.)

✔️ 로드(Load)

메모리 → CPU 레지스터로 데이터를 불러오는 작업이다.
로드 연산은 CPU가 어떤 주소에 있는 값을 읽어와야 할 때 수행된다.

int x = a + b;

여기서 a와 b의 값을 메모리에서 불러오는 과정이 바로 load다.

✔️ 스토어(Store)

반대로, CPU 레지스터 → 메모리로 데이터를 저장하는 작업이다.

예: 계산 결과를 메모리에 저장할 때


메인 메모리와 물리 주소

컴퓨터 시스템의 메인 메모리는 M개의 연속적인 바이트 크기 셀의 배열로 구성된다.
(앞서 컴퓨터는 데이터를 바이트 단위로 저장한다고 언급한 적이 있다.)

  • 메모리는 한 줄로 쭉 늘어선 셀들의 배열처럼 생겼다.
  • 각 칸은 1바이트 크기를 갖는다.
  • 즉, 메모리는 M바이트 크기의 배열이라고 8생각하면 된다!
[ 0x00 ] [ 0x01 ] [ 0x02 ] [ 0x03 ] ... [ 0xFF ]
  • 여기서 0x00, 0x01, 0x02... 이런 숫자들이 바로 메모리 주소다.
  • 이 주소를 물리 주소 (Physical Address, PA) 라고 부른다.

컴퓨터의 뇌인 CPU는,
자신의 책상인 메모리(DRAM)와 아주 밀접하게 협업한다.
값을 꺼내오기도(load), 값을 저장하기도(store) 한다.

하지만! CPU는 이 메모리에 직접 접근하지 않는다.
CPU는 오직 "가상 주소(Virtual Address, VA)"만 사용한다.

💡 가상 주소란?

사용자 입장에서 보기 쉽게 정리된 "논리적인 주소 체계"
실제 메모리의 위치와는 다를 수 있지만,
프로그램 입장에서는 이 주소만으로도 작업이 가능하다!


그래서 CPU와 메모리가 소통하기 위해서는 서로의 언어로 번역하는 과정이 필요한 것이다.
이때, 번역기를 사용한다.
이 주소 번역기가 MMU이다.

MMU란?

MMU는 Memory Management Unit의 줄임말로,
CPU가 사용하는 가상주소(VA)를 메모리가 사용하는 물리주소(PA)로 변환해주는 하드웨어이다.

이 과정을 자세히 살펴보자.


CPU의 레지스터가 메모리에 값을 저장할 때는 store,
메모리에서 값을 읽어올 때는 load라고 부른다.

👉 두 경우 모두 CPU가 주체가 되어 명령을 내린다.

1. store

CPU가 "메모리 주소 a에 이 값을 저장해줘!"라고 명령을 내린다.
그런데, a는 가상주소(VA)이기 때문에, 물리주소(PA)로의 변환이 필요하다.
이때, MMU가 VA를 PA로 변환해준다.

2. load

CPU가 "메인 메모리 a에서 값 가져와! " 라고 명령을 내린다.
마찬가지로, a는 가상주소(VA)이므로 물리주소(PA)로의 변환이 필요하다.

MMU는 어떤 변환만 하냐면?

  • VA → PA 변환만 한다.
  • PA → VA 변환은 하지 않는다.
    (즉, 단방향 변환 기능만 있다.)

자, 앞에서 CPU는 가상 주소(VA)만 사용한다고 했고,
실제 메모리(DRAM)는 물리 주소(PA)로 접근한다고 했다.

❓MMU는 가상 주소 VA를 PA로 어떻게 바꾸는 걸까

이걸 이해하려면 이제 "주소 변환의 과정"을 좀 더 구체적으로 들여다봐야 한다.

컴퓨터는 프로그램을 실행할 때 수많은 메모리 주소를 사용한다.
하지만 이 수많은 주소를 1바이트 단위로 다루기엔 너무 복잡하고 비효율적이다.

그래서 운영체제는 메모리를 일정한 크기로 나누고, 묶어서 관리하기로 했다.


💡 페이지(Page)란?

가상 메모리와 물리 메모리를 동일한 크기의 블록 단위로 나눈 것이다.
일반적으로 1 페이지 = 4KB (4096 바이트)

📌 "페이지"는 데이터를 저장하는 단위가 아니라
메모리 "관리"를 위한 단위이다!


앞에서 가상 메모리와 물리 메모리 사이에는 주소 변환이 필요하다고 언급했었다.
이 번역 작업은 MMU라는 하드웨어 장치가 담당한다.

그러나, MMU는 주소를 1바이트씩 일일이 변환하지 않는다.
→ 대신, 가상 주소를 페이지 단위로 묶어서 변환한다!

하지만 ..
❗️MMU는 혼자서 주소를 변환할 수는 없다.
"어떤 가상 페이지가 어떤 물리 페이지에 매핑되어 있는지" 그 정보가 필요하다.
이 정보를 가지고 있는 게

👉 페이지 테이블(Page Table)이다.

비유하자면,

가상 페이지 번호 → 물리 페이지 번호를 매핑해 놓은 일종의 "주소록" 과 같다.


주소 변환의 흐름

실제로 어떻게 MMU가 주소를 변환하는지 살펴보자.

1️⃣ CPU가 메모리에 접근하려고 한다

예를 들어,

int x = arr[10];

같은 코드가 실행되면
CPU는 arr[10]이 저장된 가상 주소(VA)를 가지고 메모리에 접근하려 한다.
이때 MMU가 일을 한다.

2️⃣ MMU가 페이지 테이블을 참고하여 주소를 변환

CPU가 넘긴 가상 주소(VA)는 사실 두 부분으로 나뉘어 있다.

VA = [ VPN | VPO ]

  • VPN (Virtual Page Number): 가상 페이지 번호 (상위 비트)
    이 주소가 어느 가상 페이지에 있는지를 알려준다.
  • VPO (Virtual Page Offset): 페이지 안에서의 위치 (하위 비트)
    해당 페이지 안에서 몇 번째 바이트인지 알려준다.

📌 쉽게 말하면,

  • VPN은 "어느 페이지냐"를 가리키고,
  • VPO는 "그 페이지 안에서 몇 번째냐"를 알려주는 것이다.

예를 들어, 위 그림에서는
VPN = 2번 페이지
VPO = 그 안의 4번째 바이트

여기서 중요한 점은

  • VPO는 페이지 안에서의 위치니까 그대로 유지하고
  • VPN은 물리 페이지 번호(PPN)로 변환해줘야 한다!

3️⃣ 페이지 테이블을 참조한다

MMU는 뽑아낸 VPN(가상 페이지 번호)를 페이지 테이블의 인덱스로 삼아
→ 그에 대응되는 물리 페이지 번호(PPN)를 찾아낸다.
참고 자료: [손필기] PPN, PTE, VPO | 가상주소 → 물리주소 변환

위 그림에서 VPN이 2이니까, PPN은 5이다.

4️⃣ 최종 물리 주소 계산

이제 MMU는 최종 물리 주소를 만들어 낸다!

📌 공식

PA = [ PPN | VPO ]

  • PPN은 물리 메모리에서 어느 페이지에 저장되어 있는지를 말하고,
  • VPO는 그 페이지 안에서 몇 번째 바이트에 있는지를 알려준다.

✅ 정리: CPU → MMU → 페이지 테이블 → 물리 주소

  • CPU는 VA로 접근 시도

  • MMU가 VA → VPN, VPO로 분해

  • 페이지 테이블에서 VPN → PPN으로 변환

  • PPN + VPO → 최종 물리주소(PA)

  • 메모리 접근 완료! 🐭

profile
이유민

2개의 댓글

comment-user-thumbnail
2025년 4월 26일

아웅 야무지기도 해라~!!

1개의 답글