책(페이지)을 빌린다고 생각해보자. => 가상메모리 사용
우리는 도서관(물리 메모리)에서 책을 찾을것이다. => 맵핑된 물리주소 메모리 찾음
그런데 도서관에 책이 없으면 우리는 국립 도서관(디스크)에서 책을 가져올 것이다. => 디스크에서 찾아서 물리 메모리로 만든다. 이 디스크가 스왑 슬롯.
가상 페이지라고도 불리는 “페이지”는, 4,096 바이트(페이지 크기)의 길이를 가지는 가상 메모리의 연속된 영역이다. 페이지는 반드시 페이지에 정렬(page-aligned)되어 있어 한다.
각 프로세스는 KERN_BASE (0x8004000000) 미만의 가상주소값을 가지는 독립적인 유저(가상)페이지 집합을 가진다. 반면에 커널(가상)페이지 집합은 전역적이며, 어떤 쓰레드나 프로세스가 실행되고 있든 간에 항상 같은 위치에 남아 있다. 커널은 유저 페이지와 커널 페이지 모두에 접근할 수 있지만, 유저 프로세스는 본인의 유저 페이지에만 접근할 수 있다.
12 11 0
+-----------------------+-----------+
| Page Number | Offset |
+-----------------------+-----------+
Physical Address
4kb는 2의 12승이므로 페이지 하나당 12bits 를 차지한다.
페이지 번호는 페이지 테이블을 접근할 때 사용된다. 페이지 오프셋은 페이지 테이블에서 반환된 물리 주소의 프레임에서 참조할 위치가 된다.
위 가상 주소에서 page number는 말 그대로 페이지 번호이다. page0 이라고 할 때, 이 순서에 해당하는 숫자 '0' 인 것이다. 가상 메모리를 자른 것이 page 이니까 가상 주소는 이 페이지 번호를 포함하고 있다.
하지만 덩어리인 page 만으로는 정확한 주소를 표기할 수 없다. 이를 위해 오프셋이 있다.
페이지 테이블 안에서 그 페이지 안에 몇번째 offset에 있는지를 파악하기 위한 것.

물리 프레임 또는 페이지 프레임이라고도 불리는 프레임은, 물리 메모리 상의 연속적인 영역이다. 페이지와 동일하게, 프레임은 페이지사이즈여야 하고 페이지 크기에 정렬되어 있어야 한다. 그러므로 64비트 물리주소는 프레임 넘버와 프레임 오프셋(또는 그냥 오프셋)으로 나누어질 수 있다. 아래 그림처럼 말이다.
12 11 0
+-----------------------+-----------+
| Frame Number | Offset |
+-----------------------+-----------+
Physical Address
x86-64 시스템은 물리주소에 있는 메모리에 직접적으로 접근하는 방법을 제공하지 않는다. Pintos는 커널 가상 메모리를 물리 메모리에 직접 매핑하는 방식을 통해서 이 문제를 해결한다 - 커널 가상메모리의 첫 페이지는 물리메모리의 첫 프레임에 매핑되어 있고, 두번째 페이지는 두번째 프레임에 매핑되어 있고, 그 이후도 이와 같은 방법으로 매핑되어 있다. 그러므로 커널 가상메모리를 통하면 프레임들에 접근할 수 있다.
페이지 (Page):
"페이지"는 가상 메모리에서 사용되는 단위입니다. 가상 메모리는 프로세스가 사용하는 메모리 주소 공간을 나타냅니다. 이 주소 공간은 여러 개의 페이지로 나누어집니다.
예를 들어, 가상 메모리 주소 공간이 32비트이고 페이지 크기가 4KB인 경우, 이 주소 공간은 약 4GB(2^32 바이트) 크기의 페이지로 나뉩니다. 각 페이지는 고유한 페이지 번호로 식별됩니다.
프레임 (Frame):
"프레임"은 물리 메모리에서 사용되는 단위입니다. 물리 메모리는 컴퓨터의 실제 메모리 모듈을 나타냅니다. 이 메모리는 또한 여러 개의 프레임으로 나누어집니다.
예를 들어, 물리 메모리가 4GB(2^32 바이트) 크기이고 프레임 크기가 4KB인 경우, 물리 메모리는 약 1,048,576(2^32 / 2^12)개의 프레임으로 나뉩니다. 각 프레임은 고유한 프레임 번호로 식별됩니다.
기존 방식의 연속 할당 방식은 단편화 문제가 있었기에 이를 해결하기 위한 page 기법이 나옴.
메모리를 100%에 가깝게 사용할 수 있게 되긴 했지만 메모리 적재가 연속적이지 않고 여기저기 흩어져있음.
이렇게 조각조각 흩어져있는 page들을 문제없이 수행하기 위해, 즉 linear(일직선, 선행적)으로 수행하기 위해 page table을 사용.

한컴타자 page0 다음에 한컴타자 page1이 연달아 실행될 수 있도록, 페이지 테이블이 순서에 맞는 물리메모리 위치를 찾아준다.
즉, 프로세스마다 페이지 테이블을 갖고 있다.

페이지 테이블은 page0은 frame1에 있음을, page1은 frame4에, page2는 frame3, page3은 frame7에 있음을 알려준다.
즉, 페이지 테이블은 배열과 같다.
배열처럼, 인덱스가 페이지 번호를 가르키고 그 배열에 담고 있는 숫자가 매핑할 프레임 번호이다.
+----------+
.--------------->|Page Table|-----------.
/ +----------+ |
| 12 11 0 V 12 11 0
+---------+----+ +---------+----+
| Page Nr | Ofs| |Frame Nr | Ofs|
+---------+----+ +---------+----+
Virt Addr | Phys Addr ^
\_______________________________________/
위 도표는 페이지와 프레임 사이의 관계를 나타낸다. 왼쪽에 보이는 가상주소는 페이지 넘버와 오프셋을 포함하고 있다. 페이지 테이블은 페이지 넘버를 프레임 넘버로 변환하며, 프레임 넘버는 오른쪽에 보이는 것처럼 물리주소를 획득하기 위한 미수정된 오프셋과 결합되어 있다.

페이지 테이블의 엔트리에는 '물리주소'가 적혀야 한다.
32bit 컴퓨터를 위해서는 페이지 테이블이 딱 2단계만 있으면 충분했다.
하지만 64bit 컴퓨터의 등장으로 페이지 테이블 개수가 증가할 수 밖에 없었다.
이 중 48bit만 사용한다고 해도 페이지 테이블이 4단계의 구성을 지녀야 한다.
그래서 4단계의 페이지 테이블 구성을 통해 64bit 컴퓨터의 가상 주소가 동작한다. 각 단계별로 페이지 테이블 이름이 존재한다.
PML4(page-map level 4) - PDP(page-directory pointer) - PD(page-directory) - PT(page-table)

위 처럼 페이지 테이블이 구성되어 있을 때, MMU는 이 4단계 페이지 테이블을 walking 하면서 주소를 번역한다.
가상 주소는 위의 단계별 페이지 테이블의 인덱스 정보를 가진 어떤 값이다
63 48 47 39 38 30 29 21 20 12 11 0
+-------------+----------------+----------------+----------------+-------------+------------+
| Sign Extend | Page-Map | Page-Directory | Page-directory | Page-Table | Page |
| | Level-4 Offset | Pointer | Offset | Offset | Offset |
+-------------+----------------+----------------+----------------+-------------+------------+
| | | | | |
+------- 9 ------+------- 9 ------+------- 9 ------+----- 9 -----+---- 12 ----+
Virtual Address
즉, MMU는 어떤 가상 주소를 가지고, 그 안에 포함된 인덱스 정보를 활용하여 페이지 테이블을 walking한 후, 해당하는 PTE를 찾을 수 있다.
때때로, 가상 메모리에서 특정 페이지가 필요하거나 액세스되어야 하는데, 그 페이지가 현재 물리 메모리에 로드되어 있지 않을 수 있다. 이런 경우에 스왑 슬롯이 사용된다. 스왑 슬롯에는 물리 메모리로 로드되지 않은 페이지의 데이터가 저장된다. 이 페이지를 스왑 슬롯에서 물리 메모리로 가져와서 필요한 작업을 수행할 수 있게 된다.
요약하면, 스왑 슬롯은 가상 메모리와 물리 메모리 간의 데이터 이동을 관리하는 데 사용되며, 페이지 테이블과 함께 작동하여 필요한 페이지를 물리 메모리로 로드하고 액세스할 때 사용된다.