여태까지는 세그먼트를 활용하여 논리 주소에서 바로 물리 주소로 변환하면서 예제를 작성했다.
페이징을 활용하면 논리 주소 → 선형 주소 → 물리 주소 순으로 변환되게 된다.
선형 주소
페이징을 활용하려면 두 가지가 필요하다.
- 페이지 디렉토리
- 페이지 테이블
페이지 디렉토리는 시스템에서 한 개만 존재하며, 페이지 디렉토리 엔트리 * 1024개로 이루어진다.
페이지 디렉토리 엔트리는 페이지 테이블의 포인터를 포함하며 각종 비트로 구성되어있다.
페이지 디렉토리 엔트리 구조

페이티 테이블은 1024개의 페이지 테이블 엔트리를 가지고 있으며, 페이지 테이블 엔트리는 4KB 물리 주소 한 페이지의 포인터를 포함하고 있다.
페이지 테이브 엔트리 구조

- A 비트
- 해당 비트를 통해 해당 페이지가 접근된 페이지인지 확인 가능하다.
- U/S 비트
- 0 : 페이지 테이블과 4KB 페이지를 커널만 사용 가능
- 1 : 페이지 테이블과 4KB 페이지를 유저도 사용 가능
- R/W 비트
- 0 : 읽기만 가능
- 1 : 읽기/쓰기 가능
- P 비트
- 0 : 페이지가 메모리 상에 로드되어 있지 않음.
- 1 : 페이지가 메모리 상에 로드되어 있음.
4GB = 4KB * 1024 * 1024 이므로 4GB 영역의 주소를 지정할 수 있다.
엔트리의 크기는 32bit, 즉, 4byte이다.
4 * 1024 * 4 * 1024를 하면 페이지 디렉토리의 크기는 16MB가 되는데, 항상 다 차지하고 있는 것이 아니라 페이지 테이블의 수가 항상 조정된다.
세그먼테이션을 통해 산출된 선형 주소는 상위 10비트, 중위 10비트, 하위 12비트로 나뉜다.
상위 10비트는 페이지 디렉토리의 시작 주소로부터 몇 번째 엔트리인지 의미한다.
중위 10비트는 페이지 테이블의 시작 주소로부터 몇 번째 엔트리인지 의미한다.
하위 12비트는 오프셋으로 4KB 페이지의 시작 주소로부터 몇 바이트 떨어져 있는지를 의미한다.
페이지 디렉토리는 CR3에서 시작 주소를 찾는다.
전체적으로 주소를 참조하는 과정은 예를 들어 선형 주소가 0x10065일 때 다음과 같이 이루어진다.

- CR3을 참조하여 페이지 디렉토리 시작 주소를 찾는다.
- 선형 주소의 상위 10비트를 참조하여 시작 주소 + (0x0*4)를 통해 페이지 디렉토리 엔트리를 찾는다.
페이지 디렉토리 엔트리를 참조하여 페이지 테이블 시작 주소를 찾는다. - 선형 주소 중위 10비트를 참조하여 페이지 테이블 시작 주소 + (0x10 * 4)를 통해 페이지 테이블 엔트리를 찾는다.
페이지 테이블 엔트리를 참조하여 4KB 페이지 시작 주소를 찾는다. - 선형 주소 하위 12비트를 참조하여 4KB 페이지 시작 주소 + 0x65를 통해 물리 주소 값을 찾는다.
만약 선형 주소를 통해 메모리 주소를 찾았으나 더 이상 쓸 공간이 없을 경우, CPU는 14번 인터럽트를 발생 시킨 뒤 인터럽트 핸들러를 통해 최근에 사용되지 않은 페이지를 찾아서 덮어쓴다.
또는 엔트리의 P비트가 0일 때 또한 14번 인터럽트가 발생하여 가상메모리로부터 해당 페이지를 메모리 상에 로드하는 경우도 있다.
'OS > 만들면서 배우는 OS 커널의 구조와 원리' 카테고리의 다른 글
| 8-3. 페이징 실험 (0) | 2026.04.25 |
|---|---|
| 8-1. 페이징 - A20 게이트 (0) | 2026.04.21 |
| 7. 유저모드 Task Switching (0) | 2026.04.19 |
| 6. 보호 (0) | 2026.04.13 |
| 5. 태스크 스위칭, 문맥 교환 (0) | 2026.04.13 |