
그래서 다중 레벨 페이지 테이블을 사용

32비트 시스템에서 사용됨
프로세스 하나당 페이지 테이블이 4MB이지만, 페이지 테이블의 상당 공간은 비어있음. 따라서 비어있는 PTE(페이지 테이블 엔트리)는 메모리 내에 유지하지 말고 유효한 PTE만 유지하자는것이 핵심 개념이다.
만약 이 페이지 내에 유효한 엔트리가 하나도 없다면? 해당 페이지는 메모리 내에 유지하지 말자!!
결국 페이지 테이블도 물리 메모리 내에 존재하므로 페이지로 나누자 (4KB)
하나의 페이지 안에는 PTE가 총 1024개 존재한다
유효한 엔트리가 하나라도 있다면? 이 페이지는 유지할 필요가 있다 !! 따라서 이 페이지를 물리 메모리 내에 저장해두고 그 주소를 페이지 디렉토리에 저장해두어야 한다 !!
| 비트 | 이름 | 설명 |
|---|---|---|
| 0 | P (Present) | 1 이면 PT‑Page가 메모리에 존재, 0 이면 page‑fault 시 로드 |
| 1 | R/W (Read/Write) | 0 = 읽기 전용, 1 = 읽기+쓰기 |
| 2 | U/S (User/Supervisor) | 0 = 커널 전용, 1 = 유저 접근 허용 |
| 3 | PWT | Write‑Through(1)/Write‑Back(0) 캐시 정책 |
| 4 | PCD | 1 이면 이 PT‑Page에 대한 CPU 캐시 사용 금지 |
| 5 | A (Accessed) | 하드웨어가 페이지 접근 시 자동으로 1 로 세트 |
| 6 | 0 (Reserved) | PS = 0 모드에선 항상 0 |
| 7 | PS (Page Size) | 0 = 하위 PT‑Page 사용(4 KB), 1 = 4 MB 대형 페이지 직접 매핑 |
| 8 | G (Global) | 커널 영역 공유 시 TLB 플러시 대상에서 제외 |
| 9–11 | AVL (Available) | OS가 임의로 사용 가능한 3 비트 |
| 12–31 | PT‑Page의 물리 주소 상위 20 비트(하위 12 비트는 0, 페이지 정렬) |
그럼 x86-64 와 같은 64비트 컴퓨터 시스템에서는 어떻게 하는가? 이런 시스템에서는 2단계가 아니라 4단계로 나누어 관리한다. 가상 주소 공간이 너무 크기 때문이다. 현재의 64비트 시스템은 상위 16비트는 사용하지 않고 나머지 48비트만 사용하는 중이다. 상위 16비트는 추후에 사용될 수 있으므로 남겨두었다.
64비트 시스템에서의 가상 주소 구조
| 비트 범위 | 개수 | 용도 | 설명 |
|---|---|---|---|
| 63–48 | 16비트 | Sign extension | 현재는 사용 ❌. 48비트 초과 주소는 무효 (canonical 주소 아님) |
| 47–39 | 9비트 | PML4 인덱스 | 512개 PML4 엔트리 중 하나 선택 |
| 38–30 | 9비트 | PDPT 인덱스 | 512개 PDPT 엔트리 중 하나 선택 |
| 29–21 | 9비트 | Page Directory 인덱스 | 512개 PD 엔트리 중 하나 선택 |
| 20–12 | 9비트 | Page Table 인덱스 | 512개 PT 엔트리 중 하나 선택 |
| 11–0 | 12비트 | 오프셋 | 4KB 페이지 내 바이트 위치 |
각 페이지 테이블들의 엔트리 구조
| 비트 | 필드 | 설명 |
|---|---|---|
| 0 | P (Present) | 1이면 이 엔트리가 유효하고 페이지가 메모리에 있음 |
| 1 | R/W | 1이면 쓰기 가능 |
| 2 | U/S | 1이면 유저 모드 접근 가능 |
| 3 | PWT | Page-level Write Through |
| 4 | PCD | Page-level Cache Disable |
| 5 | A (Accessed) | CPU가 접근하면 1로 자동 설정됨 |
| 6 | D (Dirty) | PTE에서만 의미 있음: 쓰기 발생 시 1 |
| 7 | PS (Page Size) | PDE 이상에서만 사용. 1이면 대형 페이지 (2MB, 1GB) |
| 8 | G (Global) | TLB 플러시 예외 처리 용도 (PTE에서만 의미) |
| 9–11 | AVL (Available to OS) | OS가 자유롭게 사용 가능 (예: 스왑, 커밋 상태 등) |
| 12–51 | Physical Address | 하위 테이블 또는 물리 페이지의 주소 상위 비트 (페이지 정렬 → 하위 12비트는 0) |
| 52–58 | AVL (추가 OS 용도) | 상위 AVL 비트 |
| 59 | PAT (Page Attribute Table) | 페이지 캐시 속성 지정 (PTE/PDE PS=1일 때) |
| 63 | NX (No Execute) | 1이면 코드 실행 금지 (CR4.NXE가 1일 때만 사용 가능) |

마치 4중 포인터와 같다 !!
페이지 테이블의 주소 영역에 따라 커널, 스택, 힙, 데이터, 코드 영역이 구분된다. 이 주소 영역은 결국 페이지 번호로 바뀜
페이지 테이블은 물리 메모리 내에 존재한다. CPU와 캐시에 비하면 물리 메모리에 접근하는 것은 너무 느리다. 이를 개선하기 위해 페이지 테이블 내에서 자주 접근되는 페이지를 고속의 캐시에 캐싱해두고 빠르게 접근한다. 여기에서 사용되는 캐시를 TLB라고 한다.