가상 주소는 프로세스가 메모리에 접근할 때 사용하는 주소이다. 이 주소는 실제 물리 메모리 주소가 아니라, 프로세스가 물리 메모리에 어떻게 할당될지를 관리하는 운영 체제의 추상화된 주소다.
우리가 코드를 짜면서 볼 수 있는 대부분의 메모리 주소는 전부 이 가상 주소이다.
페이지 테이블은 가상 주소와 물리 메모리 주소 간의 매핑 정보를 저장하는 데이터 구조이다. 각 프로세스는 자체의 페이지 테이블을 갖는다.
페이지 테이블은 OS에 의해서 만들어지며 CPU 내의 주소 번역을 돕는 하드웨어인 MMU(Memory Management Unit)은 이 page table을 이용하여 가상주소를 실제 메모리의 물리 주소로 번역한다.
페이지 테이블 엔트리는 페이지 테이블 내의 각 항목이다.
페이지 테이블 엔트리에는 다음과 같은 정보가 포함될 수 있다.
CPU 내에 존재하는 주소 번역을 담당하는 하드웨어이다.
1. 가상 주소를 물리 주소로 번역함
프로세스가 가상 주소를 사용하여 메모리에 접근하면 MMU가 이 가상 주소를 물리 주소로 변환한다. 이렇게 함으로써 가상 메모리를 물리 메모리로 매핑하여 프로세스 간 메모리 격리를 제공하고, 더 큰 물리 메모리를 사용하는 것처럼 보이게 한다.
2. 페이지 테이블 사용
MMU는 페이지 테이블을 활용하여 가상 주소를 물리 주소로 변환한다. 페이지 테이블은 가상 주소 공간과 물리 메모리 간의 매핑 정보를 저장하는 표이며, 가상 주소의 페이지 번호를 통해 해당 페이지 테이블 엔트리를 찾아 물리 주소를 결정한다.
3. 접근 권한 및 메모리 보호 감시
MMU는 페이지 테이블 엔트리에 있는 권한 비트를 검사하여 메모리 접근 권한 및 메모리 보호를 관리한다. 이를 통해 프로세스가 무단으로 메모리에 접근하는 것을 방지한다.
CS:APP의 9.5 에서 다루는 것 처럼 PTE에 3개의 비트(SUP, READ, WRITE)를 추가하고, 커널 모드 프로세스는 모든 페이지에 접근할 수 있지만, 사용자 모드 프로세스는 SUP 비트가 0 인 페이지들만 접근이 허용되는 식으로 만들 수 있다.
만약 어떤 인스트럭션이 이 허가사항을 위반한다면, CPU는 segmentation fault 라고 하는 오류를 일으킨다.
PPO (Physical Page Offset)
PPO는 물리 페이지 내에서 오프셋을 나타낸다. 이것은 물리 메모리 페이지의 시작부터 특정 주소까지의 바이트 수를 나타낸다. 가령 offset이 100 이라면, 메모리 페이지의 시작부터 100byte 떨어진 곳을 가리키는 것이다.
PPO는 메모리 페이지의 크기에 의해 결정된다. 예를 들어, 4KB 페이지의 경우 PPO는 12비트로 표현된다 (2^12 = 4,096).
VPO (Virtual Page Offset)
VPO는 가상 페이지 내에서 오프셋을 나타낸다. 이것은 가상 주소 공간 내에서 특정 주소까지의 바이트 수를 나타낸다.
VPO도 메모리 페이지의 크기에 영향을 받으며, 가상 페이지 크기에 따라 다르다. 예를 들어, 4KB 페이지의 경우 VPO도 12비트로 표현된다.
물리 페이지와 가상 페이지의 오프셋 비트 크기가 같을 때, MMU는 PPO와 VPO를 직접적으로 연결한다. 따라서 주소 변환 과정에서 이 오프셋을 변경하지 않고 그대로 사용한다. 이를 통해 가상 주소와 물리 주소 사이의 오프셋 부분은 동일하게 유지되므로 페이지 내의 특정 데이터에 효과적으로 접근할 수 있다.
우리가 다루고 있는 4단계 페이지 테이블에 대해서 정리해보았다.
4단계 페이지 테이블은 가상 메모리 주소를 물리 메모리 주소로 변환하기 위한 페이지 테이블 계층 중 하나이다. 페이지 테이블을 계층화하여 사용하는 이유는 메모리 관리의 효율성과 유연성을 높이기 위함이다. 4단계 페이지 테이블은 다음과 같이 동작한다:
1단계 (PML4 - Page Map Level 4)
4단계 페이지 테이블의 가장 상위 단계.
PML4 테이블은 프로세스마다 하나씩 있으며, 모든 가상 주소 공간을 관리한다.
PML4 테이블의 각 엔트리는 4단계 페이지 테이블의 주소를 가리키며, 가상 주소의 상위 비트를 사용하여 해당 페이지 테이블을 선택한다.
2단계 (PDPT - Page Directory Pointer Table)
PML4 테이블의 각 엔트리가 가리키는 페이지 테이블이다.
PDPT 테이블도 프로세스마다 하나씩 있으며, 가상 주소 공간을 더 세분화하여 관리한다.
PDPT 테이블의 각 엔트리는 3단계 페이지 테이블의 주소를 가리킨다.
3단계 (PD - Page Directory)
PDPT 테이블의 각 엔트리가 가리키는 페이지 테이블이다.
PD 테이블도 가상 주소 공간을 더 분할하여 관리하며, 물리 메모리 페이지를 매핑한다.
PD 테이블의 각 엔트리는 2단계 페이지 테이블의 주소를 가리킨다.
4단계 (PT - Page Table)
PD 테이블의 각 엔트리가 가리키는 페이지 테이블이다.
PT 테이블은 가상 주소 공간의 가장 낮은 단계로, 실제 물리 메모리 페이지와 가상 주소를 매핑한다.
PT 테이블의 각 엔트리는 물리 페이지의 주소를 저장한다.
가상 주소가 주소 변환 과정을 거치면, 먼저 PML4 테이블을 통해 해당 프로세스의 PDPT 테이블을 선택하고, 다음으로 PDPT 테이블을 통해 PD 테이블을 선택하고, 마지막으로 PD 테이블을 통해 PT 테이블을 선택한다. PT 테이블의 엔트리를 통해 가상 주소가 물리 메모리 페이지로 매핑된다.
이러한 계층 구조를 사용하면 가상 주소 공간을 더 세부적으로 관리할 수 있으며, 더 큰 물리 메모리를 지원하는 동시에 각 프로세스의 메모리 공간을 격리할 수 있다. 이것은 운영 체제의 가상 메모리 관리와 메모리 보호에 중요한 역할을 한다.