VMX Address Translation

[0x00] Concept

메뉴얼 순서 상 드디어 마지막 챕터입니다. 물론 구현을 하면서 더 상세한 내용이 필요할 것 입니다.

해당 챕터에서는 VMX Operation 을 위한 주소 변환을 지원하는 VPID(Virtual-Processor Identifier)EPT(Extended Page-Table 의 메커니즘에 대해 설명합니다.

VPID 는 선형 주소 변환을 관리하기 위한 메커니즘이며, EPT 는 선형 주소 변환을 확장시키는 주소 변환 계층을 정의합니다.(augment 의 의미를 확장으로 해석하였습니다.)

해당 내용에 명확한 이해를 위해서는 Intel SDM Vol.3A Chapter 4 Paging 을 어느정도 숙지해야 합니다. 이는 별도의 내용으로 정리 예정입니다.

[0x01] Virtual Processor Identifiers(VPIDs)

VMX Operation 을 위한 기존의 아키텍처에서는 TLBPaging-Structure Cache 를 플러시하기 위해 VMX Transition 이 필요했습니다.

이를 통해 이전의 선형 주소 공간에 대해 캐시된 변환이 전환 후 사용되지 않도록 보장했습니다.

VPID(Virtual Processor Identifier) 는 논리 프로세서가 여러 선형 주소 공간에 대한 정보를 캐시할 수 있는 기능을 VMX Operation 에 제공합니다.

VPID 를 사용하면 VMX Transition은 캐시된 정보를 유지할 수 있고 논리 프로세서가 다른 선형 주소 공간으로 전환될 수 있습니다.

해당 포스트 내 Caching Translation Information 에서 여러 선형 주소 공간에 대해 캐시 된 정보를 관리하는 메커니즘을 자세히 설명합니다.

논리 프로세서는 16 bit VPID 로 캐시된 일부 정보에 태그를 지정할 수 있습니다.

  • 현재 VPID 는 아래의 상황에서 0000h 입니다.
    • VMX Operation 이 아닌 경우
    • VMX root operation 에 있는 경우
    • Second_enable VPID 제어가 0일 때 VMX non-root operation 에 있는 경우
  • 논리 프로세서가 VMX non-root operation 에 있고 Second_enable VPID 제어가 1인 경우 현재 VPIDVMCSVM-execution control fieldVPID 의 값입니다.(VM Entry 는 이 값이 0000h 가 아님을 보장합니다.)

VPIDPCID(Process-Context Identifier) 와 동시에 사용할 수 있습니다. 동시에 사용하게 되면 프로세서는 캐시된 정보를 현재 VPIDPCID 를 연결합니다. 이러한 정보는 현재 VPID, PCID 가 모두 캐시된 정보와 관련된 정보와 일치하는 경우에만 사용됩니다.

[0x02] Hypervisor-Managed Linear-Address Translation(HLAT)

HLAT(Hypervisor-Managed Linear-Address Translation)VMX non-root operation 에서 선형 주소가 변환되는 방식을 변경하는 기능입니다.

일반적인 Paging 대신 HLAT Paging 이라는 변경된 프로세스를 사용합니다.

HLAT PagingTertiary_enable HLAT 제어가 1로 설정된 경우에만 사용됩니다. HLAT Paging4-Level, 5-Level Paging 에서만 사용됩니다.

HLAT Paging 은 일반적인 Paging 을 변경한 것 이기 때문에 4-Level, 5-Level Paging 의 동작을 설명의 경우 별도의 페이징 관련 챕터를 통해 확인할 수 있습니다.

[0x03] The Extended Page Table Mechanism(EPT)

EPT(Extended Page-Table Mechanism) 은 물리 메모리의 가상화를 지원하는 데 사용할 수 있는 기능입니다.

EPT 가 사용 중일 때 일반적으로 물리 주소로 처리되고 메모리에 액세스하는 데 사용되는 특정 주소는 게스트의 물리 주소로 처리됩니다.

게스트 물리 주소는 메모리에 액세스하는 데 사용되는 물리 주소를 생성하기 위해 EPT Paging-Structure 집합을 통해 변환됩니다.

[-] EPT Overview

EPTSecond_enable EPT 제어가 1일 때 사용됩니다. VMX non-root operation 에서 사용되고 이벤트 주입(Event Injection)을 위해 VM Entry 에서 사용되는 게스트 물리 주소를 변환합니다.

게스트 물리 주소에서 물리 주소로의 변환은 EPT Paging-Structure(EPT 페이징 구조) 에 의해 결정됩니다. EPT Paging-Structure는 프로세서가 IA-32e mode 에 있는 동안 선형 주소를 변환하는 데 사용되는 구조와 유사합니다.

계속해서 언급 될 EPT Paging-Structure 아래와 같은 구조입니다.

CR0.PG = 1 이면 선형 주소는 CR3 를 통해 참조되는 페이징 구조를 통해 변환됩니다. Second_enable EPT 제어가 1로 설정되어 있는 동안 이러한 페이징 구조를 Guest Paging-Structure(게스트 페이징 구조)라고 합니다.

CR0.PG = 0 이면 게스트 페이징 구조가 없습니다.

Second_enable EPT 제어가 1일 때 게스트 물리 주소의 식별(ID)은 CR0.PG 의 값에 따라 달라집니다.

  • CR0.PG = 0 인 경우 선형 주소는 게스트 물리 주소로 처리됩니다.
  • CR0.PG = 1 인 경우 게스트 물리 주소는 CR3 와 게스트 페이징 구조의 내용에서 파생된 주소입니다.

CR0.PG = 1 인 경우에 선형 주소를 물리 주소로 변환하려면 EPT 를 사용하여 게스트 물리 주소를 여러 번 변환해야 합니다.

예를 들어 CR4.PAE, PSE = 0 인 경우를 가정해보겠습니다. 32 bit의 선형 주소 변환은 아래와 같이 동작합니다.

  • 선형 주소의 bits 31:22 는 CR3 의 게스트 물리 주소에 위치한 게스트 PDE(Page-Directory Entry) 를 선택합니다. 게스트 PDE 의 게스트 물리 주소는 EPT 를 통해 변환되어 게스트 PDE 의 물리 주소를 결정합니다.
  • 선형 주소의 bits 21:12 는 게스트 PDE 의 게스트 물리 주소에 위치한 게스트 페이지 테이블 내의 엔트리(PTE)를 선택합니다. 게스트 PTE의 게스트 물리 주소는 EPT 를 통해 변환되어 게스트 PTE 의 물리 주소를 결정합니다.
  • 선형 주소의 bits 11:0 은 게스트 PTE 의 게스트 물리 주소에 위치한 페이지 프레임 내의 오프셋입니다. 이 오프셋에 의해 결정된 게스트 물리 주소는 EPT 를 통해 변환되어 원래 선형 주소가 변환되는 물리 주소를 결정합니다.

추가적으로 EPT 는 게스트 물리 주소를 물리 주소로 변환하는 것 외에도 주소에 액세스 할 때 VMM 이 허용하는 권한을 지정합니다. 허용되지 않는 액세스 시도를 EPT Violation 이라고 하며 VM Exit 의 원인이 됩니다.

해당 내용은 매우 중요하며 본인이 구현할 내용에서 주된 기능이 됩니다. 이를 이용하여 특정 주소에 액세스할 때 VM Exit 를 발생시켜 내가 원하는 동작을 하도록 할 수 있습니다.

프로세서는 게스트 물리 주소가 메모리에 액세스하는 데 사용될 때만 EPT 를 사용하여 게스트 물리 주소를 물리 주소로 변환합니다.

이 내용은 다음을 의미합니다.

  • MOV to CR3 명령은 게스트 물리 주소를 CR3 에 로드합니다. 해당 주소가 EPT 를 통해 변환되는지 여부는 PAE Paging 사용 여부에 따라 달라집니다.
    • PAE Paging 을 사용하지 않는 경우, 해당 명령은 메모리에 액세스할 때 해당 주소를 사용하지 않으며 EPT 를 통해 변환되지 않습니다.(CR0.PG = 1 인 경우 주소는 선형 주소를 사용하여 메모리에 액세스한 다음 EPT 를 통해 변환됩니다.)
    • PAE Paging 을 사용하는 경우, 해당 주소에서 4개의 PDPTE 를 로드하고 EPT 를 통해 주소를 변환합니다.
  • PDPTE 에는 게스트 물리 주소가 포함되어 있습니다. PDPTE 를 로드하는 명령(위의 내용)은 이러한 게스트 물리 주소를 사용하여 메모리에 액세스하지 않으며 EPT 를 통해 변환되지 않습니다. PDPTE 의 주소는 해당 PDPTE 를 사용하는 선형 주소를 사용하여 액세스한 다음 EPT 를 통해 변환됩니다.

[-] EPT Translation Mechanism

EPT 변환 메커니즘은 각 게스트 물리 주소의 bits 47:0 만 사용합니다. Page-Walk Length 의 값은 4를 사용하게 되는데, 이는 게스트 물리 주소를 변환하기 위해 최대 4개의 EPT Paging-Structure Entry에 액세스한다는 것을 의미합니다.

이러한 48 bits(변환 메커니즘에 사용되는 게스트 물리 주소)는 EPT Paging-Structure를 트레버스하기 위해 논리 프로세서에 의해 분할됩니다.

아래에서 설명되는 EPT Paging-StructurePaging-Structure 는 다른 구조입니다.


어떠한 오브젝트가 크기에 맞춰 정렬되는 경우를 의미합니다. 8 byte 크기의 데이터는 8의 배수인 주소에 정렬되었을 때 자연스럽게 정렬된 주소로 이해할 수 있습니다. (address % size = 0)


  • 4-Kbyte 로 자연스럽게 정렬된(Naturally aligned) EPT PML4 tableExtended-Page-Table Pointer(EPTP) 의 bits 51:12에 지정된 물리 주소에 위치합니다. EPT PML4 Table 은 512개의 64bits 로 이루어진 엔트리(EPT PML4E)로 구성됩니다. EPT PML4E 는 다음과 같이 정의된 물리 주소를 사용하여 선택됩니다.
    • (참고 : 링크)
    • bits 63:52 는 모두 0입니다.
    • bits 51:12 는 EPTP 에서 가져온 값 입니다.
    • bits 11:3 은 게스트 물리 주소의 bits 47:39 입니다.
    • bits 2:0 은 모두 0입니다.

    EPT PML4E 는 게스트 물리 주소의 bits 47:39를 사용하여 식별되므로 게스트 물리 주소 공간의 512-Gbyte 영역에 대한 액세스를 제어합니다. 아래는 EPT PML4E 에 대한 포맷입니다.

  • 4-Kbyte 로 자연스럽게 정렬된 EPTP TableEPT PML4E 의 bits 51:12에 지정된 물리 주소에 위치합니다. EPTP Table 은 512개의 64bits 로 이루어진 엔트리(EPT PDPTE)로 구성됩니다. EPT PDPTE 는 다음과 같이 정의된 물리 주소를 사용하여 선택됩니다.
    • bits 63:52 는 모두 0입니다.
    • bits 51:12 는 EPT PML4E 에서 가져온 값 입니다.
    • bits 11:3은 게스트 물리 주소의 bits 38:30 입니다.
    • bits 2:0 은 모두 0입니다.

EPT PDPTE 는 게스트 물리 주소의 bits 47:30 을 사용하여 식별되므로 게스트 물리 주소 공간의 1-GByte 영역에 대한 액세스를 제어합니다. EPT PDPTE 의 사용은 해당 엔트리에서 bit 7의 값에 의존합니다.

  • EPT PDPTE 의 bit 7이 1인 경우, EPT PDPTE1-GByte Page 를 매핑합니다. 최종적으로 물리 주소는 아래와 같이 계산됩니다.
    • bits 63:52 는 모두 0입니다.
    • bits 51:30 은 EPT PDPTE 에서 가져온 값 입니다.
    • bits 29:0 은 원래 게스트 물리 주소에서 가져온 값입니다.

    1-Gbyte 페이지를 매핑하는 EPT PDPTE 의 포맷은 아래와 같습니다.

  • EPT PDPTE 의 bit 7이 0인 경우, 4-Kbyte 로 자연스럽게 정렬된 EPT Page-DirectoryEPT PDPTE 의 bits 51:12 에 지정된 물리 주소에 위치합니다. EPT Page-Directory 를 참조하는 EPT PDPTE 의 포맷은 아래와 같습니다.

    EPT Page-Directory 는 512개의 64bits 로 이루어진 엔트리(PDE)로 구성됩니다. EPT PDE 는 다음과 같이 정의된 물리 주소를 사용하여 선택됩니다.

    • bits 63:52 는 모두 0입니다.
    • bits 51:12 는 EPT PDPTE 에서 가져온 값 입니다.
    • bits 11:3 은 게스트 물리 주소의 bits 29:21 입니다.
    • bits 2:0 은 모두 0입니다.

EPT PDE 는 게스트 물리 주소의 bits 47:21 을 사용하여 식별되기 때문에 게스트 물리 주소 공간의 2-Mbyte 영역에 대한 액세스를 제어합니다. EPT PDE 의 사용은 해당 엔트리에서 bit 7에 의존합니다.

  • EPT PDE 의 bit 7이 1이면 EPT PDE 는 2-Mbyte 페이지를 매핑합니다. 최정적으로 물리 주소는 다음과 같이 계산됩니다.
    • bits 63:52 는 모두 0입니다.
    • bits 51:21 은 EPT PDE 에서 가져온 값 입니다.
    • bits 20:0은 원래 게스트 물리 주소의 비트 입니다.

    2-Mbyte 페이지를 매핑하는 EPT PDE 의 형식은 아래와 같습니다.

  • EPT PDE 의 bit 7이 0인 경우, 4-Kbyte 로 자연스럽게 정렬된 EPT Page TableEPT PDE 의 bits 51:12 에 지정된 물리 주소에 위치합니다. EPT Page Table 을 참조하는 EPT PDE 의 형식은 아래와 같습니다.

    EPT Page Table 은 512개의 64bits로 이루어진 엔트리(PTE)로 구성됩니다. EPT PTE 는 아래와 같이 정의된 물리 주소를 사용하여 선택됩니다.

    • bits 63:52 는 모두 0입니다.
    • bits 51:12 는 EPT PDE 에서 가져온 값 입니다.
    • bits 11:3 은 게스트 물리 주소의 bits 20:12 입니다.
    • bits 2:0 은 모두 0입니다.
  • EPT PTE 는 게스트 물리 주소의 bits 47:12 를 사용하여 식별되므로 모든 EPT PTE 는 4-Kbyte 페이지로 매핑됩니다. 최종적으로 물리 주소는 다음과 같이 계산됩니다.
    • bits 63:52 는 모두 0입니다.
    • bits 51:12 는 EPT PTE 에서 가져온 값 입니다.
    • bits 11:0 은 원래 게스트 물리 주소의 비트입니다.

    EPT PTE 의 형식은 아래와 같습니다.

EPT Paging-Structure Entry 는 bits 2:0 중 하나가 1인 경우 존재(Present)합니다. 그렇지 않으면 해당 엔트리는 존재하지 않습니다(Not Present). 프로세서는 bits 62:3 을 무시하고 엔트리를 사용하여 다른 EPT Paging-Structure Entry 를 참조하거나 물리 주소를 생성하지 않습니다. EPT Paging-Structure 가 존재하지 않는 변환이 발생하는 게스트 물리 주소를 사용하는 참조는 EPT Violation 을 발생시킵니다.

위의 설명에서는 EPT Paging-Structure 가 서로를 참조하는 방법과 게스트 물리 주소를 변환할 때 논리 프로세서가 이러한 구조를 트레버스 하는 방법에 대해 설명했습니다.

변환 과정의 모든 세부 사항을 다루진 않았습니다. 추가 세부 정보는 아래와 같이 제공됩니다.

  • 변환 프로세스가 VM Exit 로 이루어질 수 있는 상황
  • EPT 변환 메커니즘과 메모리 타이핑 간의 상호 작용

[-] EPT-Induced VM Exits

게스트 물리 주소를 사용하여 액세스하면 EPT Misconfiguration, EPT Violation, Page-Modification Log-Full Event 로 인해 VM Exit 가 발생할 수 있습니다.

  • EPT Misconfiguration 은 게스트 물리 주소를 변환하는 과정에서 논리 프로세서가 지원되지 않는 값을 포함하는 EPT Paging-Structure Entry 를 발견하게 됐을 때 발생합니다.
  • EPT ViolationEPT 의 잘못된 구성은 없지만 EPT Paging-Structure Entry가 게스트 물리 주소를 사용한 액세스를 허용하지 않을 때 발생합니다.
  • Page-Modification Log-Full Event 는 논리 프로세서가 Page-Modification Log Entry 를 생성해야 함을 판단했으나 현재 로그가 가득 찼을 때 발생합니다.

위와 같은 이벤트는 게스트 물리 주소를 사용하여 메모리에 액세스하려는 시도로 인해 발생합니다. MOV to CR3 명령을 사용하여 게스트 물리 주소를 CR3 에 로드하면 해당 주소가 페이징 구조에 액세스하는 데 사용될 때 까지 EPT Violation 이나 EPT Misconfiguration 이 발생하지 않을 수 있습니다.

Second_EPT-violation #VE 제어가 1인 경우 특정 EPT Violation 으로 인해 VM Exit 대신 가상화된 예외가 발생할 수 있습니다.

[+] EPT Misconfigurations

게스트 물리 주소의 변환에서 다음 조건 중 하나를 충족하는 EPT Paging-Structure Entry 가 발생하면 EPT 의 구성이 잘못된 것 입니다.

  • 엔트리의 bit 0이 지워진 경우와 다음 중 하나로 유지됩니다.
    • bit 1 이 설정된 경우(데이터 쓰기가 허용됨을 나타냄)
    • 프로세서는 실행 execute-only 변환을 지원하지 않으며 다음 중 하나가 유지됩니다.(VMMIA32_VMX_EPT_VPID_CAP 을 읽고 execute-only 변환이 지원되는지에 대한 여부를 확인해야 합니다.)
      • bit 2 가 설정된 경우(명령어 페칭이 허용됨을 나타냄, 실행의 허용)
      • Second_mode-based execute control for EPT 제어가 1이고 bit 10이 1로 설정된 경우(유저모드 선형 주소에서의 실행이 허용됨을 나타냄)
    • Tertiary_EPT paging-write control 제어가 1이고 엔트리는 페이지를 매핑하며 bit 58이 1로 설정된 경우(페이징 쓰기가 허용됨을 나타냄)
  • 엔트리가 존재하고 다음 중 하나로 유지됩니다.
    • 예약된 비트가 1로 설정되었습니다. 여기에는 논리 프로세서의 물리 주소 너비를 벗어나는 bits 51:12 범위의 비트 설정이 포함됩니다.
    • 해당 엔트리는 게스트 물리 주소(bit 7이 1으로 설정된 EPT PDE 또는 EPT PTE)를 변환하는 데 사용되는 마지막 엔트리이며 bits 5:3(EPT memory type)의 값이 예약된 값 2, 3, 7 중 하나로 설정되었습니다.

[+] EPT Violation

EPT Violation 은 변환에서 EPT Misconfiguration 이 발생하지 않은 게스트 물리 주소를 사용하여 액세스하는 동안 발생할 수 있습니다.

아래의 설명에서 실행 방지의 경우, 명령어를 가져오지 못하는 경우를 의미합니다. 즉 명령어 페칭이 불가하기 때문에 실행이 불가하다는 의미로 이해하였습니다.

EPT Violation 은 아래의 경우에 발생합니다.

  • 게스트 물리 주소의 변환에서 존재하지 않는 EPT Paging-Structure Entry 를 발견한 경우.
  • EPT Paging-Structure Entry 에서 bit 0(read access) 이 0으로 설정되어 있을 때 Read 행위의 액세스가 발생한 경우.
  • EPT Paging-Structure Entry 에서 bit 1(write access) 이 0으로 설정되었 있을 때 Write 행위의 액세스가 발생한 경우. 액세스 및 Dirty Flag 를 업데이트하기 위한 쓰기 역시 데이터 쓰기로 간주됩니다.

    EPTP 의 bit 6(EPT 에 대한 액세스 및 dirty flags 활성화 여부)이 1인 경우 게스트 페이징 엔트리에 대한 프로세서 액세스는 EPT Violation 과 관련된 데이터 쓰기로 처리됩니다. 따라서 게스트 Paging-Structure Entry의 게스트 물리 주소를 변환하는 데 사용되는 EPT Paging-Structure Entry 중 하나에서 bit 1 이 0으로 설정되면 해당 엔트리를 통해 선형 주소를 변환할 때 EPT Violation 이 발생합니다.

    액세스 및 dirty flag 를 업데이트하기 위해 게스트 페이징 구조에 대한 프로세서 쓰기를 paging write 라고 합니다.

    Tertiary_EPT paging-write control 제어가 1인 경우 페이지를 매핑하는 EPT Paging-Structure Entry 에서 write access 비트를 지우더라도 해당 항목의 bit 58(paging-write access)가 1이면 paging write 를 방지하지 않습니다.

    Second_sub-page write permission for EPT 제어가 1이면 EPT Violation 을 유발할 수 있는 위와 같은 내용들의 경우에도 발생하지 않습니다. 게스트 물리 주소가 4-Kbyte 페이지를 사용하여 매핑되고 페이지 매핑에 사용되는 EPT PTE 의 bit 61(sub-page write permissions)이 1인 경우, 특정 128-byte sub-page 에 쓰기가 허용될 수 있습니다.

  • EPT Paging-Structure Entry 에서 실행에 대한 액세스를 방지합니다. 이는 Second_mode-based execute control for EPT 제어의 설정에 따라 다릅니다.
    • 해당 제어가 0이고, EPT Paging-Structure Entry 에서 bit 2(execute access)가 0일 때 Execute 행위의 실행이 발생한 경우 EPT Violation 이 발생합니다.
    • 해당 제어가 1인 경우 다음 중 아래의 경우 실행이 방지됩니다.
      • Paging 은 대상 바이트의 선형 주소를 Supervisor-mode address 로 매핑하고 EPT Paging-Structure Entry 의 bit 2(execute access for supervisor-mode linear addresses)가 0인 경우

        선형 주소 변환을 제어하는 Paging-Structure Entry 중 하나에서 bit 2(U/S flag)가 0이면 페이징은 선형 주소를 Supervisor-mode address 로 매핑합니다.

      • Paging 은 대상 바이트의 선형 주소를 User-mode address 로 매핑하고 EPT Paging-Structure Entry 의 bit 10(execute access for user-mode linear addresses) 가 0인 경우

        선형 주소 변환을 제어하는 Paging-Structure Entry 에서 bit 2(U/S flag)가 1이면 페이징은 User-mode address 로 매핑합니다. 페이징이 비활성화되면(CR0.PG = 0) 모든 선형 주소는 User-mode address 입니다.

  • EPTP 의 bit 7(enable supervisor shadow-stack control)이 1로 설정된 경우, 액세스는 Supervisor Shadow-Stack Access 입니다. 아래 내용에 해당하는 경우 EPT Paging-Structue Entry 에서 해당 액세스가 허용되지 않습니다.
    • bit 0(read access)가 0인 경우
    • bit 1(write access)이 0인 경우
    • bit 60(supervisor-shadow stack access)가 0인 경우

    EPT Paging-Structure Entry 의 bit 60(supervisor-shadow stack access)와 EPTP 의 bit 7(enable supervisor shadow-stack control)은 다른 액세스에는 영향을 주지 않습니다.

  • Tertiary_guest-paging verification, Tertiary_EPT paging-write control 제어가 모두 1인 경우, 선형 주소 변환과 관련된 특정 액세스에 대해 게스트 페이징에 대한 검증이 수행됩니다.

    특히, 게스트 페이징 검증은 선형 주소에 대한 페이지를 매핑하는 게스트 Paging-Structure Entry 에 게스트 물리 주소를 사용하는 특정 액세스에 적용될 수 있습니다. 해당 게스트 물리 주소에 대한 페이지를 매핑하는 EPT Paging-Structure Entry 의 bit 57(verify guest paging)이 1으로 설정된 경우 적용됩니다.

    게스트 페이징 검증이 발생할 때 원래 선형 주소를 변환하는 중 사용된 게스트 Paging-Structure EntryEPT Paging-Structure Entry 내 bit 58(paging-write access)가 0으로 설정된 경우 EPT Violation 이 발생합니다.

[+] Prioritization of EPT Misconfiguration and EPT Violations

선형 주소를 물리 주소로 변환하려면 EPT 를 사용하여 게스트 물리 주소를 하나 이상 변환해야 합니다.

이 섹션에서는 선형 주소를 사용하여 메모리에 액세스할 때 발생할 수 있는 여러가지 이벤트에 대해 EPT 로 인한 VM Exit 가 발생하는 것의 상대적 우선 순위가 지정되는 내용에 대해 설명합니다.

게스트 물리 주소에 액세스하는 경우, EPT Misconfiguration 또는 EPT Violation 이 발생하는지 여부는 아래와 같은 반복 프로세스(Iterative Process)를 기반으로 결정됩니다.

  1. EPT Paging-Structure Entry 를 읽습니다.(최초 EPT PML4E)
    1. 엔트리가 존재하지 않으면 EPT Violation 이 발생합니다.
    2. 엔트리가 존재하지만 내용이 제대로 구성되지 않은 경우 EPT Misconfiguration 이 발생합니다.
    3. 엔트리가 존재하고 적절하게 구성된 경우, 엔트리는 다른 EPT Paging Structure 를 참조하는지에 대한 여부(bit 7이 1로 설정된 EPT PDE 인지 또는 EPT PTE 인지)에 따라 달라집니다.
      1. 엔트리가 다른 EPT Paging Structure 를 참조하는 경우 해당 구조의 엔트리에 액세스합니다. 해당 엔트리에 대해 1단계가 실행됩니다.
      2. 아닌 경우 최종 물리 주소(기존의 게스트 물리 주소 변환)를 생성하는 데 사용됩니다. 2단계가 실행됩니다.
  2. 최종 물리 주소가 결정되면 EPT Paging-Structure Entry 에 의해 결정된 권한이 평가됩니다.
    1. 게스트 물리 주소에 대한 액세스가 허용되지 않은 경우 EPT Violation 이 발생합니다.
    2. 게스트 물리 주소에 대한 액세스가 허용되는 경우 최종 물리 주소를 이용하여 메모리에 액세스합니다.

CR0.PG = 1 인 경우, 선형 주소 변환도 반복 프로세스입니다. 각 게스트의 물리 주소는 자체적으로 EPT 를 사용하여 변환되며 EPT 로 인해 VM Exit 가 발생할 수 있습니다.(EPT-induced VM Exit)

다음 내용에서는 이러한 반복 프로세스 중에 Page-FaultEPT-induced VM Exit 를 인식하는 방법에 대해 자세히 설명합니다.

  1. 게스트 물리 주소(최초 CR3 의 주소)를 이용하여 게스트 Paging-Structure Entry 에 액세스하려고 시도합니다.
    1. EPT Misconfiguration 또는 EPT Violation 이 발생하여 액세스가 실패하면 EPT-induced VM Exit 가 발생합니다.
    2. 액세스로 인해 EPT-induced VM Exit 가 발생하지 않으면 변환이 계속됩니다. 게스트 페이징 검증(guest-paging verification)이 활성화된 경우 프로세서는 EPT Paging-Structure Entry 이 게스트 물리 주소에 대한 페이지를 매핑하는데 bit 58(paging write)가 설정되었는지에 대한 여부를 기록합니다. 그런 다음 게스트 Paging-Structure Entry 의 bit 0(the present flag)을 참조합니다.
      1. bit 0(the present flag)가 0이거나 예약된 비트가 설정된 경우 Page Fault 가 발생합니다.
      2. bit 0이 1이면 예약된 비트가 설정되지 않고 엔트리가 다른 게스트 Paging-Structure를 참조하는지 여부(PS = 1 인 게스트 PDE 또는 게스트 PTE)에 따라 달라집니다.
        • 엔트리가 다른 게스트 Paging-Structure 를 참조하는 경우 해당 구조의 엔트리에 액세스합니다. 해당 엔트리에 대해 1단계가 실행됩니다.
        • 그렇지 않으면 엔트리는 최종 게스트 물리 주소(기존 선형 주소의 변환)을 생성하는 데 사용합니다. 2단계가 실행됩니다.
  2. 최종 게스트 물리 주소가 결정되면 게스트 Paging-Structure Entry 에 의해 결정된 권한이 평가됩니다.
    1. 해당 권한으로 인해 선형 주소에 대해 액세스가 허용되지 않는 경우 Page Fault 가 발생합니다.
    2. 선형 주소에 대해 액세스가 허용되면 최종 게스트 물리 주소에서 메모리에 액세스를 시도합니다.
      1. EPT Misconfiguration 또는 EPT Violation 으로 인해 액세스가 실패하면 EPT-induced VM Exit 가 발생합니다. 이 시점에 위의 1.b에 작성된 paging-wrtie 비트를 이용하여 게스트 페이징 검증이 발생합니다.
      2. 오류가 발생하지 않으면 최종 물리 주소(EPT 를 사용하여 최종 게스트 물리 주소로 변환 된)를 사용하여 메모리에 액세스합니다.

CR0.PG = 0 인 경우 선형 주소는 게스트 물리 주소로 처리되고 EPT를 사용하여 변환됩니다. 이 프로세스가 EPT Violation 이나 EPT Misconfiguration 이 발생하지 않으면 물리 주소를 생성하고 EPT Paging-Structure Entry 가 허용하는 권한을 결정합니다.

이러한 권한이 물리 주소에 대한 액세스를 허용하지 않으면 EPT Violation 이 발생하고, 그렇지 않으면 물리 주소를 이용하여 메모리에 액세스하게 됩니다.

[-] Sub-Page Write Permissions

위에서 EPTEPT Violation 을 이용하여 게스트 물리 주소에 대한 액세스 권한을 적용하는 방법에 대해 설명했습니다.

이러한 액세스 권한은 게스트 물리 주소를 변환하는 데 사용되는 EPT Paging-Structure Entry 를 이용하여 결정되기 때문에 세부 수준은 페이지를 매핑하는 데 사용되는 것으로 제한됩니다.(1-GByte, 2-MByte, 4-KByte)

Sub-Page Write Permission 기능을 사용하면 게스트 물리 주소에 대한 Write 액세스를 좀 더 세밀하게 제어할 수 있습니다. 또한 자연스럽게 정렬된 128 바이트 단위의 Sub-PageWrite 액세스를 제어할 수 있습니다.

특히 이 기능을 사용하면 Write 가 불가능한 4-KByte의 Selected Sub-Page 에 쓰기가 가능합니다.

Second_sub-page write permissions for EPT 제어가 1인 경우 Sub-Page Write Permission 이 활성화됩니다.

[+] Write Accesses That Are Eligible for Sub-Page Write Permissions

게스트 물리 주소는 EPT Paging-Structure Entry 내 bit 1(write access)이 0으로 설정되어 write 액세스가 허용되지 않는 경우 sub-page write permission 에 적합(Eligible)합니다.

위의 내용과 다른 이유로 허용되지 않는 경우(ex. 변환 중 존재하지 않는 EPT Paging-Structure Entry 를 발견), sub-page write permission 에 부적합 합니다.

또한 게스트 물리 주소는 4-Kbyte 페이지를 사용하여 매핑되고 페이지 매핑에 사용되는 EPT PTE 의 bit 61(sub-page write permissions)이 1인 경우에만 사용할 수 있습니다.(더 큰 페이지에 매핑된 게스트 물리 주소는 적합하지 않습니다.)

일부 메모리 액세스의 경우 프로세서는 EPT PTE 의 bit 61의 설정 여부와 관계없이 sub-page write permission 을 적용하지 않습니다. 이러한 경우는 아래와 같습니다.

  • 트랜잭션 영역 내에서 수행되는 write 액세스
  • EnclaveELRANGE 내의 주소에 대한 write 액세스
  • Intel SGX 명령어에 의한 EPC(Enclave Page Cache) 에 대한 write 액세스
  • accessed flag 또는 dirty flag 를 업데이트하는 게스트 Paging-Structure Entry 에 대한 write 액세스
  • 액세스 시 게스트 Paging-Structure Entry 에 대한 프로세서 액세스 및 EPT 에 대한 dirty flag 가 활성화 된 경우
  • 두 개의 4-KByte 페이지를 가로지르는 write 액세스, 이 경우 둘 다 적용되지 않거나 하나의 페이지에만 적용될 수 있습니다.(가로지른다는 표현은 연속되는 페이지를 의미하는 것인지 동시성을 의미하는지 의문입니다.)
  • 다중 write 액세스를 수행하는 명령에 의한 쓰기(sub-page write permission 은 주로 AND, MOV, OR, TEST, XCHG, XOR 와 같은 기본 명령을 위한 것 입니다.)

게스트 물리 주소가 Sub-Page Write Permission 에 적합한 경우 아래에서 설명하게 될 프로세스를 통해 주소에 대한 write 를 허용할지 여부를 결정합니다.

[+] Determining and Access’s Sub-Page Write Permission

Sub-Page Write Permission 은 4-KByte 의 128-Byte Sub-Page(이하 “하위 페이지”) 32개에 대해 각각 write 액세스를 개별적으로 제어합니다. 게스트 물리 주소의 bits 11:7 은 하위 페이지를 식별합니다.

sub-page write permission 에 적합한 각 게스트 물리 주소에는 64bit의 Sub-Page Permission Vector(SPP Vector)가 있습니다. 4-KByte 페이지의 모든 주소는 동일한 SPP Vector 를 사용합니다.

주소의 하위 페이지 번호(bits 11:7)가 S인 경우, Sub-Page Write Permission 의 비트 2S가 1로 설정된 경우에만 쓰기가 허용됩니다.(SPP 에서 홀수 위치에 있는 비트는 사용되지 않으며 0이어야 합니다.)

각 페이지의 SPP Vector 는 메모리에 위치합니다. Sub-Page Write Permission 에 적합한 게스트 물리 주소에 대해 write 액세스인 경우 프로세서는 다음 프로세스를 통해 주소의 SPP Vector 를 찾습니다.

  • VM-execution control fieldSPPTP(Sub-Page-Permission-Table-Pointer)는 4-KByte 의 SPP Table(SPPL4 table) 의 물리 주소를 포함합니다. 게스트 물리 주소의 bits 47:39는 SPPL4E 라고 하는 해당 테이블의 64bit 크기의 엔트리를 식별합니다.
  • 4-KByte SPPL3 table은 선택한 SPPL4E의 물리 주소에 위치합니다. 게스트 물리 주소의 bits 38:30 은 SPPL3E 라고 하는 해당 테이블의 64bit 크기의 엔트리를 식별합니다.
  • 4-KByte SPPL2 table 은 선택한 SPPL3E 의 물리 주소에 위치합니다. 게스트 물리 주소의 bits 29:21은 SPPL2E 라고 하는 해당 테이블의 64bit 크기의 엔트리를 식별합니다.
  • 4-KByte SPP-vector table, SPPL1 table은 선택한 SPPL2E 의 물리 주소에 위치합니다. 게스트 물리 주소의 bits 20:12는 64 bit 크기의 SPP Vector 를 식별합니다. 벡터의 bit 2S는 주소가 기록될 수 있는지 여부를 결정합니다.

단일 4-KByte 페이지의 여러 128-Byte 하위 페이지에 대한 write 액세스는 각 하위 페이지의 SPP Vector 가 표시된 비트가 1로 설정된 경우에만 허용됩니다.

다음 내용은 2개의 4-KByte 페이지에 쓰는 경우에 적용됩니다.

  • 두 페이지 모두 write 가 허용되지 않을 경우, 해당 페이지의 게스트 물리 주소가 Sub-Page Write Permission 에 적합하더라도 액세스가 허용되지 않을 수 있습니다.

각 엔트리(SPPL4E, SPPL3E, SPPL2E)의 bit 0 은 Valid 를 의미합니다. 위의 프로세스에서 bit 0인 엔트리에 액세스하면 중지되고 논리 프로세서에서 SPP Miss 가 발생합니다.

각 엔트리(SPPL4E, SPPL3E, SPPL2E)의 bits 11:1, bits 63:N 은 예약된 비트입니다. 위의 프로세스에서 bit 0(Valid)가 1이고 일부 예약 비트가 설정된 엔트리에 액세스하면 프로세스가 중지되고 논리 프로세서에서 SPP Misconfiguration 이 발생합니다.

이렇게 발생한 SPP Miss, SPP MisconfigurationSPP-related events 라고 부르며, VM Exit 가 발생합니다.

[-] Accessed and Dirty Flags for EPT

Intel 64 아키텍처는 일반적인 Paging-Structure Entry 에서 Accessed, Dirty flag 를 지원합니다. 일부 프로세서는 EPT Paging-Structure Entry 에서 동일한 플래그가 지원됩니다. VMM 은 프로세서가 이 기능을 지원하는지에 대한 여부를 결정하기 위해 MSR IA32_VMX_EPT_VPID_CAP 을 읽어 참조해야 합니다.

VMMVM-exeucution control fieldEPTP(Extended-Page-Table-Pointer)의 bit 6을 이용하여 EPT 에 대한 accessed, dirty flag 를 활성화할 수 있습니다. 이 비트가 1이면 프로세서는 아래 설명된대로 EPT 에 대한 accessed and dirty flag 를 설정합니다.

또한 이 플래그를 설정하면 게스트 Paging-Structure Entry 에 대한 프로세서 액세스가 write 로 처리됩니다.

게스트 물리 주소 변환 중에 사용되는 모든 EPT Paging-Structure Entry 의 경우 bit 8이 Accessed Flag 입니다. 페이지를 매핑하는 EPT Paging-Structure Entry 의 경우(구조를 참조하는 것 외에) bit 9는 Dirty Flag 입니다.

프로세서는 게스트 물리 주소 변환의 일부로 EPT Paging-Structure Entry 를 사용할 때 마다 해당 엔트리에 accessed flag 를 설정합니다.(설정되지 않은 경우)

게스트 물리 주소에 write 가 발생할 때 마다 프로세서는 게스트 물리 주소에 대한 최종 물리 주소(EPT PTE 또는 bit 7이 1인 EPT Paging-Structure Entry)를 식별하는 EPT Paging-Structure EntryDirty Flag 를 설정합니다.(설정되지 않은 경우)

EPT 에 대한 Accessed, Dirty Flag 가 활성화된 경우 게스트 Paging-Structure Entry 에 대한 프로세서 액세스가 쓰기로 처리됩니다. 따라서 이러한 액세스는 프로세서가 게스트 Paging-Structure Entry 의 최종 물리 주소를 식별하는 EPT Paging-Structure EntryDirty Flag 를 설정하게 합니다.

이러한 플래그는 고정(”Sticky”)되어 있으며, 이는 일단 설정되면 프로세서가 플래그를 지우지 않음을 의미합니다. VMM 만이 이를 지울 수 있습니다.

프로세서는 EPT Paging-Structure Entry의 정보를 TLBPaging-Structure Cache에 캐시할 수 있습니다. 이 의미는 VMMAccessed 또는 Dirty flag를 1에서 0으로 변경할 경우 프로세서가 영향을 받는 게스트 물리 주소를 사용하여 후속 액세스에서 메모리에 해당 비트를 설정하지 않을 수 있음을 의미합니다.

[-] Page-Modification Logging

참고 : 링크

EPT 에 대한 Accessed, Dirty Flag 가 활성화되면 VMMPage-Modification Logging, PML 이라는 기능을 이용하여 게스트 물리 주소에 대한 Write 를 추적할 수 있습니다.

VMMVM-execution controlenable PML 제어를 1으로 설정함으로써 page-modification logging 을 활성화할 수 있습니다. 활성화되면 프로세서는 아래에 설명된 대로 page-modificaiton log 에 엔트리를 추가합니다.

page-modification logVM-execution control fieldPML address 의 물리 주소에 위치한 4-KByte 메모리 영역입니다.

Page-Modificaiton Log 는 64bit 로 이루어진 엔트리 512개로 구성되어 있습니다. VM-execution control fieldPML index 는 사용할 다음 엔트리를 나타냅니다.

게스트 물리 액세스를 허용하기 전에 프로세서는 EPT에 대한 accessed, dirty flag 를 설정해야 하는지 결정할 수 있습니다. 이 경우 프로세서는 PML Index 를 검사합니다.

PML Index 가 0-511 범위에 있지 않으면 Page-Modification Log-Full Event 가 발생하고 VM Exit 가 발생합니다.

범위 안에 있는 경우 프로세서는 EPT 에 대한 accessed, dirty flag 를 업데이트 합니다. 프로세서가 EPT 에 대해 dirty flag 를 업데이트 한 경우(0→1) 다음과 같이 동작합니다.

  • 액세스 게스트 물리 주소는 page-modification log 에 기록됩니다. 구체적으로 게스트 물리 주소는 PML AddressPML Index 의 8배를 추가하여 결정된 물리 주소에 기록됩니다. 기록된 값의 bits 11:0은 항상 0 입니다.
  • PML Index 는 1씩 감소합니다. 이로 인해 값이 0에서 FFFFh 로 전환될 수 있습니다.

만일 감소하다 FFFFh가 되는 경우 프로세서는 PML Index 값이 0-511 범위에 있지 않다고 판단하여 Page-Modification Log-Full Event 를 생성하며 이 시점에서 더 이상의 로깅은 발생하지 않습니다.

[-] EPT and Memory Typing

논리 프로세서에서 EPT 가 사용되는 동안 메모리 액세스에 대한 메모리 유형 사용을 결정하는 방법을 설명합니다.

[+] Memory Type Used for Accessing EPT Paging Structures

EPT Paging-Structure 에 대한 액세스를 위해 메모리 유형이 어떻게 결정되는지 설명합니다. 결정은 먼저 CR0의 bit 30(cache disable-CD) 값을 기반으로 합니다.

  • CR0.CD = 0 인 경우 이러한 참조에 사용되는 메모리 유형은 VM-execution control fieldEPTP 의 bits 2:0 에 의해 지정됩니다. 값이 0이면 uncacheable type(UC) 이고 6이면 write-back type(WB) 를 나타냅니다.
  • CR0.CD = 1 인 경우 이러한 참조에 사용되는 메모리 유형은 uncacheable type(UC) 입니다.

[+] Memory Type Used for Translated Guest-Physical Addresses

게스트 물리 주소를 이용하는 메모리 액세스의 Effective Memory Type(EPT 를 이용하여 변환된 액세스)은 메모리에 액세스하는 데 사용되는 메모리 유형입니다.(이하 “유효 메모리 유형”)

유효 메모리 유형은 CR0.CD 의 값 또는 게스트 물리 주소를 변환하는 데 사용되는 마지막 EPT Paging-Structure EntryPAT 메모리 유형을 기반으로 합니다.

  • PAT Memory TypeCR0.PG 값에 따라 다릅니다.
    • CR0.PG = 0 이면 PAT Memory TypeWB 입니다.
    • CR0.PG = 1 이면 PAT Memory TypeIA32_PAT MSR 에 의해 선택된 메모리 유형입니다.
  • EPT Memory Type 은 마지막 EPT Paging-Structure Entry 의 bits 5:3 에 지정됩니다.
    • 0 = UC, 1= WC, 4 = WT, 5 = WP, 6 = WB 를 의미하며 다른 값은 예약되어 있으며 설정되는 경우 EPT Misconfiguration 이 발생합니다.
  • CR0.CD = 0 이면 유효 메모리 유형은 마지막 EPT Paging-Structure Entry 의 bit 6에 따라 다릅니다.
    • 값이 0이면 유효 메모리 유형은 MTRR Memory Type 대신 EPT Memory Type 을 이용하여 지정된 EPT Memory TypePAT Memory Type 의 조합입니다.

    • 값이 1이면 유효 메모리 유형은 EPT Memory Type 입니다. PAT Memory Type 은 무시됩니다.

  • CR0.CD = 1 인 경우 유효 메모리 유형은 uncacheable(UC) 입니다.

MTRR 은 게스트 물리 주소에 액세스하는 데 사용되는 메모리 유형에 영향을 주지 않습니다.

[0x04] Caching Translation Information

메모리 구조의 프로세서 데이터를 캐싱하여 주소 변환 프로세스를 가속화할 수 있습니다. 이러한 캐싱은 추후에 설명하게 될 기본적인 페이징에 대한 내용을 다룰 때 상세하게 다룰 예정입니다.

현재 파트에서는 이 캐싱이 VMX 아키텍처와 상호작용하는 방식을 설명합니다.

VMX Operation을 위한 아키텍처의 VPID, EPT 기능은 이 캐싱 아키텍처를 확장합니다. EPT 는 게스트 물리 주소 공간을 정의하고 선형 주소 공간과 물리 주소 공간으로의 변환을 정의합니다.

두 기능 모두 논리 프로세서가 페이징 구조에 캐시된 정보를 만들고 사용할 수 있는 방법을 제어합니다.

[-] Information That May Be Cached

추후에 게시 될 페이징과 관련된 내용 중 Caching Translation Information 은 논리 프로세서에 의해 캐싱될 수 있는 두 종류의 변환 관련 정보를 식별합니다.

Linear Page Number 에서 Physical Page Frame 으로 매핑하는 TranslationLinear Page Number 의 상위 비트를 해당 상위 비트와 일치하는 선형 주소를 변환하는 데 사용되는 Paging-Structure Entry 에 매핑하는 Paging-Structure Cache 입니다.

VPIDEPT 가 사용 중일 때 동일한 종류의 정보가 캐시될 수 있습니다. 논리 프로세서는 기능에 따라 이러한 정보를 캐싱하고 사용할 수 있습니다. 기능이 다른 정보는 아래와 같이 식별됩니다.

  • Linear Mapggins 의 경우 두 종류가 있습니다.
    • Linear Translation, 이들 각각은 액세스 권한 및 메모리 유형에 대한 정보와 함께 Linear Page Number 에서 변환되는 Physical Page Frame 으로의 매핑입니다.
    • Linear Paging-Structure-Cache Entries, 이들 각각은 액세스 권한에 대한 정보와 함께 선형 주소의 해당 영역을 변환하는 데 사용되는 페이징 구조의 물리 주소에 대해 선형 주소의 상위 부분에서 매핑됩니다. 예를 들어 선형 주소의 bits 47:39 는 관련 Page-Directory-Pointer Table 주소에 매핑됩니다.

    선형 매핑에는 EPT Paging-Structure 의 정보가 포함되어 있지 않습니다.

  • Guest-Physical Mapping 의 경우 두 종류가 있습니다.
    • Guest-Physical Translation, 이들 각각은 액세스 권한 및 메모리 유형에 대한 정보와 함께 Guest-Physical Page Number 에서 변환되는 Physical Page Frame 으로의 매핑입니다.
    • Guest-Physical Paging-Structure-Cache Entries, 이들 각각은 액세스 권한에 대한 정보와 함께 Guest-Physical Address 의 해당 영역을 변환하는 데 사용되는 EPT Paging-Structure 의 물리 주소로의 매핑입니다.

    액세스 권한 및 메모리 유형에 대한 게스트 물리 매핑 정보는 EPT Paging-Structure 에서 파생됩니다.

  • Combined Mappings 의 경우 두 가지 종류가 있습니다.
    • Combined Translation, 이들 각각은 액세스 권한 및 메모리 유형에 대한 정보와 함께 Linear Page Number 에서 변환되는 Physical Page Frame 으로의 매핑입니다.
    • Combined Paging-Structure Cache Entries, 이들 각각은 액세스 권한에 대한 정보와 함께 선형 주소의 해당 영역을 변환하는 데 사용되는 페이징 구조의 물리 주소에 대해 선형 주소의 상위 부분에서 매핑됩니다.

    액세스 권한 및 메모리 유형에 대한 결합(combined)된 매핑의 정보는 게스트 페이징 구조와 EPT 페이징 구조 모두에서 파생됩니다.

[-] Creating And Using Cached Translation Information

  • 아래 내용은 EPT 가 사용되지 않는 동안 매핑 생성에 대한 설명입니다.(VMX non-root operation 제외 포함)
    • Linear Mapping 을 생성할 수 있습니다. CR3 의 현재 값에 의해 참조되는(직,간접적으로) 페이징 구조에서 파생되며 현재 VPID 및 현재 PCID 와 연결됩니다.
    • 존재하지 않거나(bit 0 = 0) 예약된 비트를 설정하는 Paging-Structure Entry 에서 파생된 정보는 Linear Mapping 이 생성되지 않습니다. 예를 들어 PTE 가 없으면 변환에서 해당 PTE를 사용하는 모든 Linear Page Number 에 대해 Linear Mapping 이 생성되지 않습니다.
    • EPT 를 사용하지 않는 동안에는 Guest-Physical Mapping, Combined Mapping 이 생성되지 않습니다.
  • 아래 내용은 EPT 를 사용하는 동안 매핑 생성에 대한 설명입니다.
    • Guest-Physical Mapping 을 생성할 수 있습니다. 현재 EPTP 의 bits 51:12 에 의해 참조되는(직,간접적으로) EPT 페이징 구조에서 파생됩니다. 이 40 bits 에는 EPT-PML4-Table 이 포함됩니다.(EP4TA 는 해당 40 비트를 나타냄)

      새로 생성된 Guest-Physical Mapping 은 현재 EP4TA 와 연결됩니다.

    • Combined Mapping 을 생성할 수 있습니다. 현재 EP4TA 에 의해 참조되는(직접적으로) EPT 페이징 구조에서 파생됩니다. CR0.PG = 1 이면 CR3의 현재 값에 의해 참조되는(직,간접적으로) 페이징 구조에서도 파생됩니다. 현재 VPID, 현재 PCID, 현재 EP4TA 와 연결됩니다. CR0.PG = 0 인 경우 Combined Paging-Structure Cache Enries 가 생성되지 않습니다.
    • 존재하지 않거나 잘못 구성된 EPT Paging-Structure Entry 에서 파생된 정보로 Guest-Physical Mapping 또는 Combined Mapping 이 생성되지 않습니다.
    • 존재하지 않거나 예약된 비트를 설정하는 게스트 Paging-Structure Entry 에서 파생된 정보로 Combined Mapping 이 생성되지 않습니다.
    • EPT 를 사용하는 동안 Linear Mapping 은 생성되지 않습니다.

다음 내용은 다양한 매핑의 사용에 대해 자세히 설명합니다.

  • EPT 가 사용되지 않는 경우(ex. VMX non-root operation 이 아닌 경우) 논리 프로세서는 다음과 같이 캐시된 매핑을 사용할 수 있습니다.
    • 선형 주소를 사용하는 액세스의 경우 현재 VPID, 현재 PCID 와 연관된 Linear Mapping 을 사용할 수 있습니다. 또한 현재 VPID, PCID 와 연관된 전역 TLB Entry를 사용할 수 있습니다.
    • EPT 가 사용되지 않는 동안 Guest-Physical, Combined Mapping 은 사용할 수 없습니다.
  • EPT 가 사용되는 경우 다음과 같이 캐시된 매핑을 사용할 수 있습니다.
    • 선형 주소를 사용하는 액세스의 경우 현재 VPID, PCID, EP4TA 와 연관된 Combined Mapping 을 사용할 수 있습니다. 또한 현재 VPID, EP4TA 와 모든 PCID 와 연관된 전역 TLB Entry 를 사용할 수 있습니다.
    • 게스트 물리 주소를 사용하는 액세스의 경우 현재 EP4TA 와 연결된 Guest-Physical Mapping 을 사용할 수 있습니다.
    • EPT 가 사용되는 동안 Linear Mapping 은 사용할 수 없습니다.

[-] Invalidating Cached Translation Information

페이징 구조(EPT Paging-Structure, SPP Vector 를 찾는 데 사용되는 데이터 구조 포함)의 수정으로 인한 해당 구조와 논리 프로세서에 의해 캐시된 매핑 간 불일치가 발생할 수 있습니다.

특정 작업은 논리 프로세서에 의해 캐시된 정보를 무효화하고 이러한 불일치를 제거하는 데 사용할 수 있습니다.

[+] Operations that Invalidate Cached Mappings

아래와 같은 행위가 발생하는 경우 캐시된 매핑을 무효화합니다.

  • VMX Operation 과 독립적 TLB 또는 Paging-Structure Cache 를 구조적으로 무효화하는 작업(ex. INVLPG, INVPCID 명령)은 LInear MappingCombined Mapping 을 무효화합니다.

    현재 VPID 에 대해서만 수행해야 합니다.(단, Combined Mapping 의 경우 모든 EP4TA 에 대해 수행) 현재 VPID 에 대한 Linear MappingEPT 가 사용 중인 경우에도 무효화됩니다.

    EPT 를 사용하지 않는 경우에도 현재 VPID 에 대한 Combined Mapping 이 무효화 됩니다.

  • EPT Violation 은 발생시킨 게스트 물리 주소를 변환하는 데 사용되는 모든 Guest-Physical Mapping(현재 EP4TA 와 연관된)을 무효화합니다. 해당 게스트 물리 주소가 선형 주소의 변환인 경우 EPT Violation 은 현재 PCID, VPID, EP4TA 와 연결된 해당 선형 주소에 대한 Combined Mapping 도 무효화 합니다.
  • VM-execution controlenable VPID 제어가 0인 경우, VM Entry, VM ExitVPID = 0000h(모든 PCID)와 관련된 Linear Mapping, Combined Mapping 을 무효화 합니다. VPID 0000h 에 대한 Combined Mapping 은 모든 EP4TA 에 대해 무효화 합니다.
  • INVVPID 명령을 실행하면 Linear Mapping, Combined Mapping 이 무효화 됩니다. 무효화는 INVVPID Type, Descriptor 라고 하는 명령어의 피연산자를 기반으로 합니다. 4개의 INVVPID Type 이 현재 정의되어 있습니다.
    • Individual-Address : INVVPID Type 이 0인 경우 논리 프로세서는 INVVPID Descriptor 에 지정된 VPID와 연관되고 선형 주소를 변환하는 데 사용되는 Linear Mapping, Combined Mapping 을 무효화합니다.
    • Single-Context : INVVPID Type 이 1인 경우 논리 프로세서는 INVVPID Descriptor 에 지정된 VPID 와 연관된 모든 Linear, Combined Mapping 을 무효화합니다.
    • All-Context : INVVPID Type 이 2인 경우 논리 프로세서는 VPID 0000h, 모든 PCID 를 제외하고 모든 VPID 와 연관된 Linear, Combined Mapping 을 무효화합니다.
    • Single-Context-Retaining-Globals : INVVPID Type 이 3인 경우 논리 프로세서는 INVVPID Descriptor 에 지정된 VPID와 연관된 Linear, Combined Mapping 을 무효화 합니다.
  • INVEPT 명령을 실행하면 Guest-Physical, Combined Mapping 이 무효화 됩니다. 무효화는 INVEPT Type, Descriptor 라고 하는 명령어의 피연산자를 기반으로 합니다. 두 가지의 유형이 정의되어 있습니다.
    • Single-Context : INVEPT Type 이 1이면 논리 프로세서는 INVEPT Descriptor 에 지정된 EP4TA 와 연관된 모든 Guest-Physical, Combined Mapping 을 무효화 합니다.
    • All-Context : INVEPT Type 이 2이면 논리 프로세서는 INVEPT Descriptor 에 지정된 모든 EP4TA 와 연관된 Guest-Physical, Combined Mapping 을 무효화합니다.

[+] Operations that Need Not Invalidate Cached Mappings

다음 항목에서는 캐시된 특정 매핑을 무효화하는데 필요하지 않은 작업에 대해 설명합니다.

  • VMX Operation 과 무관하게 TLB 또는 Paging-Structure Cache Entries 를 구조적으로 무효화하는 작업은 Guest-Physical Mapping 을 무효화하는 데 필요하지 않습니다.
  • INVVPID 명령은 Guest-Physical Mapping 을 무효화하는 데 필요하지 않습니다.
  • INVEPT 명령은 Linear Mapping 을 무효화하는 데 필요하지 않습니다.
  • Guest-Physical Mapping 을 무효화하기 위해 VMX Transition 이 필요하지 않습니다. VM-execution controlenable VPID 제어가 1이면 Linear, Combined Mapping 을 무효화하기 위해 VMX Transition 이 필요하지 않습니다.
  • Linear, Guest-Physical, Combined Mapping 을 무효화하는 데 VMXON, VMXOFF 명령이 필요하지 않습니다.

논리 프로세서는 언제든지 캐시된 매핑을 무효화할 수 있습니다. 이러한 이유로 위에서 식별된 작업은 반드시 필요하지 않음에도 지정된 매핑을 무효화할 수 있습니다.

[+] Guidelines for Use of the INVVPID Instruction

VMMINVVPID 명령어를 사용해야 하는지 여부는 해당 VMM 이 메모리를 가상화하는 방법에 따라 다릅니다.

EPT 를 사용하지 않는 경우 VMM 이 게스트 페이징 구조를 가상화 중일 수 있습니다. 이러한 VMMTLBPaging-Structure Cache Entries 를 무효화하는 모든 작업 또는 일부 작업이 VM Exit 를 발생하도록 VMCS 를 구성할 수 있습니다.

VMM 이 이러한 작업을 에뮬레이트하는 경우 INVVPID 명령을 사용하여 논리 프로세서의 TLBPaging-Structure Cache 가 적절하게 무효화되었는지 확인해야 할 수 있습니다.

VMMINVVPID 명령을 사용해야 하는 경우에 대한 요구 사항은 Page-Table Virtualization 에 사용되는 특정 알고리즘에 따라 다릅니다.

  • INVLPG 명령어를 에뮬레이션하려면 다음과 같이 INVVPID 명령을 실행해야 할 수 있습니다.
    • INVVPID Type 은 0이어야 합니다.(Individual-Address)
    • INVVPID DescriptorVPID 는 실행이 에뮬레이트되는 가상 프로세서에 할당된 것이어야 합니다.
    • INVVPID Descriptor 의 선형 주소는 에뮬레이트되는 INVLPG 명령의 피연산자 주소입니다.
  • 일부 명령은 전역 변환을 제외하고 TLBPaging-Structure Cache 의 모든 엔트리를 무효화합니다. MOV to CR3 를 예로 들 수 있습니다.
    • INVVPID Type 은 3이어야 합니다.(Single-Context-Retaining-Globals)
    • INVVPID DecriptorVPID 는 실행이 에뮬레이트되는 가상 프로세서에 할당된 것이어야 합니다.
  • 일부 명령은 전역 변환을 포함하여 TLBPaging-Structure Cache 의 모든 엔트리를 무효화합니다. CR4.PGE 의 값을 변경하게 하는 MOV to CR4 가 이러한 예시 입니다.
    • INVVPID Type 은 1이어야 합니다.(Single-Context)
    • INVVPID DescriptorVPID 는 실행이 에뮬레이트되는 가상 프로세서에 할당된 것이어야 합니다.

EPT 를 사용하지 않는 경우 논리 프로세서는 생성하는 모든 매핑을 현재 VPID 와 연결하고 이러한 매핑을 사용하여 선형 주소를 변환합니다. 따라서 VMM 은 다른 페이지 테이블을 사용하는 다른 non-EPT 게스트에 대해 동일한 VPID 를 사용하면 안됩니다. 이렇게 되면 한 게스트가 다른 게스트와 연관된 변환을 사용하게 될 수 있습니다.

EPT 가 사용 중인 경우 위에 열거된 지침으로 인해 VM Exit 발생하지 않도록 VMCS 를 구성할 수 있으며, VMM 이를 에뮬레이트하지 않을 수 있습니다. 이 경우 게스트 소프트웨어에 의한 명령 실행은 TLBPaging-Structure Cache 의 필수 항목을 적절하게 무효화합니다. INVVPID 명령이 필요하지 않습니다.

EPT 가 사용 중인 경우 논리 프로세서는 생성하는 모든 매핑을 현재 EPTP 의 bits 51:12 값과 연결합니다. VMM 이 게스트 마다 다른 EPTP 를 사용하는 경우 동일한 VPID 를 사용할 수 있습니다.

[+] Guidelines for Use of the INVEPT Instruction

아래에서는 INVEPT 명령을 이용하여 EPT 페이징 구조에서 캐시된 정보를 무효화하기 위한 지침을 제공합니다.

  • VMMEPT Paging-Structure Entry 를 다음과 같이 변경한 후 INVEPT TypeSingle-Context 로 하여 INVEPT 명령을 사용해야 합니다.(INVEPT Descriptor 에는 수정된 EPT Paging-Structure 를 직접 또는 간접적으로 참조하는 EPTP 값이 포함되어야 합니다.)
    • Privilege bits 2:0 을 1에서 0으로 변경
    • 물리 주소의 bits 51:12 를 변경
    • Accessed, Dirty Flag 가 활성화 된 경우 bit 8(accessed flag) 를 지워야함
    • EPT PDPTE 또는 EPT PDE 의 경우 bit 7 변경(엔트리가 페이지를 매핑하는지 여부를 결정하는 비트)
    • 게스트 물리 주소(bit 7이 1로 설정된 EPT PDPTE, PDE, PTE)를 변환하는 데 사용되는 마지막 EPT Paging-Structure Entry 의 경우 bits 5:3 또는 bit 6을 변경합니다.
    • 게스트 물리 주소(위와 동일)를 변환하는 데 사용되는 마지막 EPT Paging-Structure Entry 의 경우 bit 9(dirty flag)가 활성화되어 있으면 지워야 합니다.

[0x05] Conclusion

드디어 Intel SDM 에 있는 VMM 과 연관된 목표한 부분을 끝냈습니다.

다만 EPT 에서 페이징과 관련하여 아직 익숙치 않은 부분이 많습니다.

Paging-Structure 라는 하나의 거대한 구조는 페이징이라는 프로세스에서 필요한 구조들의 집합이란 것은 확실히 이해했습니다.

이에 따라 매핑되느냐(bit 7 = 1) 참조되느냐(bit 7 = 0)에 따라 다른 구조를 사용한다는 것으로 이해했습니다.

매핑이 되는 경우 해당 엔트리가 최종 계산이며, 참조의 경우 또 다른 테이블을 참조하여 엔트리를 찾아갑니다.

어쨋든 어설픈 번역과 이해이기 때문에 해당 문서들은 추가적으로 더 보강할 것 입니다.

※ 페이징과 관련된 내용이 정리되었으며, 아래 링크에서 확인할 수 있습니다.

[0x06] Reference

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