9장을 들어가기 앞서, 새로 나오는 몇가지 용어 정리를 조금 하고 가도록 하자.🐭
컴퓨터가 한 번에 처리할 수 있는 기본 단위의 데이터 크기이다.
즉, 워드는 시스템마다 다르다. (CPU 아키텍처에 따라 달라진다.)
메모리 → CPU 레지스터로 데이터를 불러오는 작업이다.
로드 연산은 CPU가 어떤 주소에 있는 값을 읽어와야 할 때 수행된다.
int x = a + b;
여기서 a와 b의 값을 메모리에서 불러오는 과정이 바로 load다.
반대로, CPU 레지스터 → 메모리로 데이터를 저장하는 작업이다.
예: 계산 결과를 메모리에 저장할 때
컴퓨터 시스템의 메인 메모리는 M개의 연속적인 바이트 크기 셀의 배열로 구성된다.
(앞서 컴퓨터는 데이터를 바이트 단위로 저장한다고 언급한 적이 있다.)
1바이트 크기를 갖는다.M바이트 크기의 배열이라고 8생각하면 된다![ 0x00 ] [ 0x01 ] [ 0x02 ] [ 0x03 ] ... [ 0xFF ]
컴퓨터의 뇌인 CPU는,
자신의 책상인 메모리(DRAM)와 아주 밀접하게 협업한다.
값을 꺼내오기도(load), 값을 저장하기도(store) 한다.
하지만! CPU는 이 메모리에 직접 접근하지 않는다.
→ CPU는 오직 "가상 주소(Virtual Address, VA)"만 사용한다.
💡 가상 주소란?
사용자 입장에서 보기 쉽게 정리된 "논리적인 주소 체계"
실제 메모리의 위치와는 다를 수 있지만,
프로그램 입장에서는 이 주소만으로도 작업이 가능하다!
그래서 CPU와 메모리가 소통하기 위해서는 서로의 언어로 번역하는 과정이 필요한 것이다.
이때, 번역기를 사용한다.
이 주소 번역기가 MMU이다.
MMU란?
MMU는 Memory Management Unit의 줄임말로,
CPU가 사용하는 가상주소(VA)를 메모리가 사용하는 물리주소(PA)로 변환해주는 하드웨어이다.
이 과정을 자세히 살펴보자.
CPU의 레지스터가 메모리에 값을 저장할 때는 store,
메모리에서 값을 읽어올 때는 load라고 부른다.
👉 두 경우 모두 CPU가 주체가 되어 명령을 내린다.
CPU가 "메모리 주소 a에 이 값을 저장해줘!"라고 명령을 내린다.
그런데, a는 가상주소(VA)이기 때문에, 물리주소(PA)로의 변환이 필요하다.
이때, MMU가 VA를 PA로 변환해준다.
CPU가 "메인 메모리 a에서 값 가져와! " 라고 명령을 내린다.
마찬가지로, a는 가상주소(VA)이므로 물리주소(PA)로의 변환이 필요하다.
자, 앞에서 CPU는 가상 주소(VA)만 사용한다고 했고,
실제 메모리(DRAM)는 물리 주소(PA)로 접근한다고 했다.
이걸 이해하려면 이제 "주소 변환의 과정"을 좀 더 구체적으로 들여다봐야 한다.
컴퓨터는 프로그램을 실행할 때 수많은 메모리 주소를 사용한다.
하지만 이 수많은 주소를 1바이트 단위로 다루기엔 너무 복잡하고 비효율적이다.
그래서 운영체제는 메모리를 일정한 크기로 나누고, 묶어서 관리하기로 했다.
가상 메모리와 물리 메모리를 동일한 크기의 블록 단위로 나눈 것이다.
일반적으로 1 페이지 = 4KB (4096 바이트)
📌 "페이지"는 데이터를 저장하는 단위가 아니라
메모리 "관리"를 위한 단위이다!
앞에서 가상 메모리와 물리 메모리 사이에는 주소 변환이 필요하다고 언급했었다.
이 번역 작업은 MMU라는 하드웨어 장치가 담당한다.
그러나, MMU는 주소를 1바이트씩 일일이 변환하지 않는다.
→ 대신, 가상 주소를 페이지 단위로 묶어서 변환한다!
하지만 ..
❗️MMU는 혼자서 주소를 변환할 수는 없다.
"어떤 가상 페이지가 어떤 물리 페이지에 매핑되어 있는지" 그 정보가 필요하다.
이 정보를 가지고 있는 게
비유하자면,
가상 페이지 번호 → 물리 페이지 번호를 매핑해 놓은 일종의 "주소록" 과 같다.
실제로 어떻게 MMU가 주소를 변환하는지 살펴보자.
예를 들어,
int x = arr[10];
같은 코드가 실행되면
CPU는 arr[10]이 저장된 가상 주소(VA)를 가지고 메모리에 접근하려 한다.
이때 MMU가 일을 한다.
CPU가 넘긴 가상 주소(VA)는 사실 두 부분으로 나뉘어 있다.
VA = [ VPN | VPO ]
📌 쉽게 말하면,
![]()
예를 들어, 위 그림에서는
VPN = 2번 페이지
VPO = 그 안의 4번째 바이트
여기서 중요한 점은
MMU는 뽑아낸 VPN(가상 페이지 번호)를 페이지 테이블의 인덱스로 삼아
→ 그에 대응되는 물리 페이지 번호(PPN)를 찾아낸다.
참고 자료: [손필기] PPN, PTE, VPO | 가상주소 → 물리주소 변환
위 그림에서 VPN이 2이니까, PPN은 5이다.
이제 MMU는 최종 물리 주소를 만들어 낸다!
📌 공식
PA = [ PPN | VPO ]
- PPN은 물리 메모리에서 어느 페이지에 저장되어 있는지를 말하고,
- VPO는 그 페이지 안에서 몇 번째 바이트에 있는지를 알려준다.
CPU는 VA로 접근 시도
MMU가 VA → VPN, VPO로 분해
페이지 테이블에서 VPN → PPN으로 변환
PPN + VPO → 최종 물리주소(PA)
메모리 접근 완료! 🐭
아웅 야무지기도 해라~!!