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, FlushAdapterBuffers 및 FreeMapRegisters에 필요한 매개 변수입니다. Windows 2000 이전 버전의 Windows NT 버스 master 디바이스는 NULL 어댑터 개체 포인터를 MapTransfer 및 FlushAdapterBuffers에 전달할 수 있습니다. Windows 2000 이상에서는 드라이버가 더 이상 이 작업을 수행할 수 없습니다.
KeFlushIoBuffers 및 MmGetMdlVirtualAddress에는 Irp-MdlAddress>의 MDL에 대한 포인터가 필요합니다.
개별 드라이버는 각 드라이버가 디바이스를 서비스하기 위해 구현되는 방법에 따라 서로 다른 지점에서 이 일련의 지원 루틴을 호출합니다. 예를 들어 한 드라이버의 StartIo 루틴은 AllocateAdapterChannel을 호출할 수 있지만 다른 드라이버는 드라이버에서 만든 인터로크 큐 또는 디바이스 큐에서 IRP를 제거하는 루틴에서 이 호출을 수행할 수 있습니다.
이 섹션에 설명된 루틴을 사용하는 대신 패킷 기반 DMA를 사용하는 모든 드라이버는 디바이스에 기본 제공 분산/수집 지원이 있는지 여부에 관계없이 분산/수집 DMA를 간소화하기 위한 지원 루틴을 사용할 수 있습니다. 자세한 내용은 분산/DMA 수집 사용을 참조하세요.