인텔 Core i7과 리눅스 메모리 시스템 - 실전 구조 따라잡기
지금까지 우리는 가상 메모리가 주소를 어떻게 번역하고, 어떻게 보호하고, 어떻게 캐시처럼 작동하는지를 배웠습니다. 그런데 이론만으로는 부족할 수 있다는 생각이 들 수도 있는데요. 그래서 실제 시스템에서는 이러한 구조들이 어떻게 구현되고 협력하는지 알아보려고 합니다.
이번 절에서는 CSAPP 9.7절을 바탕으로 인텔 Core i7 CPU와 리눅스 운영체제 환경에서의 가상 메모리 구조를 실제 사례로 정리해 보겠습니다.
인텔 Core i7의 주소 구조 (x86-64)
48비트 가상 주소 사용
x86-64는 이름처럼 64비트 주소 공간을 갖는 시스템인데요. 그런데 실제로는 그 전체를 다 쓰지 않고, 현재는 48비트만 사용하고 있습니다. 이 말은 곧 가상 주소에서 상위 16비트는 의미 있는 값이 아니라, 아래에서 올라오거나 위에서 내려오는 값을 기준으로 자동으로 채워지는(sign-extension) 비트들이라는 뜻이지요.
그래서 주소 전체 범위는 0x0000_0000_0000_0000 ~ 0xFFFF_FFFF_FFFF_FFFF
처럼 보이지만, 실제로 쓸 수 있는 가상 주소 범위는 아래쪽과 위쪽에 각각 256TB 정도만 열려 있습니다. 그리고 이렇게 구분된 아래쪽 256TB는 사용자 프로그램이 사용하는 공간, 위쪽 256TB는 커널(운영체제)이 사용하는 공간으로 나뉘어집니다. 이는 보안을 위해서도 중요한데, 사용자 프로그램이 커널 영역을 함부로 건드리지 못하게 하는 예방장치라고 할 수 있습니다.
주소 공간 분할
영역 | 범위 (논리적) | 설명 |
사용자 영역 | 하위 256TB | 사용자 프로세스용 |
커널 영역 | 상위 256TB | OS 커널 전용. 사용자 접근 불가 |
4단계 페이지 테이블 구조
인텔 Core i7은 4단계 다단계 페이지 테이블을 사용합니다.
VA
↓
PML4 (Level 4)
→ PDPT (Level 3)
→ PD (Level 2)
→ PT (Level 1)
↓
Physical Frame (PA)
각 단계가 차지하는 비트
구성 | 비트 수 | 역할 |
PML4 index | 9비트 | 최상위 테이블 |
PDPT index | 9비트 | Page Directory Pointer Table |
PD index | 9비트 | Page Directory |
PT index | 9비트 | Page Table |
Offset | 12비트 | 4KB 페이지 내 바이트 위치 |
이를 다 합치면 9 + 9 + 9 + 12로 총 48비트가 됩니다. 이는 현재 사용 중인 VA의 크기와 같죠.
리눅스에서의 메모리 분배 전략
프로세스별 주소 공간 구성
영역 | 용도 | 설명 |
텍스트 (.text) | 실행 코드 | 읽기 + 실행 전용 |
데이터 (.data/.bss) | 전역/정적 변수 | 읽기 + 쓰기 |
힙 | malloc 등 | 동적 메모리 (아래→위 성장) |
스택 | 함수 호출 | 지역 변수 (위→아래 성장) |
커널 영역 | OS 전용 | 사용자 접근 불가 |
이 구조는 지난 9.2절에서 봤던 주소 공간의 구성과 거의 동일하지만, 실제 시스템에서는 페이지 단위로 보호 및 관리가 적용된다는 점이 다릅니다.
TLB와 페이지 테이블 캐시
- Core i7은 다수의 TLB 엔트리와 다단계 캐시를 사용
- TLB miss가 발생하면 MMU가 페이지 테이블 탐색을 자동 수행
- 최종 결과는 다시 TLB에 저장 (캐시처럼 작동)
곧 TLB가 빠를 수록 주소 변환 성능이 향상됩니다.
리눅스에서 페이지 폴트 처리
프로그램이 어떤 데이터에 접근하려고 했는데, 그 데이터가 아직 메모리에 없거나, 접근 권한이 없는 페이지라면 '페이지 폴트'라는 예외 상황이 발생하게 됩니다.
이런 일이 생기면, 운영체제(커널)가 대신 개입해서 이를 처리하게 됩니다. 커널은 fault handler를 실행해 디스크에서 데이터를 불러오고, 페이지 테이블과 TLB를 갱신합니다.
그리고 모든 준비가 끝나면, 프로그램은 마치 아무 일도 없었던 것처럼 원래 하던 작업을 다시 이어가지요. 이 모든 과정은 자동으로 이루어지기 때문에, 사용자는 페이지 폴트가 일어났다는 사실조차 모르게 됩니다.
핵심 요약
- x86-64는 현재 48비트 가상 주소 공간을 사용하며, 상·하위 각 256TB 범위가 각각 사용자/커널 영역으로 나뉘어 사용된다
- 4단계 페이지 테이블은 PML4 -> PDPT -> PD ->PT의 순서를 가지며, 각각의 다음 테이블 주소를 따라 내려가는 방식이다
- 리눅스의 메모리 구성은 텍스트, 데이터, 힙, 스택 mmap 영역 등의 영역으로 나뉜다
- MMU는 가상 주소를 물리 주소로 변환하는 장치이고, TLB는 이 과정을 빠르게 만들기 위한 고속 캐시다
- 페이지 폴트가 발생 시 커널은 디스크에서 필요한 페이지를 메모리에 로딩하고, 다시 프로그램이 원래 명령을 실행하도록 복귀시킨다
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 9장 완전 정복] 9.9 rawdata 공유 (전체 학습 목표, 학습 정리 자료) (0) | 2025.04.25 |
---|---|
[CSAPP 9장 완전 정복] 9.8 메모리 매핑 - mmap으로 파일을 메모리처럼 사용하는 방법 (0) | 2025.04.23 |
[CSAPP 9장 완전 정복] 9.6 주소의 번역 - 가상 주소는 어떻게 물리 주소로 바뀔까? (0) | 2025.04.23 |
[CSAPP 9장 완전 정복] 9.5 메모리 보호 - 가상 메모리가 제공하는 고립과 안전 (0) | 2025.04.22 |
[CSAPP 9장 완전 정복] 9.4 메모리 관리를 위한 도구로서의 VM - 할당과 회수의 비밀 (0) | 2025.04.22 |