Udostępnij przez


Korzystanie z pakietowej magistrali Bus-Master DMA

Aby korzystać z DMA opartej na pakietach, sterowniki urządzeń DMA bus-master wywołują następującą ogólną sekwencję procedur pomocniczych podczas przetwarzania IRP żądającego transferu DMA.

  • KeFlushIoBuffers tuż przed podjęciem próby przydzielenia rejestrów map dla żądania przeniesienia (aby uzyskać więcej informacji, zobacz Utrzymywanie spójności pamięci podręcznej)

  • AllocateAdapterChannel, gdy sterownik jest gotowy do zaprogramowania adaptera magistrali głównej dla DMA

  • MmGetMdlVirtualAddress w celu uzyskania indeksu do MDL, wymaganego jako parametru początkowego dla MapTransfer, a MapTransfer do udostępnienia fizycznej pamięci systemu, która obsługuje bufor IRP dla dostępu urządzenia.

    Należy pamiętać, że każdy sterownik może wymagać wykonania więcej niż jednej operacji transferu w celu spełnienia wymagań bieżącego IRP, zgodnie z wyjaśnieniem w Splitting Transfer Requests. Sterowniki urządzeń, które nie mają funkcji rozproszenia/zebrania, mogą wywoływać MapTransfer raz na operację transferu. Sterowniki urządzeń, które mają możliwości scatter/gather, mogą wywoływać MapTransfer więcej niż raz, aby skonfigurować każdą operację transferu. Alternatywnie te sterowniki mogą używać wbudowanej obsługi scatter/gather systemu, opisanej w Używanie Scatter/Gather DMA.

  • FlushAdapterBuffers na końcu każdej operacji transferu DMA do/z urządzenia docelowego, aby określić, czy wszystkie żądane dane zostały całkowicie przeniesione

  • FreeMapRegisters natychmiast po zakończeniu wszystkich operacji DMA dla bieżącego IRP, ponieważ wszystkie żądane dane zostały całkowicie przeniesione lub sterownik musi przerwać IRP z powodu błędu we/wy urządzenia lub magistrali

Wskaźnik obiektu adaptera zwracany przez IoGetDmaAdapter jest wymaganym parametrem PrzydzielAdapterChannel, MapTransfer, FlushAdapterBuffers i FreeMapRegisters. Należy pamiętać, że w wersjach systemu Windows NT wcześniejszych niż Windows 2000 urządzenia magistrali głównej mogły przekazać wskaźnik obiektu karty NULL do MapTransfer i FlushAdapterBuffers. W systemie Windows 2000 lub nowszym sterowniki nie mogą już tego robić.

KeFlushIoBuffers i MmGetMdlVirtualAddress wymagają wskaźnika do MDL pod adresem Irp-MdlAddress>.

Poszczególne sterowniki wywołują tę sekwencję routin pomocniczych w różnych momentach, w zależności od tego, jak każdy sterownik jest zaimplementowany z myślą o obsłudze swojego urządzenia. Na przykład rutyna StartIo jednego sterownika może wywołać AllocateAdapterChannel, podczas gdy inny sterownik może dokonać tego wywołania z rutyny, która usuwa żądania IRP z kolejki połączonej lub kolejki urządzeń utworzonej przez sterownik.

Zamiast używać procedur opisanych w tej sekcji, każdy sterownik korzystający z DMA opartego na pakietach może używać procedur wsparcia przeznaczonych do usprawnienia rozproszenia/zebrania DMA, niezależnie od tego, czy jego urządzenie ma wbudowaną obsługę rozproszenia/zebrania. Aby uzyskać szczegółowe informacje, zobacz Using Scatter/Gather DMA.