Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dati di contesto per una macchina virtuale usciti da un accesso alla memoria.
Sintassi
//
// 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
Le informazioni sulle uscite causate dal processore virtuale che accedono a una posizione di memoria non mappata o non accessibile vengono fornite dalla WHV_MEMORY_ACCESS_CONTEXT struttura.
Un caso d'uso comune per le uscite dall'accesso alla memoria è l'emulazione delle operazioni dei dispositivi MMIO, in cui le aree non mappate dello spazio Criteri di gruppo della partizione vengono usate per lo spazio MMIO di un dispositivo emulato e gli accessi a questa area vengono inoltrati alla logica di emulazione del dispositivo nello stack di virtualizzazione.
La WHV_MEMORY_ACCESS_CONTEXT struttura è definita in modo diverso per le partizioni x64 (_AMD64_) e Arm64 (_ARM64_):
- In x64, le superfici di accesso con il motivo di
WHvRunVpExitReasonMemoryAccessuscita. Il contesto segnala il tipo di accesso e la validità dell'indirizzo tramiteWHV_MEMORY_ACCESS_INFO.AccessType,GpaUnmappedeGvaValide contiene i byte di istruzioni acquisiti per l'emulazione. La struttura è di 40 byte. - In Arm64, le superfici di accesso con uno dei due motivi di uscita:
WHvRunVpExitReasonUnmappedGpaquando l'indirizzo fisico guest a cui si accede non è mappato oWHvRunVpExitReasonGpaInterceptquando l'indirizzo viene mappato ma configurato per intercettare. Il contesto inizia con unWHV_INTERCEPT_MESSAGE_HEADER(che segnala l'errorePceCpsr) e ilSyndromemembro contiene il valore Arm64 Exception Syndrome Register (ESR) che descrive l'accesso con errori. La struttura è di 64 byte.
Note
In Arm64 il tipo di accesso viene segnalato dal WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType campo (un WHV_MEMORY_ACCESS_TYPE valore) anziché da un AccessType campo di bit in WHV_MEMORY_ACCESS_INFO.