Bellek Erişimi Çıkışı

Bellek erişimi nedeniyle vm çıkışı için bağlam verileri.

Sözdizimi

//
// 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_

Açıklamalar

Sanal işlemcinin eşlenmemiş veya erişilebilir olmayan bir bellek konumuna erişmesinin neden olduğu çıkışlar hakkında bilgiler yapı tarafından WHV_MEMORY_ACCESS_CONTEXT sağlanır.

Bellek erişimi çıkışları için yaygın bir kullanım örneği, bölümün GPA alanının eşlenmemiş bölgelerinin öykünmüş bir cihazın MMIO alanı için kullanıldığı ve bu bölgeye erişimin sanallaştırma yığınındaki cihaz öykünme mantığına iletildiği MMIO cihaz işlemlerinin öykünmesidir.

Yapı WHV_MEMORY_ACCESS_CONTEXT x64 (_AMD64_) ve Arm64 (_ARM64_) bölümleri için farklı tanımlanır:

  • x64'te erişim çıkış nedeni ile ortaya WHvRunVpExitReasonMemoryAccess çıkar. Bağlam, erişim türünü ve adres geçerliliğini , GpaUnmapped, ve aracılığıyla WHV_MEMORY_ACCESS_INFO.AccessTypebildirir ve GvaValidöykünme için yakalanan yönerge baytlarını taşır. Yapı 40 bayttır.
  • Arm64'te, erişim iki çıkış nedeni ile ortaya çıkar: WHvRunVpExitReasonUnmappedGpa erişilen konuk fiziksel adresi eşlenmediğinde veya WHvRunVpExitReasonGpaIntercept adres eşlendiğinde ancak araya engel olacak şekilde yapılandırıldığında. Bağlam bir WHV_INTERCEPT_MESSAGE_HEADER ile başlar (hatayı Pc bildiren ve Cpsr) ve Syndrome üye, hatalı erişimi açıklayan Arm64 Exception Syndrome Register (ESR) değerini taşır. Yapı 64 bayttır.

Note

Arm64'te erişim türü, içindeki bit alanı WHV_MEMORY_ACCESS_INFOyerine alan (değerWHV_MEMORY_ACCESS_TYPE) tarafından AccessType bildirilirWHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType.

Ayrıca bakınız