Поделиться через


!dma

Расширение !dma отображает сведения о подсистеме прямого доступа к памяти (DMA) и параметре проверки DMA средства проверки драйверов.

!dma 
!dma Adapter [Flags]

Параметры

Адаптер
Указывает шестнадцатеричный адрес отображаемого адаптера DMA. Если это равно нулю, будут отображаться все адаптеры DMA.

Флаги
Указывает сведения, которые необходимо включить в дисплей. Это может быть любое сочетание следующих битов. Значение по умолчанию — 0x1.

Bit 0 (0x1)
Приводит к включению сведений об универсальном адаптере.

Бит 1 (0x2)
Приводит к включению сведений о регистре карты. (Только если проверка DMA активна.)

Бит 2 (0x4)
Приводит к включению общих сведений о буфере. (Только если проверка DMA активна.)

Бит 3 (0x8)
Приводит к включению сведений о списке точечной и сборной. (Только если проверка DMA активна.)

Бит 4 (0x10)
Приводит к включению описания устройства для аппаратного устройства. (Только если проверка DMA активна.)

Бит 5 (0x20)
Приводит к включению сведений о блоке контекста ожидания.

DLL-библиотеки

Kdexts.dll

Дополнительная информация

Сведения о средстве проверки драйверов см. в документации по комплекту драйверов Windows (WDK). Дополнительные сведения о DMA см. в документации по комплекту драйверов Windows (WDK) и внутренних элементах Microsoft Windows Марком Руссиновичем Дэвидом Соломоном.

Замечания

Недопустимые аргументы (например, !dma 1) создают краткий текст справки.

Если расширение !dma используется без параметров, он отображает краткий список всех адаптеров DMA и их адресов. Это можно использовать для получения адреса адаптера для использования в более длинных версиях этой команды.

Ниже приведен пример использования этого расширения при активной проверке DMA средства проверки драйвера:

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

Из этих выходных данных вы увидите, что в системе есть три адаптера DMA. SCSIPORT владеет двумя и NDIS владеет третьим. Чтобы подробно изучить адаптер NDIS, используйте расширение !dma со своим адресом:

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

Первый блок данных — это конкретные сведения, которые разработчик HAL может использовать для отладки проблемы. Для ваших целей данные ниже "Dma verifier дополнительных сведений" — это то, что интересно. В этом примере вы увидите, что NDIS выделила 0x840 регистры карт. Это огромное число, особенно потому, что NDIS указал, что планируется использовать не более двух регистров карт. Этот адаптер, по-видимому, не использует списки точечной и сборной и не помещает все каналы адаптера. Дополнительные сведения см. в регистрах карты:

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

В этом примере вы увидите, что некоторые регистры карт сопоставлены. Каждый файл регистра карты — это выделение регистров карты драйвером. Иными словами, он представляет один вызов в AllocateAdapterChannel. NDIS собирает большое количество этих файлов регистра карты, а некоторые драйверы создают их одновременно и удаляют их после завершения.

Файлы регистра карты также являются адресами, возвращаемыми устройству под именем MapRegisterBase. Обратите внимание, что средство проверки DMA перехватывает только первые 64 регистров карты для каждого драйвера. Остальные игнорируются по причинам пространства (каждый регистр карты представляет три физических страницы).

В этом примере используются два файла регистра карты. Это означает, что драйвер сопоставляет буфер, чтобы он был видимым для оборудования. В первом случае 0xBC байты сопоставляются с системным виртуальным адресом 0xF83C003C.

Анализ общих буферов показывает:

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

Это довольно просто; Существует четыре общих буфера различной длины. Все физические и виртуальные адреса предоставляются.