HvCallFlushVirtualAddressList 하이퍼콜은 지정된 주소 공간에 속하는 가상 TLB의 일부를 무효화합니다.
아키텍처: x64만 해당합니다.
인터페이스
HV_STATUS
HvCallFlushVirtualAddressList(
_In_ HV_ADDRESS_SPACE_ID AddressSpace,
_In_ HV_FLUSH_FLAGS Flags,
_In_ UINT64 ProcessorMask,
_Inout_ UINT32* GvaCount,
_In_reads_(*GvaCount) const HV_GVA* GvaRangeList
);
가상 TLB 무효화 작업은 하나 이상의 프로세서에서 작동합니다.
게스트가 플러시해야 할 수 있는 프로세서에 대한 지식이 있는 경우 프로세서 마스크를 지정할 수 있습니다. 마스크의 각 비트는 가상 프로세서 인덱스에 해당합니다. 예를 들어 0x0000000000000051 마스크는 하이퍼바이저가 가상 프로세서 0, 4 및 6의 TLB만 플러시해야 임을 나타냅니다.
다음 플래그를 사용하여 플러시 동작을 수정할 수 있습니다.
- HV_FLUSH_ALL_PROCESSORS 작업이 파티션 내의 모든 가상 프로세서에 적용되어야 임을 나타냅니다. 이 플래그를 설정하면 ProcessorMask 매개 변수가 무시됩니다.
- HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES 작업이 모든 가상 주소 공간에 적용되어야 임을 나타냅니다. 이 플래그를 설정하면 AddressSpace 매개 변수가 무시됩니다.
- HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY 이 호출에 의미가 없으며 잘못된 옵션으로 처리됩니다.
다른 모든 플래그는 예약되어 있으며 0으로 설정해야 합니다.
이 호출은 GVA 범위 목록을 가져옵니다. 각 범위에는 기본 GVA가 있습니다. 페이지 세분성으로 플러시가 수행되므로 GVA의 아래쪽 12비트를 사용하여 범위 길이를 정의할 수 있습니다. 이러한 비트는 범위 내의 추가 페이지 수(초기 페이지 외)를 인코딩합니다. 이렇게 하면 각 항목이 1~4096페이지의 범위를 인코딩할 수 있습니다.
"큰 페이지" 매핑(2MB 또는 4MB) 내에 속하는 GVA는 전체 큰 페이지를 가상 TLB에서 플러시합니다.
이 호출은 시간 컨트롤이 호출자에게 다시 반환될 때 지정된 가상 프로세서에 대한 모든 플러시에서 관찰 가능한 효과가 발생했음을 보장합니다.
잘못된 GVA(파티션의 GVA 공간 끝 이후의 주소를 지정하는 GVA)는 무시됩니다.
대상 가상 프로세서의 TLB에 플러시가 필요하고 가상 프로세서가 TLB 플러시를 억제하는 경우 호출자의 가상 프로세서가 일시 중단됩니다. TLB 플러시가 더 이상 억제되지 않으면 가상 프로세서는 "사용되지 않음"이며 하이퍼콜이 재발행됩니다.
호출 코드
0x0003 (담당자)
입력 매개 변수
| 이름 | 상쇄 | Size | 제공된 정보 |
|---|---|---|---|
AddressSpace |
0 | 8 | 주소 공간 ID(CR3 값)를 지정합니다. |
Flags |
8 | 8 | 플러시 작업을 수정하는 플래그 비트 집합입니다. |
ProcessorMask |
16 | 8 | 플러시 작업의 영향을 받는 프로세서를 나타내는 프로세서 마스크입니다. |
Input List 요소
| 이름 | 상쇄 | Size | 제공된 정보 |
|---|---|---|---|
GvaRange |
0 | 8 | GVA 범위 |