리눅스 가상 메모리 주소변환

sungho·2024년 12월 5일
0

가상 메모리

목록 보기
9/11

1. 리눅스 가상 주소에서 물리 주소로의 매핑

리눅스 운영 체제에서 가상 메모리 주소는 프로세스가 사용하는 메모리 공간을 관리합니다. 가상 주소는 프로세스가 사용하는 주소 공간을 나타내며 물리 주소는 실제 RAM에 있는 주소를 의미합니다. 리눅스는 MMU(Memory Management Unit)를 통해 가상 주소를 물리 주소로 변환하여 메모리 접근을 관리합니다.

2. MMU의 매핑 레벨(CPU 아키텍처)

  • MMU는 가상 주소를 물리 주소로 변환하는 데 필요한 여러 매핑 레벨을 지원
  • CPU 아키텍처에서는 다단계 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환

3. 리눅스의 페이지 테이블

  • 리눅스에서 페이지 테이블은 가상 주소와 물리 주소 간의 매핑 정보를 저장하는 자료구조
  • 페이지 테이블은 프로세스마다 존재하며 프로세스가 사용하는 가상 페이지와 해당 페이지가 매핑된 물리 페이지의 정보를 포함
  • 페이지 테이블은 페이지 폴트 처리와 같은 메모리 관리 작업을 수행하는 데 필수적

리눅스의 5단계 페이지 테이블 구조

  • PGD(Page Global Directory)
    • 최상위 레벨의 페이지 테이블로 전체 가상 주소 공간을 관리
  • P4D(P4 Directory)
    • PGD 아래에 위치하며 PUD로 연결
  • PUD(Page Upper Directory)
    • PGD 아래의 레벨로 더 작은 주소 공간을 관리
  • PMD(Page Middle Directory)
    • PUD 아래의 레벨로 중간 크기의 주소 공간을 관리
  • PTE(Page Table Entry)
    • PMD 아래의 레벨로 실제 물리 페이지에 대한 매핑 정보를 포함

32비트 페이지 테이블 구조

  • 32비트 주소
    • 가상 주소는 32비트로 구성
  • 오프셋
    • 10비트 오프셋
      • 상위 10비트는 PGD(Page Global Directory)를 인덱싱하는 데 사용
    • 10비트 오프셋
      • 다음 10비트는 PTE(Page Table Entry)를 인덱싱
    • 12비트 오프셋
      • 마지막 12비트는 페이지 내의 바이트 오프셋
  • PGD(Page Global Directory)
    • 가상 주소의 상위 비트를 사용하여 인덱싱
    • 다음 단계인 PTE를 가리킴
  • PTE (Page Table Entry)
    • 실제 물리적 페이지 프레임을 가리키는 엔트리
    • 가상 페이지와 물리 페이지 간의 매핑 정보를 포함
  • 4KB 페이지 프레임
    • PTE는 4KB 크기의 물리적 페이지를 가리킴

4. MMU와 커널 간의 협력

  • MMU와 커널 간의 협력은 가상 메모리 주소 변환의 핵심
  • MMU는 프로세스가 접근하는 가상 주소를 물리 주소로 변환하는 역할
  • 커널은 페이지 테이블을 관리하고 페이지 폴트와 같은 이벤트를 처리
  1. 가상 주소 접근
    1. 프로세스가 가상 주소에 접근하면 MMU가 해당 주소를 변환하려고 시도
  2. 페이지 테이블 조회
    1. MMU는 페이지 글로벌 디렉토리(pgd_t)와 페이지 테이블 엔트리(pte_t)를 통해 물리 주소 파악
  3. 페이지 폴트 발생
    1. MMU가 페이지 테이블에서 해당 페이지를 찾지 못하면 페이지 폴트를 발생
  4. 커널 핸들링
    1. 커널은 페이지 폴트 핸들러를 호출하여 필요한 페이지를 메모리에 로드하고 페이지 테이블을 업데이트
  5. 재시도
    1. 페이지가 메모리에 로드되면 프로세스는 다시 해당 주소에 접근해 물리 주소로 변환

5. TLB 미스 처리

  • TLB 미스는 MMU가 TLB에서 필요한 주소 변환 정보를 찾지 못할 때 발생
  • TLB 미스가 발생하면 MMU는 페이지 테이블을 탐색하여 필요한 정보를 가져오고 이를 TLB에 저장
  1. TLB 미스 발생
    1. MMU가 TLB에서 변환 정보를 찾지 못하면 TLB 미스를 발생
  2. 페이지 테이블 탐색
    1. MMU는 페이지 테이블을 탐색하여 필요한 PTE를 파악
  3. TLB 업데이트
    1. 찾은 PTE를 TLB에 저장하여 다음 번 접근 시 빠르게 변환

6. KPTI(Kernel Page Table Isolation)

의미

  • Meltdown 보안 취약점을 완화하기 위해 설계된 기능

원리

  • 페이지 테이블 분리
    • 커널은 사용자 공간과 커널 공간을 위한 두 개의 별도 페이지 테이블을 유지
    • 유저 공간 페이지 테이블에는 최소한의 커널 메모리만 포함되어 있어 필요한 경우에만 접근이 가능

전환 메커니즘

  • 전환 시점
    • 커널 모드로 진입하거나 종료할 때 두 페이지 테이블 간 전환
    • 이를 통해 사용자 모드에서는 커널 메모리에 접근할 수 없음
  • CR3 레지스터
    • CR3 레지스터는 현재 활성화된 페이지 테이블을 가리키며 전환 시 사용
    • SWITCH_TO_KERNEL_CR3와 SWITCH_TO_USER_CR3 매크로는 이러한 전환을 지원

PGD 구조

  • 8KB PGD
    • 유저와 커널 모드를 위한 두 개의 PGD를 포함
    • 해당 모드에 맞는 PGD가 활성화

매크로 수정

  • set_pgd() 매크로
    • KPTI를 지원하기 위해 set_pgd() 매크로가 수정
    • 유저 주소에 해당하는 PGD 엔트리를 설정할 때 상위 PGD 페이지에도 반영

7. 결론

리눅스의 가상 메모리 주소변환은 프로세스의 메모리 관리와 안정성을 보장하는 중요한 기능입니다. MMU를 통한 가상 주소와 물리 주소 간의 매핑, 페이지 테이블 구조, TLB, KPTI 등 다양한 요소가 협력하여 효율적인 메모리 관리를 지원합니다.

0개의 댓글