!Dma
L'estensione !dma visualizza informazioni sul sottosistema DMA (Direct Memory Access) e sull'opzione DMA Verifier di Driver Verifier .
!dma
!dma Adapter [Flags]
Parametri
Adattatore
Specifica l'indirizzo esadecimale dell'adapter DMA da visualizzare. Se è zero, verranno visualizzati tutti gli adattatori DMA.
Bandiere
Specifica le informazioni da includere nella visualizzazione. Può trattarsi di qualsiasi combinazione dei bit seguenti. Il valore predefinito è 0x1.
Bit 0 (0x1)
Fa sì che la visualizzazione includa informazioni sull'adattatore generico.
Bit 1 (0x2)
Fa sì che la visualizzazione includa informazioni sul registro mappa. (Solo quando la verifica DMA è attiva).
Bit 2 (0x4)
Fa in modo che la visualizzazione includa informazioni comuni sul buffer. (Solo quando la verifica DMA è attiva).
Bit 3 (0x8)
Fa sì che la visualizzazione includa informazioni sull'elenco a dispersione/raccolta. (Solo quando la verifica DMA è attiva).
Bit 4 (0x10)
Fa sì che la visualizzazione includa la descrizione del dispositivo per il dispositivo hardware. (Solo quando la verifica DMA è attiva).
Bit 5 (0x20)
Fa in modo che la visualizzazione includa informazioni sul blocco del contesto di attesa.
DLL
Kdexts.dll
Informazioni aggiuntive
Per informazioni su Driver Verifier, vedere la documentazione di Windows Driver Kit (WDK). Per informazioni su DMA, vedere la documentazione di Windows Driver Kit (WDK) e microsoft Windows Internals di Mark Russinovich David Solomon.
Osservazioni:
Gli argomenti non validi ,ad esempio !dma 1, generano un breve testo della Guida.
Quando l'estensione !dma viene usata senza parametri, viene visualizzato un elenco conciso di tutte le schede DMA e dei relativi indirizzi. Può essere usato per ottenere l'indirizzo di un adattatore da utilizzare nelle versioni più lunghe di questo comando.
Di seguito è riportato un esempio di come questa estensione può essere usata quando l'opzione di verifica DMA del driver è attiva:
0:kd> !dma
Dumping all DMA adapters...
Adapter: 82faebd0 Owner: SCSIPORT!ScsiPortGetUncachedExtension
Adapter: 82f88930 Owner: SCSIPORT!ScsiPortGetUncachedExtension
Adapter: 82f06cd0 Owner: NDIS!NdisMAllocateMapRegisters
Master adapter: 80076800
Da questo output è possibile notare che nel sistema sono presenti tre schede DMA. SCSIPORT possiede due e NDIS possiede il terzo. Per esaminare in dettaglio l'adapter NDIS, usare l'estensione !dma con il relativo indirizzo:
0:kd> !dma 82f06cd0
Adapter: 82f06cd0 Owner: NDIS!NdisMAllocateMapRegisters (0x9fe24351)
MasterAdapter: 00000000
Adapter base Va 00000000
Map register base: 00000000
WCB: 82f2b604
Map registers: 00000000 mapped, 00000000 allocated, 00000002 max
Dma verifier additional information:
DeviceObject: 82f98690
Map registers: 00000840 allocated, 00000000 freed
Scatter-gather lists: 00000000 allocated, 00000000 freed
Common buffers: 00000004 allocated, 00000000 freed
Adapter channels: 00000420 allocated, 00000420 freed
Bytes mapped since last flush: 000000f2
Il primo blocco di dati è informazioni specifiche che uno sviluppatore HAL può usare per eseguire il debug del problema. Ai fini dell'utente, i dati seguenti "Dma verifier additional information" (Informazioni aggiuntive sul verifier Dma) sono interessanti. In questo esempio si noterà che NDIS ha allocato 0x840 registri mappa. Questo è un numero enorme, soprattutto perché NDIS aveva indicato che ha pianificato di usare un massimo di due registri mappa. Questo adattatore apparentemente non usa elenchi a dispersione/raccolta e ha messo via tutti i canali di adattatore. Esaminare i registri della mappa in modo più dettagliato:
0:kd> !dma 82f06cd0 2
Adapter: 82f06cd0 Owner: NDIS!NdisMAllocateMapRegisters
...
Map register file 82f06c58 (0/2 mapped)
Double buffer mdl: 82f2c188
Map registers:
82f06c80: Not mapped
82f06c8c: Not mapped
Map register file 82f06228 (1/2 mapped)
Double buffer mdl: 82f1b678
Map registers:
82f06250: 00bc bytes mapped to f83c003c
82f0625c: Not mapped
Map register file 82fa5ad8 (1/2 mapped)
Double buffer mdl: 82f1b048
Map registers:
82fa5b00: 0036 bytes mapped to 82d17102
82fa5b0c: Not mapped
...
In questo esempio si noterà che alcuni registri mappa sono stati mappati. Ogni file di registro delle mappe è un'allocazione dei registri mappa da parte del driver. In altre parole, rappresenta una singola chiamata a AllocateAdapterChannel. NDIS raccoglie un numero elevato di questi file di registro della mappa, mentre alcuni driver li creano uno alla volta e li eliminano al termine.
I file di registro della mappa sono anche gli indirizzi restituiti al dispositivo con il nome "MapRegisterBase". Si noti che il verificatore DMA associa solo i primi 64 registri mappa per ogni driver. Il resto viene ignorato per motivi di spazio (ogni registro mappa rappresenta tre pagine fisiche).
In questo esempio sono in uso due file di registro mappa. Ciò significa che il driver ha mappato un buffer in modo che sia visibile all'hardware. Nel primo caso, 0xBC byte vengono mappati all'indirizzo virtuale di sistema 0xF83C003C.
Un esame dei buffer comuni rivela:
0:kd> !dma 82f06cd0 4
Adapter: 82f06cd0 Owner: NDIS!NdisMAllocateMapRegisters
...
Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
Length: 1000
Virtual address: 82e77000
Physical address: 2a77000
Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
Length: 12010
Virtual address: 82e817f8
Physical address: 2a817f8
Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
Length: 4300
Virtual address: 82e95680
Physical address: 2a95680
Common buffer allocated by NDIS!NdisMAllocateSharedMemory:
Length: 4800
Virtual address: 82e9d400
Physical address: 2a9d400
Questo è abbastanza semplice; ci sono quattro buffer comuni di lunghezza variabile. Vengono forniti tutti gli indirizzi fisici e virtuali.