Condividi tramite


Memoria virtuale e fisica

Il motore fornisce diversi metodi per la lettura e la scrittura della memoria virtuale e fisica di una destinazione.

Memoria virtuale

Quando si specifica una posizione nella memoria virtuale di una destinazione, viene usato lo spazio indirizzi virtuale della destinazione. Nel debug in modalità utente, si tratta dello spazio indirizzi virtuale del processo corrente. Nel debug in modalità kernel, si tratta dello spazio degli indirizzi virtuali del processo implicito. Per altre informazioni sul processo corrente e implicito, vedere Thread e processi .

La memoria virtuale (della destinazione) può essere letta usando ReadVirtual e scritta con WriteVirtual.

I puntatori nella memoria della destinazione possono essere letti e scritti usando i metodi pratici ReadPointersVirtual e WritePointersVirtual. Questi metodi convertiranno automaticamente tra i puntatori a 64 bit usati dal motore e i puntatori nativi usati dalla destinazione. Questi metodi sono utili quando si richiede memoria contenente puntatori che verranno usati per le richieste successive, ad esempio un puntatore a una stringa.

I metodi SearchVirtual e SearchVirtual2 possono essere usati per cercare nella memoria virtuale della destinazione un modello di byte.

Il metodo FillVirtual può essere usato per copiare un modello di byte, più volte, nella memoria virtuale del destinatario.

La memoria virtuale della destinazione può anche essere letta e scritta in modo da ignorare la cache di memoria virtuale del motore di debugger usando i metodi ReadVirtualUncached e WriteVirtualUncached. Queste versioni non memorizzate nella cache sono utili per leggere la memoria virtuale intrinsecamente volatile, ad esempio le aree dei dispositivi mappate alla memoria, senza contaminare o invalidare la cache. L'accesso alla memoria non memorizzata nella cache deve essere usato solo in situazioni in cui è necessario, poiché le prestazioni dell'accesso non memorizzato nella cache possono essere significativamente inferiori rispetto all'accesso memorizzato nella cache.

Il motore fornisce alcuni metodi pratici per leggere le stringhe dalla memoria virtuale della destinazione. Per leggere una stringa multibyte dalla destinazione, usare ReadMultiByteStringVirtual e ReadMultiByteStringVirtualWide. Per leggere una stringa Unicode dalla destinazione, usare ReadUnicodeStringVirtual e ReadUnicodeStringVirtualWide.

Per trovare informazioni su un percorso di memoria, usare GetOffsetInformation. Non tutti gli spazi degli indirizzi virtuali della destinazione contengono memoria valida. Per trovare memoria valida all'interno di un'area, usare GetValidRegionVirtual. Quando si cerca manualmente memoria valida in una destinazione, il metodo GetNextDifferentlyValidOffsetVirtual troverà il percorso successivo in cui la validità può cambiare.

Memoria fisica

La memoria fisica può essere accessibile direttamente solo nel debug in modalità kernel.

La memoria fisica nella destinazione può essere letta usando ReadPhysical e ReadPhysical2 e scritta usando WritePhysical e WritePhysical2.

Il metodo FillPhysical può essere usato per copiare un modello di byte, più volte, nella memoria fisica della memoria destinazione.

Un indirizzo nello spazio indirizzi virtuale della destinazione può essere convertito in un indirizzo fisico nella destinazione usando il metodo VirtualToPhysical . Le strutture di paging del sistema usate per convertire un indirizzo virtuale in un indirizzo fisico sono disponibili usando GetVirtualTranslationPhysicalOffsets.

Avvenimenti

Quando viene modificata la memoria virtuale o fisica della destinazione, viene chiamato il metodo di callback IDebugEventCallbacks::ChangeDebuggeeState .