현재 핀토스를 만드는 중이고 Project 3에서는 보조 페이지 테이블을 구현 중이다. 이전에 malloc을 구현할 때도 가상 메모리에 대해 공부를 했지만 이번 주차를 공부하면서 가상메모리와 물리 메모리가 어떻게 매핑되는지에 대해서는 몰랐다. 이번 주차는 해당 내용에 대한 이해 없이는 진행하기 어려울 것이라 생각하여 정리해본다. 그리고 헷갈리는 개념(여러 하드웨어와 자료구조 등)에 대해서도 정리하려 한다.
가상메모리는 각 프로세스들이 메인 메모리 전체를 독점적으로 사용하고 있는 것 같은 환상을 제공하는 추상화이다. 즉, 실제로는 각 프로세스가 메인 메모리 전체를 사용하고 있지 않지만 사용하는 것처럼 속인다는 것이다. 프로세스 가상 주소 공간(가상 메모리 공간)은 위의 이미지와 같이 생겼다. 구성요소는 다음과 같다.
CPU 가상 주소를 물리 주소로 (페이지에서 프레임으로) 변환하는 데 사용하는 데이터 구조이다. 가상 주소는 액세스 프로세스에서 실행되는 프로그램에서 사용하는 반면, 물리적 주소는 하드웨어, 더 구체적으로는 RAM(Random Access Memory) 하위 시스템에서 사용한다. 운영체제 소프트웨어와 MMU 내의 주소 번역 하드웨어, 가상페이지를 물리페이지로 매핑하는 물리 메모리에 저장된 자료구조의 조합이다.
* 페이지(page): 가상 메모리의 연속된 영역
* 프레임(frame): 물리적 메모리의 연속된 영역이다.
- CPU 내에 있는 PTBR(x86, ARM 아키텍처의 TTBR: Translation Table Base Register)는 현재 페이지 테이블을 가리킨다.
- n 비트 가상주소는 두 개의 컴포넌트(VPN과 VPO)를 가진다.
- p바이트인 VPO와 PPO는 동일하다.
1. 프로세서는 가상 주소를 생성하고 MMU로 보낸다.
2. MMU는 PTE 주소를 생성하고 캐시/메인 메모리에 요청한다.
3. 캐시/메인 메모리는 요청받은 PTE를 MMU에 전달한다.
4. MMU는 페이지 테이블을 이용해 물리 주소를 구성하고 이것을 캐시/메인 메모리로 보낸다.
* 페이지 테이블은 PTBR에 위치한다. PTBR(Page Table Base Register)는 페이지 테이블의 위치를 가리키는 레지스터로 CPU에 위치한다.
5. 캐시/메인 메모리는 요청한 데이터 워드를 프로세서로 보낸다.
1. 프로세서는 가상 주소를 생성하고 MMU로 보낸다.
2. MMU는 PTE 주소를 생성하고 캐시/메인 메모리에 요청한다.
3. 캐시/메인 메모리는 요청받은 PTE를 MMU에 전달한다.
4. PTE의 유효 비트가 0이므로 MMU는 예외를 발생시키고, CPU 내의 제어를 운영체제 커널의 페이지 오류 예외 핸들러로 이동시킨다.
5. 오류 핸들러는 물리 메모리 내의 희생자 페이지를 결정하고, 해당 페이지가 수정된 적이 있다면 디스크로 이동시킨다.
* 수정된 페이지는 희생자 페이지로 선정되기 전까지 메인 메모리에만 적재되어 있다.
6. 오류 핸들러는 새 페이지를 페이지 이동으로 캐시/메인 메모리에 들여오고, 메모리 내의 PTE를 갱신한다.
7. 오류 핸들러는 처음의 프로세스로 돌아가고 오류 인스트럭션은 재시작된다. CPU는 문제를 일으킨 가상 주소를 MMU로 다시 전송한다.
참고 자료
- 친절한 임베디드 시스템 개발자 되기 강좌 - MMU(Memory Management Unit)
- <CS:APP> - 9장 가상메모리
- Wekiedia
- kaist-pintos 과제 설명서