본문 바로가기
OS/만들면서 배우는 OS 커널의 구조와 원리

8-2. 페이징 - 페이징 구현

by 내용증명장인 2026. 4. 23.

여태까지는 세그먼트를 활용하여 논리 주소에서 바로 물리 주소로 변환하면서 예제를 작성했다.
페이징을 활용하면 논리 주소 → 선형 주소 → 물리 주소 순으로 변환되게 된다.


선형 주소

페이징을 활용하려면 두 가지가 필요하다.

  1. 페이지 디렉토리
  2. 페이지 테이블

페이지 디렉토리는 시스템에서 한 개만 존재하며, 페이지 디렉토리 엔트리 * 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일 때 다음과 같이 이루어진다.

  1. CR3을 참조하여 페이지 디렉토리 시작 주소를 찾는다.
  2. 선형 주소의 상위 10비트를 참조하여 시작 주소 + (0x0*4)를 통해 페이지 디렉토리 엔트리를 찾는다.
    페이지 디렉토리 엔트리를 참조하여 페이지 테이블 시작 주소를 찾는다.
  3. 선형 주소 중위 10비트를 참조하여 페이지 테이블 시작 주소 + (0x10 * 4)를 통해 페이지 테이블 엔트리를 찾는다.
    페이지 테이블 엔트리를 참조하여 4KB 페이지 시작 주소를 찾는다.
  4. 선형 주소 하위 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