!dma
!dma 확장은 DMA(직접 메모리 액세스) 하위 시스템 및 드라이버 검증 도구의 DMA 검증 도구 옵션에 대한 정보를 표시합니다.
!dma
!dma Adapter [Flags]
매개 변수
어댑터
표시할 DMA 어댑터의 16진수 주소를 지정합니다. 이 값이 0이면 모든 DMA 어댑터가 표시됩니다.
플래그
디스플레이에 포함할 정보를 지정합니다. 다음 비트의 조합일 수 있습니다. 기본값은 0x1.
비트 0(0x1)
디스플레이에 제네릭 어댑터 정보가 포함되도록 합니다.
비트 1(0x2)
디스플레이에 지도 레지스터 정보가 포함되도록 합니다. (DMA 확인이 활성화된 경우에만)
비트 2(0x4)
디스플레이에 공통 버퍼 정보가 포함되도록 합니다. (DMA 확인이 활성화된 경우에만)
비트 3(0x8)
디스플레이에 분산/수집 목록 정보가 포함되도록 합니다. (DMA 확인이 활성화된 경우에만)
비트 4(0x10)
디스플레이에 하드웨어 디바이스에 대한 디바이스 설명이 포함되도록 합니다. (DMA 확인이 활성화된 경우에만)
비트 5(0x20)
디스플레이에 대기 컨텍스트 블록 정보가 포함되도록 합니다.
DLL
Kdexts.dll
추가 정보
드라이버 검증 도구에 대한 자세한 내용은 WDK(Windows 드라이버 키트) 설명서를 참조하세요. DMA에 대한 자세한 내용은 WDK(Windows 드라이버 키트) 설명서 및 Mark Russinovich David Solomon의 Microsoft Windows Internals 를 참조하세요.
설명
잘못된 인수(예: !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는 2를 소유하고 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 검증 도구 추가 정보"가 흥미롭습니다. 이 예제에서는 NDIS가 0x840 맵 레지스터를 할당한 것을 볼 수 있습니다. 특히 NDIS가 최대 2개의 지도 레지스터를 사용할 계획이라고 표시했기 때문에 이는 엄청난 숫자입니다. 이 어댑터는 분명히 분산/수집 목록을 사용하지 않으며 모든 어댑터 채널을 제거했습니다. 지도 레지스터를 자세히 살펴보세요.
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개의 지도 레지스터만 후크합니다. 나머지는 공간의 이유로 무시됩니다(각 지도 레지스터는 3개의 실제 페이지를 나타낸다).
이 예제에서는 두 개의 맵 레지스터 파일을 사용하고 있습니다. 즉, 드라이버가 버퍼를 매핑하여 하드웨어에 표시되도록 합니다. 첫 번째 경우 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
이것은 매우 간단합니다. 길이가 다른 네 개의 공통 버퍼가 있습니다. 실제 주소와 가상 주소가 모두 지정됩니다.