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 indirizzi virtuale 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 usando 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 un modello di byte nella memoria virtuale della destinazione.

Il metodo FillVirtual può essere usato per copiare un criterio di byte, più volte, nella memoria virtuale della destinazione.

La memoria virtuale della destinazione può anche essere letta e scritta in modo da ignorare la cache di memoria virtuale del motore del debugger usando i metodi ReadVirtualUncached e WriteVirtualUncached. Queste versioni non memorizzate nella cache sono utili per la lettura della memoria virtuale intrinsecamente volatile, ad esempio le aree del dispositivo 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, in quanto le prestazioni dell'accesso non memorizzato nella cache possono essere notevolmente 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 una posizione di memoria, usare GetOffsetInformation. Non tutti gli spazi indirizzi virtuali nella destinazione contengono memoria valida. Per trovare la memoria valida all'interno di un'area, usare GetValidRegionVirtual. Quando si cerca manualmente la 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 criterio di byte, più volte, nella memoria fisica della 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.

Eventi

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