Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dane kontekstowe zakończenia pracy maszyny wirtualnej spowodowane przez dostęp do pamięci.
Składnia
//
// Context data for a VM exit caused by a memory access
// (WHvRunVpExitReasonMemoryAccess on x64; WHvRunVpExitReasonUnmappedGpa or
// WHvRunVpExitReasonGpaIntercept on Arm64)
//
typedef enum WHV_MEMORY_ACCESS_TYPE
{
WHvMemoryAccessRead = 0,
WHvMemoryAccessWrite = 1,
WHvMemoryAccessExecute = 2
} WHV_MEMORY_ACCESS_TYPE;
#if defined(_AMD64_)
typedef union WHV_MEMORY_ACCESS_INFO
{
struct {
UINT32 AccessType : 2; // WHV_MEMORY_ACCESS_TYPE
UINT32 GpaUnmapped : 1;
UINT32 GvaValid : 1;
UINT32 Reserved : 28;
};
UINT32 AsUINT32;
} WHV_MEMORY_ACCESS_INFO;
typedef struct WHV_MEMORY_ACCESS_CONTEXT
{
// Context of the virtual processor
UINT8 InstructionByteCount;
UINT8 Reserved[3];
UINT8 InstructionBytes[16];
// Memory access info
WHV_MEMORY_ACCESS_INFO AccessInfo;
WHV_GUEST_PHYSICAL_ADDRESS Gpa;
WHV_GUEST_VIRTUAL_ADDRESS Gva;
} WHV_MEMORY_ACCESS_CONTEXT;
#elif defined(_ARM64_)
typedef union WHV_MEMORY_ACCESS_INFO
{
UINT8 AsUINT8;
struct
{
UINT8 GvaValid:1;
UINT8 GvaGpaValid:1;
UINT8 HypercallOutputPending:1;
UINT8 Reserved:5;
};
} WHV_MEMORY_ACCESS_INFO;
typedef struct WHV_MEMORY_ACCESS_CONTEXT
{
WHV_INTERCEPT_MESSAGE_HEADER Header;
UINT32 Reserved0;
UINT8 InstructionByteCount;
WHV_MEMORY_ACCESS_INFO AccessInfo;
UINT16 Reserved1;
UINT8 InstructionBytes[4];
UINT32 Reserved2;
UINT64 Gva;
UINT64 Gpa;
UINT64 Syndrome;
} WHV_MEMORY_ACCESS_CONTEXT;
#endif // _ARCH_
Remarks
Informacje o wyjściach spowodowanych przez procesor wirtualny uzyskuje dostęp do lokalizacji pamięci, która nie jest mapowana lub nie jest dostępna, jest dostarczana przez WHV_MEMORY_ACCESS_CONTEXT strukturę.
Typowym przypadkiem użycia zakończenia dostępu do pamięci jest emulacja operacji urządzenia MMIO, gdzie niezamapowane regiony przestrzeni gpA partycji są używane dla przestrzeni MMIO emulowanego urządzenia i dostęp do tego regionu są przekazywane do logiki emulacji urządzenia w stosie wirtualizacji.
Struktura WHV_MEMORY_ACCESS_CONTEXT jest definiowana inaczej dla partycji x64 (_AMD64_) i Arm64 (_ARM64_):
- Na x64 powierzchnie dostępu z przyczyną
WHvRunVpExitReasonMemoryAccesswyjścia. Kontekst raportuje typ dostępu i ważność adresu za pośrednictwemWHV_MEMORY_ACCESS_INFO.AccessType,GpaUnmappediGvaValid, i przenosi przechwycone bajty instrukcji na potrzeby emulacji. Struktura to 40 bajtów. - Na arm64 powierzchnie dostępu z jednym z dwóch powodów wyjścia:
WHvRunVpExitReasonUnmappedGpagdy dostęp do adresu fizycznego gościa nie jest mapowany lubWHvRunVpExitReasonGpaInterceptgdy adres jest mapowany, ale skonfigurowany do przechwytywania. Kontekst zaczyna się odWHV_INTERCEPT_MESSAGE_HEADERwartości (która zgłasza błędyPciCpsr), aSyndromeelement członkowski zawiera wartość Rejestru zespołu wyjątków Arm64 (ESR), która opisuje błędny dostęp. Struktura to 64 bajty.
Note
W usłudze Arm64 typ dostępu jest zgłaszany przez WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType pole (WHV_MEMORY_ACCESS_TYPEwartość), a nie przez AccessType pole bitowe w .WHV_MEMORY_ACCESS_INFO