Condividi tramite


!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.