패킷 기반 시스템 DMA 사용
패킷 기반 DMA를 사용하는 하위 디바이스의 드라이버는 DMA 전송을 요청하는 IRP를 처리할 때 다음과 같은 일반 지원 루틴 시퀀스를 호출합니다.
시스템 DMA 컨트롤러 할당을 시도하기 직전에 KeFlushIoBuffers(자세한 내용은 캐시 일관성 유지 관리 참조)
드라이버가 DMA용 디바이스를 프로그래밍할 준비가 되었으며 시스템 DMA 컨트롤러가 필요한 경우 AllocateAdapterChannel
AllocateAdapterChannel은 드라이버의 AdapterControl 루틴을 호출합니다.
MdL에 인덱스를 가져오는 MmGetMdlVirtualAddress 입니다. MapTransfer에 대한 초기 호출 에서 매개 변수로 필요합니다.
전송 작업을 위해 시스템 DMA 컨트롤러를 프로그래밍하는 MapTransfer
드라이버는 전송 요청 분할에 설명된 대로 요청된 모든 데이터를 전송하기 위해 MapTransfer를 두 번 이상 호출해야 할 수 있습니다.
각 DMA 전송 작업 직후의 FlushAdapterBuffers 는 하위 디바이스 간에 전송합니다.
드라이버가 요청된 모든 데이터를 전송하기 위해 MapTransfer를 두 번 이상 호출해야 하는 경우 MapTransfer를 호출하는 횟수만큼 FlushAdapterBuffers를 호출해야 합니다.
요청된 모든 데이터가 전송되는 즉시 또는 디바이스 I/O 오류로 인해 드라이버가 IRP에 실패하는 경우 FreeAdapterChannel
IoGetDmaAdapter에서 반환된 어댑터 개체 포인터는 Irp-MdlAddress>에 전달된 MDL에 대한 포인터가 필요한 KeFlushIoBuffers 및 MmGetMdlVirtualAddress를 제외한 이러한 각 루틴에 필요한 매개 변수입니다.
개별 드라이버는 각 드라이버가 디바이스를 서비스하기 위해 구현되는 방법에 따라 서로 다른 지점에서 이 일련의 지원 루틴을 호출합니다. 예를 들어 한 드라이버의 StartIo 루틴이 AllocateAdapterChannel을 호출할 수 있고, 다른 드라이버는 드라이버가 만든 연동 큐에서 IRP를 제거하는 루틴에서 이 호출을 수행할 수 있으며, 다른 드라이버는 하위 DMA 디바이스가 데이터를 전송할 준비가 되었음을 나타낼 때 이 호출을 수행할 수 있습니다.