Udostępnij przez


Używanie bezpośredniego we/wy z DMA

Na poniższej ilustracji pokazano, jak menedżer we/wy konfiguruje żądanie IRP_MJ_READ dla operacji transferu DMA, która używa bezpośredniego we/wy.

Diagram ilustrujący bezpośrednie we/wy w buforach użytkownika dla urządzeń korzystających z DMA.

Na poprzedniej ilustracji pokazano, w jaki sposób sterowniki mogą używać protokołu MdlAddress protokołu IRP do transferu danych dla żądania odczytu. Sterownik na rysunku używa systemu opartego na pakietach lub DMA magistrali i zastosował operację OR na flagi obiektu urządzenia z DO_DIRECT_IO.

  1. Niektóra część adresów wirtualnych przestrzeni użytkownika reprezentuje bufor bieżącego wątku, a zawartość tego bufora może być faktycznie przechowywana na pewnej liczbie fizycznie nieciągłych stron (ciemne cieniowanie na poprzedniej ilustracji). Menedżer I/O tworzy MDL, aby opisać ten bufor. MDL to nieprzezroczysta struktura danych zdefiniowana przez menedżera pamięci, która mapuje określony zakres adresów wirtualnych na jeden lub więcej zakresów adresów fizycznych opartych na stronach. Aby uzyskać więcej informacji, sprawdź Korzystanie z MDL.

  2. Menedżer I/O obsługuje żądanie odczytu bieżącego wątku, w którym wątek przekazuje zakres wirtualnych adresów przestrzeni użytkownika, reprezentujących bufor.

  3. Menedżer we/wy lub sterownik systemu plików (FSD) sprawdza bufor dostarczony przez użytkownika pod kątem dostępności i wywołuje MmProbeAndLockPages z wcześniej utworzonym MDL. MmProbeAndLockPages wypełnia również odpowiedni zakres adresów fizycznych w MDL.

    Jak pokazano na poprzedniej ilustracji, MDL dla zakresu wirtualnego może zawierać kilka odpowiednich wpisów adresów fizycznych opartych na stronach, a zakres wirtualny bufora może zaczynać się i kończyć na pewnym przesunięciu bajtowym od początku pierwszych i ostatnich stron opisanych w MDL.

  4. Menedżer we/wy udostępnia wskaźnik do MDL (MdlAddress) w IRP, które żąda operacji transferu danych. Dopóki menedżer we/wy lub system plików nie wywoła MmUnlockPages po ukończeniu IRP, strony fizyczne opisane w MDL pozostają zablokowane i przypisane do buforu. Jednak adresy wirtualne w takim MDL mogą stać się niewidoczne (i nieprawidłowe), nawet zanim pakiet IRP zostanie wysłany do sterownika urządzenia lub do jakiegokolwiek pośredniego sterownika, który może być umieszczony powyżej sterownika urządzenia.

  5. Jeśli sterownik używa systemu opartego na pakietach lub magistrali nadrzędnej DMA, jego procedura AdapterControl wywołuje MmGetMdlVirtualAddress z wskaźnikiem MdlAddress pakietu IRP, aby uzyskać podstawowy adres wirtualny dla wpisów opartych na stronach MDL.

  6. Następnie rutyna AdapterControl wywołuje funkcję MapTransfer przy użyciu adresu podstawowego zwróconego przez funkcję MmGetMdlVirtualAddress, aby odczytać dane z urządzenia bezpośrednio do pamięci fizycznej. (Aby uzyskać więcej informacji, zobacz Adapter Objects and DMA(Obiekty adaptera i DMA).

Sterowniki powinny zawsze sprawdzać długość buforu. Zwróć uwagę, że menedżer we/wy nie tworzy MDL dla buforu o zerowej długości.