가상 주소 페이지 번호·오프셋 계산기 쉽게 이해하기 — 개념과 원리
페이징 방식의 가상 메모리에서 프로세서는 가상 주소를 페이지 번호와 오프셋으로 나눕니다. 페이지 번호는 페이지 테이블을 거쳐 물리 프레임 번호로 바뀌고, 오프셋은 물리 주소에 그대로 붙습니다. 이 계산기는 16진수 주소와 페이지 크기(KiB)를 받아 이 분리를 계산하며, 운영체제 수업이나 디버거 출력·크래시 덤프를 읽을 때, TLB와 대형 페이지를 이해할 때 쓰입니다.
계산 방법
- 페이지 번호 = ⌊주소 ÷ 페이지 크기⌋
- 오프셋 = 주소 mod 페이지 크기
- 오프셋 비트 수 = log₂(바이트 단위 페이지 크기)
페이지 크기는 KiB로 입력하며 1,024를 곱해 바이트로 바꿉니다. 주소는 16진수로 읽고("0x"는 있어도 없어도 됨) 큰 정수로 처리하므로 64비트 주소도 계산됩니다. 결과는 16진수로 표시합니다.
원리
페이지 크기는 2의 거듭제곱이므로, 페이지 크기로 나누는 것은 오른쪽으로 k비트 이동하는 것과 같고 나머지는 하위 k비트 그 자체입니다. 4 KiB 페이지라면 k = 12이므로 하위 12비트(16진수 세 자리)가 오프셋, 나머지 상위 비트가 페이지 번호가 됩니다. 한 페이지 안의 모든 바이트는 페이지 번호가 같으므로, 페이지 테이블 항목 하나로 페이지 전체를 대응시킬 수 있습니다.
예제 풀이
- 입력값: 주소 0x7FFE1234, 페이지 크기 4 KiB = 4,096바이트 = 2^12
- 오프셋 비트: log₂(4,096) = 12
- 페이지 번호: 2,147,357,236 ÷ 4,096 = 524,257, 나머지 564이며 524,257 = 0x7FFE1
- 오프셋: 564 = 0x234
- 검산: 16진수 끝 세 자리를 떼면 페이지 번호, 남기면 오프셋입니다.
결과 해석
오프셋은 페이지 안에서 몇 번째 바이트인지를 뜻하며 변환 뒤에도 바뀌지 않습니다. 페이지 번호는 MMU가 페이지 테이블에서 찾는 색인입니다. 2 MiB 대형 페이지를 쓰면 오프셋이 21비트로 늘어나, 같은 메모리를 훨씬 적은 항목으로 관리할 수 있습니다.
흔한 실수
- 페이지 크기를 KiB가 아닌 바이트로 입력하는 경우
- 2의 거듭제곱이 아닌 페이지 크기를 넣는 경우
- 페이지 번호를 물리 주소로 착각하는 경우. 페이지 테이블을 거쳐야 프레임 번호가 됩니다.
자주 묻는 질문
32비트 주소 공간에 4 KiB 페이지는 몇 개인가요?
2^32 ÷ 2^12 = 2^20, 약 100만 개입니다.
물리 주소는 어떻게 만들어지나요?
물리 주소 = 프레임 번호 × 페이지 크기 + 오프셋이며, 오프셋은 그대로 유지됩니다.
x86-64는 왜 4 KiB 페이지를 쓰나요?
아키텍처의 기본 페이지 크기이기 때문이며, 큰 영역에는 2 MiB와 1 GiB 페이지도 지원합니다.
출처: A. Silberschatz, P. B. Galvin, G. Gagne, Operating System Concepts, Wiley · Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A (paging)