다음을 통해 공유


Packet-Based Bus-Master DMA 사용

패킷 기반 DMA를 사용하기 위해 버스 master DMA 디바이스의 드라이버는 DMA 전송을 요청하는 IRP를 처리할 때 다음과 같은 일반 지원 루틴 시퀀스를 호출합니다.

  • 전송 요청에 대한 맵 레지스터를 할당하기 직전에 KeFlushIoBuffers(자세한 내용은 캐시 일관성 유지 관리 참조).

  • 드라이버가 DMA용 버스 master 어댑터를 프로그래밍할 준비가 되면 AllocateAdapterChannel

  • MdL에 인덱스를 가져오려면 MapTransfer에 대한 초기 매개 변수로 필요한 MmGetMdlVirtualAddress 및 IRP의 버퍼 디바이스를 백업하는 시스템 물리적 메모리를 액세스 가능하게 만드는 MapTransfer

    전송 요청 분할에 설명된 대로 모든 드라이버는 현재 IRP를 충족하기 위해 둘 이상의 전송 작업을 수행해야 할 수 있습니다. 분산/수집 기능이 없는 디바이스의 드라이버는 전송 작업당 한 번 MapTransfer 를 호출할 수 있습니다. 분산/수집 기능이 있는 디바이스의 드라이버는 MapTransfer를 두 번 이상 호출하여 각 전송 작업을 설정할 수 있습니다. 또는 이러한 드라이버는 분산 /수집 DMA 사용에 설명된 시스템의 기본 제공 분산/수집 지원을 사용할 수 있습니다.

  • 요청된 모든 데이터가 완전히 전송되었는지 여부를 확인하기 위해 대상 디바이스 간에 각 DMA 전송 작업이 끝날 때 FlushAdapterBuffers

  • 요청된 모든 데이터가 완전히 전송되었거나 드라이버가 디바이스 또는 버스 I/O 오류로 인해 IRP에 실패해야 하기 때문에 현재 IRP에 대한 모든 DMA 작업이 완료되는 즉시 FreeMapRegisters

IoGetDmaAdapter에서 반환된 어댑터 개체 포인터는 AllocateAdapterChannel, MapTransfer, FlushAdapterBuffersFreeMapRegisters에 필요한 매개 변수입니다. Windows 2000 이전 버전의 Windows NT 버스 master 디바이스는 NULL 어댑터 개체 포인터를 MapTransferFlushAdapterBuffers에 전달할 수 있습니다. Windows 2000 이상에서는 드라이버가 더 이상 이 작업을 수행할 수 없습니다.

KeFlushIoBuffersMmGetMdlVirtualAddress에는 Irp-MdlAddress>의 MDL에 대한 포인터가 필요합니다.

개별 드라이버는 각 드라이버가 디바이스를 서비스하기 위해 구현되는 방법에 따라 서로 다른 지점에서 이 일련의 지원 루틴을 호출합니다. 예를 들어 한 드라이버의 StartIo 루틴은 AllocateAdapterChannel을 호출할 수 있지만 다른 드라이버는 드라이버에서 만든 인터로크 큐 또는 디바이스 큐에서 IRP를 제거하는 루틴에서 이 호출을 수행할 수 있습니다.

이 섹션에 설명된 루틴을 사용하는 대신 패킷 기반 DMA를 사용하는 모든 드라이버는 디바이스에 기본 제공 분산/수집 지원이 있는지 여부에 관계없이 분산/수집 DMA를 간소화하기 위한 지원 루틴을 사용할 수 있습니다. 자세한 내용은 분산/DMA 수집 사용을 참조하세요.