Paging

[0x00] Concept

VMM 에서 EPT 를 이용하여 주소를 변환 메커니즘을 보며 이해되지 않던 부분이 많았습니다.

이 부분을 좀 더 확실하게 이해하기 위해 Intel SDM Vol.3A Chapter 4 Paging 을 확인해보기로 하였습니다.

Paging(또는 선형 주소 변환)은 선형 주소를 변환하여 메모리 또는 I/O 장치에 액세스하는 데 사용할 수 있도록 변환하는 프로세스 입니다.

Paging 은 각 선형 주소를 물리 주소로 변환하고 각 변환에 대해 선형 주소에 대한 허용되는 액세스와 이러한 액세스에 사용되는 캐싱 유형을 결정합니다.

먼저 각 주소와 Intel 에서 설명하는 메모리 구조에 대해 이해하고 진행하도록 하겠습니다.

명확하게 가상 주소, 논리 주소, 선형 주소, 물리 주소에 대해 이해해야 하기 때문입니다.

[0x01] IA-32 Memory Models

프로세서의 메모리 관리 기능을 사용할 때 프로그램은 물리 메모리를 직접 다루지 않습니다. 대신 Flat, Segmented, Read-Address Mode Memory Model 이라는 세 가지 메모리 모델 중 하나를 사용하여 메모리에 액세스하게 됩니다.

  • Flat Memory Model : 메모리는 프로그램에 단일 연속 주소 공간으로 되어있습니다. 이 공간을 Linear Address Space(이하 “선형 주소 공간”)이라고 합니다. 코드, 데이터, 스택이 모두 이 공간에 포함됩니다. 선형 주소 공간은 바이트 주소 지정이 가능하며, 선형 주소 공간의 모든 바이트에 대한 주소를 Linear Address(이하 “선형 주소”) 라고 합니다.
  • Segmented Model : 메모리는 프로그램에 Segment라고 하는 독립된 주소 공간 그룹으로 되어있습니다. 코드, 데이터, 스택은 일반적으로 별도의 Segment에 포함됩니다. Segment의 바이트 주소를 지정하기 위해 프로그램은 Logical Address(이하 “논리 주소”)를 발행합니다. 이것은 Segment SelectorOffset 으로 구성됩니다.(Far Pointer 라고도 불림)

    Selector 는 액세스할 Segment를 식별하고 OffsetSegment의 주소 공간에서 바이트를 식별합니다.

    내부적으로 시스템에 대해 정의된 모든 Segment는 프로세서의 선형 주소 공간에 매핑됩니다. 따라서 프로세서는 메모리 위치에 접근하기 위해 각 논리 주소를 선형 주소로 변환해야 합니다.

    Segment 메모리를 사용하는 가장 큰 이유는 프로그램과 시스템의 신뢰성을 높이는 것 입니다. 예를 들어 프로그램의 스택을 별도의 Segment에 배치하면 스택이 코드 또는 데이터 공간으로 확장되어 명령이나 데이터를 덮어쓰는 것을 방지할 수 있습니다.

  • Real-Address Mode Memory Model : Intel 8086 프로세서를 위한 모델이며 호환성을 위해 존재합니다. 이는 생략합니다.

위의 세 가지 모델을 표현한 그림은 아래와 같습니다.

[-] Paging and Virtual Memory

Flat 또는 Segmented Memory Model 에서 선형 주소 공간은 직접 또는 Paging 을 통해 프로세서의 물리 주소 공간에 매핑됩니다. 직접 매핑(CR0.PG = 0, 페이징이 비활성화 된 경우)을 사용할 때 각 선형 주소는 물리 주소와 1:1로 대응합니다.

선형 주소는 변환 없이 프로세서의 주소 라인으로 전송됩니다.

즉 페이징이 비활성화 된 경우 선형 주소는 물리 주소이다 라고 할 수 있습니다.

페이징이 활성화된 경우(CR0.PG = 1) 선형 주소 공간이 가상 메모리에 매핑된 페이지로 분할됩니다. 그런 다음 가상 메모리의 페이지는 필요에 따라 물리 메모리에 매핑됩니다.

보호 모드에서 동작할 때 어떤 형태로든 Segment를 사용해야 합니다. Segment를 비활성화하는 비트가 없기 때문입니다. 그러나 페이징 사용은 선택 사항입니다.

이러한 두 가지 메커니즘(Segment, Paging)은 단순한 단일 프로그램(또는 단일 작업) 시스템, 멀티 태스킹 시스템 또는 공유 메모리를 사용하는 다중 프로세서 시스템을 지원하도록 구성할 수 있습니다.

Segment는 프로세서의 주소 지정 가능한 메모리 공간(Addressable Memory Space), 즉 선형 주소 공간을 Segment라는 더 작은 보호된 주소 공간으로 나누는 메커니즘을 제공합니다.

Segment는 프로그램의 코드, 데이터, 스택을 보관하거나 시스템 데이터 구조(ex. TSS, LDT)를 보관하는 데 사용할 수 있습니다. 프로세서에서 둘 이상의 프로그램(또는 작업)이 실행 중인 경우 각 프로그램에 대한 고유한 Segment 세트를 할당할 수 있습니다. 그런 다음 프로세서는 이러한 Segment 간의 경계를 적용하고 한 프로그램이 다른 프로그램의 Segmentwrite 와 같은 행위를 통해 방해하지 않도록 합니다.

Segment 메커니즘은 또한 특정 유형의 Segment에서 수행될 수 있는 작업이 제한될 수 있도록 Segment 타이핑을 허용합니다.

시스템의 모든 Segment는 프로세서의 선형 주소 공간에 포함됩니다. 특정 Segment에서 바이트를 찾으려면 Logical Address(이하 “논리 주소”)가 제공되어야 합니다. 논리 주소는 Segment SelectorOffset 으로 구성됩니다.

[0x02] Memory Management

IA-32 아키텍처의 메모리 관리 기능은 Segment, Paging으로 나뉩니다.

먼저 설명에 앞서 세그먼트와 페이징에 대한 그림은 아래와 같습니다.

Segment는 개별 코드, 데이터, 스택 모듈을 격리하는 메커니즘을 제공하므로 여러 프로그램(또는 작업)이 서로 간섭하지 않고 동일한 프로세서에서 실행될 수 있습니다.

페이징은 프로그램 실행 환경의 섹션이 필요에 따라 물리 메모리에 매핑되는 기존의 요구 페이지(demand-page), 가상 메모리 시스템을 구현하기 위한 메커니즘을 제공합니다. 페이징을 사용하여 여러 작업 간의 격리를 제공할 수 있습니다.

Segment SelectorSegment의 고유 식별자 입니다. 무엇보다도 Segment Descriptor 라고 하는 데이터 구조에 대한 Descriptor Table(ex. GDT) 의 오프셋을 제공합니다.

Segment Descriptor 에는 Segment 에 대한 액세스 권한 및 권한 수준, 유형, 선형 주소 공간에서 세그먼트의 첫 번째 바이트 위치(Base Address)가 존재합니다.

논리 주소의 Offset 부분은 Segment Base Address 와 더해져 바이트를 찾습니다. 따라서 **Segment Base Address 와 논리 주소의 Offset 은 프로세서의 선형 주소 공간에서 선형 주소를 형성**합니다.

페이징을 사용하지 않으면 프로세서의 선형 주소 공간이 물리 주소와 직접 매핑됩니다. 물리 주소 공간은 프로세서가 주소 버스에서 생성할 수 있는 주소 범위로 정의됩니다.

멀티태스킹 컴퓨팅 시스템은 일반적으로 물리 메모리에 한번에 포함할 수 있는 것보다 훨씬 큰 선형 주소 공간을 정의하기 때문에 선형 주소 공간을 “가상화” 하는 몇 가지 방법이 필요합니다. 선형 주소 공간의 이러한 가상화는 프로세서의 페이징 메커니즘을 통해 처리됩니다.

페이징은 적은 양의 물리 메모리(RAM, ROM) 및 일부 디스크 스토리지를 이용하여 큰 선형 주소 공간을 시뮬레이션하는 가상 메모리 환경을 지원합니다.

페이징을 사용할 경우 각 SegmentPage(일반적으로 각 4-KByte, 이하 “페이지”)로 나뉘며, 물리 메모리나 디스크에 저장됩니다. OS 또는 시스템은 이러한 페이지를 추적하기 위해 Page Directory(이하 “페이지 디렉토리”) 와 Page Table(이하 “페이지 테이블”) 세트를 관리합니다.

프로그램(또는 작업)이 선형 주소 공간의 주소 위치에 액세스하려고 하면 프로세서는 페이지 디렉토리와 페이지 테이블을 이용하여 선형 주소를 물리 주소로 변환한 다음 메모리 위치에 대해 요청된 작업을 수행합니다.

액세스 중인 페이지가 현재 물리 메모리에 없는 경우 프로세서는 Page-Fault Exception 을 발생시켜 프로그램 실행을 중단합니다. 그런 다음 OS 또는 프로그램은 페이지를 디스크에서 물리 메모리로 읽고 프로그램 실행을 계속합니다.

[0x03] Paging Modes and Control Bits

위의 내용을 토대로 앞으로 선형 주소는 흔히 알고 있는 논리적인 가상 주소를 의미하는 것으로 표현하겠습니다. 페이징이 활성화 된 상태로 사용하기 때문에 물리 주소를 선형 주소로 표현하지는 않도록 하겠습니다.

페이징의 동작은 다음 제어 비트에 의해 제어됩니다.

  • CR0.WP, PG(bit 16, 31)
  • CR4.PSE, PAE, LA57, PCIDE, SMEP, SMAP, PKE, CET, PKS(bit 4, 5, 7, 12, 17, 20, 21, 22, 23, 24)
  • IA32_EFER MSRLME, NXE(bit 8, 11)
  • EFLAGSAC(bit 18)
  • VM-execution controlenable HLAT 제어 비트(Tertiary_enable HLAT), Hypervisor-Managed Linear-Address Translation 을 의미함

소프트웨어는 MOV to CR0 명령을 사용하여 CR0.PG 를 1으로 설정함으로써 페이징 기능을 활성화 합니다. 그 전에 소프트웨어는 CR3 에 프로세서가 선형 주소 변환에 사용할 첫 번째 페이징 구조의 물리 주소를 포함하고 있는지 확인하고 해당 구조가 원하는 대로 초기화되었는지 확인해야 합니다.

[-] 4-Level Paging and 5-Level Paging

현재 운영체재 기준으로 사용하지 않는 페이징 모드의 경우 생략하고 진행됩니다.

전체적인 페이징 모드 별 페이징 구조는 아래와 같습니다.

각 페이징 모드를 확인하는 방법은 다음과 같습니다.

위의 내용을 토대로 4-Level Paging 의 경우 CR0.PG = 1, CR4.PAE = 1, IA32_EFER.LME = 1, CR4.LA57 = 0 인 경우 사용합니다. 현재 가상환경의 경우 아래와 같이 4-Level Paging 모드로 사용되고 있음을 확인할 수 있습니다.

4-Level Paging 은 48-bit 선형 주소를 52-bit 물리 주소로 변환합니다. 52-bit는 4-PByte 에 해당하지만 선형 주소는 48-bit로 제한됩니다. 주어진 시간에 최대 256TB의 선형 주소 공간에 액세스할 수 있습니다.

[-] Ordinary Paging and HLAT Paging

선형 주소 변환이 첫 번째 페이징 구조를 식별하는 방법과 관련하여 크게 다른 두 가지 형태의 4-Level, 5-Level Paging 이 있습니다.

일반적인 형식을 Ordinary Paging 이라고 하며 32-bit Paging 에서 수행되는 것과 유사하게, 첫 번째 페이징 구조를 찾기 위해 CR3 를 사용합니다.

또한 HLAT 라고 불리는 VMX 기능과 함께 사용하기 위한 대체 형식을 사용할 수 있습니다. 이러한 형식을 HLAT Paging 이라고 하며, 이 형식은 VMX non-root operation 에서만 사용되며 VM-execution controlenable HLAT 비트가 1인 경우에만 사용됩니다.

HLAT PagingHLAT Pointer 라고 하는 VMCSVM-execution control field 를 이용하여 첫 번째 페이징 구조를 찾습니다.(HLATP)

특정 선형 주소를 변환하는 데 HLAT Paging 이 사용되는지 여부는 주소와 HLAT Prefix Size 라고 하는 VMCSVM-execution control field 의 값에 따라 다릅니다.

  • HLAT Prefix Size 가 0이면 모든 선형 주소는 HLAT Paging 을 사용하여 변환됩니다.
  • HLAT Prefix Size 가 0이 아닌 경우, 주소의 bit 63 이 1이면 HLAT Paging 을 사용하여 선형 주소가 변환됩니다. 주소의 bit 63 이 0이면 Ordinary Paging 을 사용하여 변환됩니다.

[-] Use of CR3 with Ordinary 4-Level and 5-Level Paging

별 다른 언급이 없는 이상 대부분의 형식은 Ordinary Paging 입니다.

4-Level, 5-Level Paging 은 각각 첫 번째 페이징 구조를 찾는 데 CR3 에 배치된 메모리 내 페이징 구조의 계층을 사용하여 선형 주소를 변환합니다.

4-Level Paging 의 경우 PML4 Table 이고, 5-Level Paging 의 경우 PML5 Table 입니다. 4-Level, 5-Level Paging 에서 사용되는 CR3CR4.PCIDE 를 설정하여 활성화했는지 여부에 따라 달라집니다.

  • CR4.PCIDE 가 0인 경우 CR3 는 다음과 같습니다.

  • CR4.PCIDE 가 1인 경우에는 다음과 같습니다.

소프트웨어가 CR4.PCIDE 값을 수정하면 논리 프로세서는 즉시 새 값에 지정된 대로 CR3 를 사용하기 시작합니다.

[-] Use of HLATP with HLAT 4-Level and 5-Level Paging

참고 : 링크

HLAT Paging 형식의 4-Level, 5-Level Paging 은 각각 첫 번째 페이징을 찾는 데 사용되는 HLATP 값으로 메모리 페이징 구조의 계층을 사용하여 선형 주소를 변환합니다.(4 = PML4, 5= PML5 테이블)

HLATP 는 bits 2:0, bits 11:5 가 예약된 비트인 점을 제외하고 CR4.PCIDE = 0 일 때의 CR3 와 동일한 형식을 갖습니다. HLATPPCID 값을 포함하지 않습니다. 만약 CR4.PCIDE = 1 인 경우 CR3[11:0] 의 값에 PCID 값이 지정됩니다.

[-] Linear-Address Translation with 4-Level and 5-Level Paging

4-Level, 5-Level Paging 은 선형 주소를 4-KByte, 2-MByte, 1-GByte 페이지에 매핑할 수 있습니다.

아래 그림은 각각 순서대로 매핑이 생성될 때의 4-Level Paging 을 위한 변환 프로세스를 보여줍니다.

  • 4-KByte Page

  • 2-MByte Page

  • 1-GByte Page

아래에서는 4-Level, 5-Level Paging 이 사용하는 변환 프로세스에 대해 자세히 설명하고 페이지 크기와 보호 키를 결정하는 방법에 대해 설명합니다.

  • 5-Level Paging 의 경우 자연스럽게 정렬된 4-KByte의 PML5 TableCR3 의 bits 51:12에 명시된 물리 주소에 위치합니다.(4-Level Paging 은 이 단계가 생략됩니다.)

    PML5 Table 은 512개의 64bit 크기 엔트리(PML5E)로 구성됩니다. PML5E 는 다음과 같이 정의된 물리 주소를 사용하여 선택됩니다.

    • bits 51:12 는 CR3 또는 HLATP 에서 가져온 값 입니다.
    • bits 11:3 은 선형 주소의 bits 56:48 입니다.
    • bits 2:0 는 모두 0입니다.

    PML5E 는 선형 주소의 bits 56:48 을 사용하여 식별되기 때문에 선형 주소 공간의 256-TByte 영역에 대한 액세스를 제어합니다.

  • 4-KByte 로 자연스럽게 정렬된 PML4 TableCR3 의 bits 51:12(4-Level Paging 의 경우) 또는 PML4E 의 bits 51:12(5-Level Paging 의 경우)에 지정된 물리 주소에 위치합니다.

    PML4 Table 은 512개의 64bit 크기 엔트리(PML4E)로 구성됩니다. PML4E 는 다음과 같이 정의된 물리 주소를 사용하여 선택됩니다.

    • bits 51:12 는 CR3 또는 HLATP 에서 가져온 값(4-Level Paging) 또는 bits 51:12 는 PML4E 에서 가져온 값(5-Level Paging)dlqslek.
    • bits 11:3 은 선형 주소의 bits 47:39 입니다.
    • bits 2:0 은 모두 0입니다.

    PML4E 는 선형 주소의 bits 47:39를 사용하여 식별되기 때문에 선형 주소 공간의 512-GByte 영역에 대한 액세스를 제어합니다.

  • 4-KByte 로 자연스럽게 정렬된 Page-Directory Pointer TablePML4E 의 bits 51:12 에 지정된 물리 주소에 있습니다. Page-Directory Pointer Table 은 512개의 64bit 크기 엔트리(PDPTE)로 구성됩니다.

    • bits 51:12 는 PML4E 에서 가져온 값입니다.
    • bits 11:3 은 선형주소의 bits 38:30 입니다.
    • bits 2:0 은 모두 0입니다.

    PDPTE 는 선형 주소의 bits 47:30 을 사용하여 식별되기 때문에 선형 주소 공간의 1-GByte 영역에 대한 액세스를 제어합니다.

PDPTEPS flag(bit 7)에 의존적입니다.

  • PDPTEPS Flag 가 1인 경우 PDPTE 는 1-GByte 페이지를 매핑합니다. 최종 물리 주소가 계산되며 아래와 같습니다.

    • bits 51:30 은 PDPTE 에서 가져온 값 입니다.
    • bits 29:0은 원래 선형 주소의 비트 입니다.
  • PDPTEPS Flag 가 0인 경우 4-KByte 로 자연스럽게 정렬된 Page DirectoryPDPTE 의 bits 51:12 에 지정된 물리 주소에 있습니다. Page Directory 는 512개의 64bit 크기 엔트리(PDE)로 구성됩니다.

    • bits 51:12 는 PDPTE 에서 가져온 값 입니다.
    • bits 11:3 은 선형주소의 bits 29:21 입니다.
    • bits 2:0 은 모두 0입니다.

    PDE 는 선형 주소의 bits 47:21 을 사용하여 식별되기 때문에 2-MByte 영역에 대한 액세스를 제어합니다.

마찬가지로 PDE 역시 PS Flag 에 의존적입니다.

  • PS Flag = 1 인 경우 PDE 는 2-MByte 페이지를 매핑합니다. 최종 물리 주소 계산은 아래와 같습니다.

    • bits 51:21 은 PDE 에서 가져온 값 입니다.
    • bits 20:0 은 원래 선형 주소의 비트 입니다.
  • PS Flag = 0 인 경우 4-KByte 로 자연스럽게 정렬된 Page TablePDE 의 bits 51:12 에 지정된 물리 주소에 있습니다. Page Table 은 512개의 64bit 크기 엔트리(PTE)로 구성됩니다.

    • bits 51:12 는 PDE 에서 가져온 값 입니다.
    • bits 11:3 은 선형 주소의 bits 20:12 입니다.
    • bits 2:0 은 모두 0입니다.
  • PTE 는 선형 주소의 bits 47:12를 사용하여 식별되기 때문에 모든 PTE 는 4-KByte 페이지를 매핑합니다.

    • bits 51:12 는 PTE 에서 가져온 값 입니다.
    • bits 11:0은 원래 선형 주소의 비트 입니다.

아래는 전체 페이징 구조에 대한 그림입니다.

[0x04] Proof of Concept

이를 이용해 실제 물리 주소를 구해보면 다음과 같습니다.

예시는 ExAllocatePool 의 물리 주소를 구해보겠습니다. 현재 운영체제는 Ordinary Paging 유형의 4-Level Paging 을 사용하고 있습니다.

  • ExAllocatePool : fffff800'6a663620

먼저 물리 주소로 변환하는 과정을 요약하면 다음과 같습니다.

1-1. PML4 Table 찾기 (CR3 의 bits 51:12)
1-2. PML4E 찾기
    - PML4 Table 에 bits 11:3 을 선형 주소의 bits 47:39 으로 설정한 물리 주소
2-1. Page-Directory Pointer Table 찾기
    - PML4E(물리 주소) 내 값의 bits 51:12
2-2. PDPTE 찾기
    - Page-Directory Pointer Table 에 bits 11:3을 선형 주소의 bits 38:30 으로 설정한 물리 주소 

3-1. PS Flag(bit 7)가 1인 경우
    - 최종 물리 주소의 bits 51:30은 PDPTE 의 bits 51:30 값, bits 29:0 은 원래 선형 주소의 bits 29:0으로 설정한 물리 주소
3-2. PS Flag가 0인 경우, Page Directory 찾기
    - PDPTE(물리 주소) 내 값의 bits 51:12
3-3. PDE 찾기
    - Page-Directory 에 bits 11:3을 선형 주소의 bits 29:21 으로 설정한 물리 주소

4-1. PS Flag가 1인 경우
    - 최중 물리 주소의 bits 51:21 은 PDE의 bits 51:21 값, bits 20:0은 원래 선형 주소의 bits 20:0으로 설정한 물리 주소
4-2. PS Flag가 0인 경우, Page-Table 찾기
    - PDE(물리 주소) 내 값의 bits 51:12
4-3. PTE 찾기
    - Page-Table 에 bits 11: 3을 선형 주소의 bits 20:12 으로 설정한 물리 주소

5. 최종 물리 주소 계산
    - bits 51:12 는 PTE의 bits 51:12, bits 11:0은 원래 선형 주소의 bits 11:0
  1. PML4E 찾기
    • 먼저 CR3 값을 구하고 해당 값의 bits 51:12 가 PML4 Table 입니다.
     2: kd> r cr3
     cr3=00000000001ae002
        
     0x1ae002 의 bits 51:12 는 0x1ae000
    
    • ExAllocatePool 의 선형 주소는 fffff800'6a663620 이며 해당 주소의 bits 47:39 를 PML4 Table 의 bits 11:3 에 설정한 값이 PML4E 입니다.

  2. PDPTE 찾기
    • 위에서 구한 PML4E (물리 주소)를 확인합니다.

        2: kd> !dq 00000000001aef80
        #  1aef80 00000000`0460b063 00000000`00000000
        #  1aef90 00000000`00000000 00000000`00000000
        #  1aefa0 00000000`00000000 00000000`00000000
        #  1aefb0 00000000`00000000 00000000`00000000
        #  1aefc0 00000000`00000000 00000000`00000000
        #  1aefd0 00000000`00000000 00000000`00000000
        #  1aefe0 00000000`00000000 00000000`00000000
        #  1aeff0 00000000`00000000 00000000`03129063
              
        0x460b063 의 bits 51:12 는 0x460b000
      
    • ExAllocatePool 의 선형 주소는 fffff800'6a663620 이며 해당 주소의 bits 38:30 를 Page-Directory Pointer Table 의 bits 11:3 에 설정한 값이 PDPTE 입니다.

  3. PS flag (bit 7)이 0이므로, PDE 찾기
    • 위에서 구한 PDPTE (물리 주소)를 확인합니다.
     2: kd> !dq 0x460b008
     # 460b008 00000000`0460c063 0a000002`13d00863
     # 460b018 0a000002`080d5863 0a000001`a5291863
     # 460b028 0a000001`ca1c5863 00000000`00000000
     # 460b038 00000000`00000000 00000000`00000000
     # 460b048 00000000`00000000 00000000`00000000
     # 460b058 00000000`00000000 00000000`00000000
     # 460b068 00000000`00000000 00000000`00000000
     # 460b078 00000000`00000000 00000000`00000000
        
     0x460c063 의 bits 51:12 는 0x460c000
    
    • ExAllocatePool 의 선형 주소는 fffff800'6a663620 이며 해당 주소의 bits 29:21 를 Page-Directory Table 의 bits 11:3 에 설정한 값이 PDE 입니다.

  4. PS Flag(bit 7)이 1이므로 최종 물리 주소 계산을 진행합니다.
    • 위에서 구한 PDE(물리 주소)를 확인합니다.

        2: kd> !dq 460ca98
        # 460ca98 0a000001`006000a1 0a000001`008000a1
        # 460caa8 0a000001`00a000a1 0a000001`00c000a1
        # 460cab8 0a000001`00e000a1 8a000001`010008e3
        # 460cac8 8a000001`012008e3 8a000001`014000a1
        # 460cad8 0a000002`0548f863 0a000002`05490863
        # 460cae8 0a000001`3061d863 0a000001`2d81e863
        # 460caf8 0a000002`02d1f863 0a000001`2993d863
        # 460cb08 0a000001`2993e863 0a000001`2993f863
      
    • ExAllocatePool 의 최종 물리 주소는 해당 선형 주소의 bits 20:0 을 설정, PDE (물리 주소) 값의 bits 51:21 을 설정한 값이 최종 물리 주소 입니다.

위 내용의 마지막 증명으로 !vtop 명령을 이용하여 물리 주소 변환 과정에서의 각 엔트리를 확인할 수 있으며 최종 물리 주소를 확인하면 일치하는 것을 볼 수 있습니다.

[0x05] Conclusion

해당 내용은 VMM 을 구현하기 위해 좀 더 페이징과 관련된 세부적인 내용을 학습하기 위해 작성되었습니다.

[0x06] Reference

  1. Intel 64 and IA-32 Architectures Software Developer’s Manual