다음을 통해 공유


어댑터 개체 가져오기

디바이스 시작 시 시스템 또는 버스 master DMA를 사용하는 드라이버는 IoGetDmaAdapter를 호출하여 어댑터 개체에 대한 포인터를 가져와 각 전송 작업에 사용할 수 있는 최대 지도 레지스터 수를 결정합니다. 드라이버가 IoGetDmaAdapter를 호출하면 I/O 관리자는 HAL을 호출하여 필요한 플랫폼별 정보를 가져옵니다.

드라이버는 IoGetDmaAdapter 호출에서 시스템 정의 DEVICE_DESCRIPTION 구조에서 특정 정보를 제공해야 합니다. 드라이버는 RtlZeroMemory 를 사용하여 값을 설정하기 전에 DEVICE_DESCRIPTION 구조를 0으로 초기화해야 합니다.

필요한 데이터에는 디바이스가 버스 master인지 여부, 분산/수집 기능이 있는지 여부, 디바이스가 한 번에 전송할 수 있는 데이터 바이트 수(MaximumLength)와 같은 드라이버 디바이스의 기능에 대한 정보가 포함됩니다.

필요한 디바이스 설명 데이터에는 버스 master 디바이스의 드라이버가 제어하는 버스의 플랫폼별 및 시스템 할당 번호와 같은 플랫폼별 정보도 포함됩니다. 드라이버는 IoGetDeviceProperty를 호출하여 이 정보를 가져올 수 있습니다.

DEVICE_DESCRIPTION 구조에는 일부 DMA 디바이스 또는 드라이버와 관련이 없는 일부 필드가 포함되어 있습니다. 예를 들어 BusNumber 필드는 WDM 드라이버에서 사용되지 않습니다. 각 드라이버는 관련 구조체 멤버에 대한 값을 제공해야 하며 다른 모든 멤버의 값을 0으로 설정해야 합니다.

요청이 두 개 이상의 DMA 작업으로 분할되어야 할 때 디바이스가 시스템 DMA 컨트롤러가 다시 프로그래밍될 때까지 대기할 수 없는 한 하위 디바이스의 드라이버는 ScatterGather 필드에서 TRUE를 전달해서는 안 됩니다.

IoGetDmaAdapter 는 어댑터 개체에 대한 포인터와 각 DMA 전송 작업에 대해 어댑터 개체에서 사용할 수 있는 맵 레지스터 수를 나타내는 플랫폼별 또는 디바이스별 값을 모두 반환합니다.

반환된 어댑터 개체에는 드라이버에서 액세스할 수 있는 세 개의 필드가 포함되어 있습니다.

  • 버전 번호(버전)

  • 크기(크기)

  • DMA_OPERATIONS 구조체에 대한 포인터(DmaOperations)

DMA_OPERATIONS 구조는 드라이버가 디바이스에서 DMA 작업을 수행하는 데 사용해야 하는 함수에 대한 포인터 테이블로 구성됩니다. 함수는 이 데이터 구조의 포인터를 통해서만 액세스할 수 있습니다. 드라이버는 이름으로 직접 호출할 수 없습니다. (이러한 루틴은 이전 버전의 Windows NT 지원되는 HalXxx 루틴을 대체합니다. 레거시 드라이버의 호환성을 보장하기 위해 Wdm.h 및 Ntddk.h 헤더 파일은 매크로에 사용되지 않는 이름을 제공하지만 새 드라이버는 항상 데이터 구조를 통해 함수를 호출해야 합니다.)

지도 레지스터 수는 디바이스마다, 플랫폼마다 다를 수 있습니다. 일반적으로 HAL은 다음 조건에 따라 여러 맵 레지스터를 할당합니다.

  • 가능하면 HAL은 드라이버의 IoGetDmaAdapter 호출에 지정된 대로 MaximumLength 바이트를 전송하는 데 필요한 맵 레지스터 수보다 1개 더 많은 값을 반환합니다.

  • 그렇지 않으면 HAL은 특정 플랫폼에 대해 가능한 한 큰 더 작은 값을 반환합니다.

즉, HAL은 일반적으로 각 드라이버에 디바이스의 DMA 처리량을 최대화할 수 있는 충분한 맵 레지스터를 제공하지만 HAL은 일부 Windows 플랫폼에서 더 작은 값을 반환할 수 있습니다. 드라이버가 요청하는 맵 레지스터 수를 가져올 것이라는 보장은 없으므로 드라이버는 항상 반환된 값을 검사 합니다.

모든 DMA 디바이스 드라이버는 IoGetDmaAdapter에서 반환된 어댑터 개체 포인터 및 NumberOfMapRegisters 값에 대한 스토리지를 제공해야 합니다. 이 포인터는 DMA에 사용되는 시스템 제공 지원 루틴에 필요한 매개 변수입니다. 이러한 지원 루틴의 대부분은 IRQL = DISPATCH_LEVEL 호출되어야 하므로 드라이버 할당 스토리지가 상주해야 합니다. 대부분의 DMA 드라이버는 디바이스 확장에 필요한 스토리지를 제공합니다. 그러나 드라이버가 컨트롤러 개체를 사용하는 경우 또는 드라이버가 할당한 비페이지 풀에서 스토리지가 컨트롤러 확장에 있을 수 있습니다. 자세한 내용은 System-Space 메모리 할당하드웨어 우선 순위 관리를 참조하세요 .

드라이버가 모든 DMA 작업을 완료하면 PutDmaAdapter 를 호출하여 어댑터 개체를 해제합니다.

다음 섹션에서는 시스템 DMA 사용Bus-Master DMA 사용)에서 DMA 디바이스의 모놀리식 드라이버가 지원 루틴을 사용하여 전송 요청을 충족하는 방법을 설명합니다. 이러한 섹션에서는 드라이버에 다음이 있다고 가정합니다.

  • IRP의 내부 큐를 설정하고 관리하는 대신 표준 StartIo 루틴

  • 부족한 수의 지도 레지스터를 사용할 수 있는 전송 요청을 분할하는 내부 루틴

  • 디바이스별 DMA 제약 조건 없음

즉, 이 섹션에서는 드라이버의 DMA 작업에 가능한 가장 간단한 기술을 설명하지만 개별 드라이버가 정확히 동일한 기술을 사용하는 것은 아닙니다. 드라이버 루틴이 큰 DMA 전송 요청을 분할해야 하는 DMA 디바이스의 모든 드라이버의 경우 드라이버 모델(클래스/포트 또는 모놀리식), 디바이스의 기능 및 드라이버가 처리해야 하는 디바이스별 DMA 제약 조건에 따라 달라집니다.