크래프톤 정글 (컴퓨터 시스템: CSAPP)/9장 가상 메모리
컴퓨터 시스템 : CSAPP 9장 정리 - 9.7 사례 연구 : 인텔 코어 i7/리눅스 메모리 시스템
고웅
2025. 4. 20. 14:48
9.7 Intel Core i7/Linux 메모리 시스템 사례 연구
지금까지 설명한 가상 메모리 개념들을 실제 시스템에 적용한 사례로, Intel Core i7에서 Linux가 사용하는 메모리 시스템을 다룬다.
Core i7 아키텍처 개요
- 하스웰(Haswell) 마이크로아키텍처는 64비트 가상 및 물리 주소 공간을 지원한다.
- 현재 Core i7 구현은 다음을 지원한다:
- 48비트 가상 주소 공간 (256TB)
- 52비트 물리 주소 공간 (4PB)
- **32비트 호환 모드 (4GB 주소 공간)**도 존재한다.
Core i7 메모리 구성
- 4개의 코어, 공유 L3 캐시, DDR3 메모리 컨트롤러 포함
- 각 코어는 다음을 포함함:
- L1 i-TLB (128 entries), L1 d-TLB (64 entries), L2 TLB (512 entries) → 모두 4-way set associative
- L1 i-cache, d-cache: 32KB, 8-way
- L2 캐시: 256KB, 8-way
- L3 캐시: 8MB, 16-way
- TLB는 가상 주소 기반, 캐시는 물리 주소 기반
- 페이지 크기는 4KB 또는 4MB로 설정 가능하며, Linux는 4KB 페이지를 사용함.
9.7.1 Core i7 주소 변환
Core i7은 4단계 페이지 테이블 구조를 사용한다.
주소 변환 흐름 요약
- CPU가 가상 주소를 생성한다.
- MMU는 해당 주소를 L1 TLB (16셋, 각 4라인)에서 찾는다.
- TLB miss 발생 시, 4단계 페이지 테이블 계층 구조를 탐색한다.
- CR3 레지스터는 레벨 1 페이지 테이블의 물리 주소를 저장하며, 문맥 전환 시 복원된다.
- 각 단계의 PTE (페이지 테이블 엔트리)는 하위 페이지 테이블의 물리 주소를 포함한다.
- PTE에는 권한 비트들(R/W, U/S, XD)이 포함되며, 접근 제어에 사용된다.
PTE는 또한 참조 비트(A)와 수정 비트(D)를 가지고 있으며, MMU가 자동으로 설정한다. 커널은 이를 통해 페이지 교체 알고리즘을 효율적으로 수행할 수 있다.
9.7.2 리눅스 가상 메모리 시스템 (Linux Virtual Memory System)
리눅스의 가상 메모리 시스템은 하드웨어(MMU)와 커널이 협력하여 구성된다. 이 절에서는 리눅스가 가상 메모리를 어떻게 조직하고, 페이지 폴트를 어떻게 처리하는지를 설명한다.
프로세스별 가상 주소 공간
- 각 프로세스는 고유한 가상 주소 공간을 가진다.
- 이 공간은 코드(.text), 초기화 데이터(.data), 힙, 공유 라이브러리, 스택으로 구성된다.
- 사용자 스택 위에는 커널 가상 메모리가 존재하며, 커널 코드 및 데이터 구조들이 위치한다.
커널 가상 메모리 영역
- 커널 메모리는 공통적인 영역과 프로세스별 영역으로 나뉜다:
- 공통 영역: 모든 프로세스가 공유하는 커널 코드 및 글로벌 데이터.
- 개별 영역: 페이지 테이블, 커널 스택, 가상 주소 공간 관리 구조 등 프로세스 전용 데이터 구조.
리눅스의 가상 메모리 영역 관리
- 리눅스는 가상 메모리 공간을 vm_area_struct 구조체 리스트로 관리한다.
- 각 영역은 코드, 데이터, 힙, 공유 라이브러리, 스택 등의 세그먼트로 구성된다.
- 각 vm_area_struct는 다음 정보를 포함한다:
- vm_start, vm_end: 영역의 시작과 끝 주소
- vm_prot: 읽기/쓰기 권한
- vm_flags: 공유 여부, 기타 속성
- vm_next: 다음 영역에 대한 포인터
이 구조는 불연속적인 주소 공간 관리, 유연한 메모리 할당, 빠른 접근 제어를 가능하게 만든다.
페이지 폴트 처리
MMU가 어떤 가상 주소 A에 대해 페이지 폴트를 발생시키면, 커널은 다음과 같이 처리한다:
- 주소 A가 유효한가?
- vm_area_struct 리스트에서 A가 속한 영역을 찾는다.
- 없으면 segmentation fault 발생 (비정상 접근).
- 접근 권한이 유효한가?
- 예: 읽기 전용 페이지에 쓰기 시도한 경우 → protection fault.
- 모든 조건이 유효한 경우
- 희생 페이지를 선택하고, dirty하면 디스크에 저장.
- 새 페이지를 디스크에서 읽어오고, 페이지 테이블을 갱신.
- 원래 명령어를 다시 실행한다.