크래프톤 정글 (컴퓨터 시스템: 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단계 페이지 테이블 구조를 사용한다.

주소 변환 흐름 요약

  1. CPU가 가상 주소를 생성한다.
  2. MMU는 해당 주소를 L1 TLB (16셋, 각 4라인)에서 찾는다.
  3. TLB miss 발생 시, 4단계 페이지 테이블 계층 구조를 탐색한다.
  4. CR3 레지스터는 레벨 1 페이지 테이블의 물리 주소를 저장하며, 문맥 전환 시 복원된다.
  5. 각 단계의 PTE (페이지 테이블 엔트리)는 하위 페이지 테이블의 물리 주소를 포함한다.
  6. 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에 대해 페이지 폴트를 발생시키면, 커널은 다음과 같이 처리한다:

  1. 주소 A가 유효한가?
    • vm_area_struct 리스트에서 A가 속한 영역을 찾는다.
    • 없으면 segmentation fault 발생 (비정상 접근).
  2. 접근 권한이 유효한가?
    • 예: 읽기 전용 페이지에 쓰기 시도한 경우 → protection fault.
  3. 모든 조건이 유효한 경우
    • 희생 페이지를 선택하고, dirty하면 디스크에 저장.
    • 새 페이지를 디스크에서 읽어오고, 페이지 테이블을 갱신.
    • 원래 명령어를 다시 실행한다​.