Udostępnij przez


Korzystanie z Common-Buffer Bus-Master DMA

Zgodnie z opisem w artykule Using Bus-Master DMA (Używanie Bus-Master DMA) niektóre sterowniki dla urządzeń DMA magistrali głównej korzystają wyłącznie ze wspólnego buforu DMA, a niektóre używają wspólnego buforu DMA w połączeniu z dmA opartym na pakietach.

Ekonomiczne używanie wspólnego buforu DMA. Skonfigurowanie powszechnego bufora może wiązać niektóre (lub wszystkie, w zależności od rozmiaru żądanego bufora) rejestry mapujące skojarzone z obiektem adaptera, który reprezentuje adapter magistrali-bussa.

Ekonomiczne konfigurowanie wspólnych obszarów buforu, takich jak używanie fragmentów PAGE_SIZE lub pojedynczej alokacji, pozostawia więcej rejestrów map dostępnych dla operacji DMA opartych na pakietach. Pozostawia również więcej wolnego pamięci systemowej do innych celów, co zapewnia lepszą ogólną wydajność sterownika i systemu.

Aby skonfigurować wspólny bufor dla DMA magistrali master, sterownik urządzenia magistrali master DMA musi wywołać AllocateCommonBuffer z wskaźnikiem obiektu adaptera zwróconym przez IoGetDmaAdapter. Zazwyczaj sterownik wykonuje to wywołanie z procedury DispatchPnP dla żądań IRP_MN_START_DEVICE . Sterownik powinien przydzielić wspólny bufor tylko wtedy, gdy wielokrotnie korzysta z buforu do operacji DMA, kiedy sterownik jest załadowany. Na poniższym diagramie przedstawiono takie wywołanie metody AllocateCommonBuffer.

diagram przedstawiający alokację wspólnego buforu dla magistrali master dma.

Żądany rozmiar buforu, pokazany na poprzednim diagramie jako LengthForBuffer, określa, ile rejestrów map należy użyć do zapewnienia mapowania wirtualnego do logicznego dla wspólnego buforu. Użyj makra BYTES_TO_PAGES , aby określić maksymalną wymaganą liczbę stron (BYTES_TO_PAGES (LengthForBuffer)). Ta wartość nie może być większa niż NumberOfMapRegisters zwrócone przez IoGetDmaAdapter.

Ponadto obiekt wywołujący musi podać następujące elementy:

  • Wartość logiczna wskazująca, czy buforowanie powinno być włączone

    Uwaga Ta wartość jest ignorowana. System operacyjny określa, czy ma być włączona pamięć buforowana we wspólnym buforze, który ma zostać przydzielony. Ta decyzja jest oparta na architekturze procesora i magistrali urządzeń.

    Na komputerach z procesorami opartymi na x86, x64 i itanium pamięć buforowana jest włączona.

    Na komputerach z procesorami arm lub Arm 64 system operacyjny nie włącza automatycznie pamięci podręcznej dla wszystkich urządzeń. System opiera się na metodzie ACPI_CCA dla każdego urządzenia w celu określenia, czy urządzenie jest spójne z pamięcią podręczną.

  • Wskaźnik do zmiennej zdefiniowanej przez sterownik, która będzie zawierać podstawowy adres logiczny dostępny dla urządzenia dla buforu (BufferLogicalAddress na poprzednim diagramie) po powrocie z AllocateCommonBuffer

Jeśli wywołanie powiedzie się, funkcja AllocateCommonBuffer zwraca podstawowy adres wirtualny buforu dostępnego dla sterownika (BufferVirtualAddress na poprzednim diagramie), który sterownik musi zapisać w swoim rozszerzeniu urządzenia, rozszerzeniu kontrolera lub innym dostępnym dla sterowników obszarze magazynu rezydentnego (pula niestronicowana przydzielona przez sterownik).

Funkcja AllocateCommonBuffer zwraca wartość NULL , jeśli nie może przydzielić pamięci dla buforu. Jeśli zwracany podstawowy adres wirtualny ma wartość NULL, sterownik musi korzystać wyłącznie z obsługi DMA systemu opartej na pakietach lub musi odrzucić żądanie IRP_MN_START_DEVICE, zwracając STATUS_INSUFFICIENT_RESOURCES.

W przeciwnym razie sterownik może użyć przydzielonego wspólnego buforu jako obszaru magazynu dostępnego dla sterowników i adapterów na potrzeby transferów DMA.

Gdy menedżer PnP wysyła protokół IRP, który zatrzymuje lub usuwa urządzenie, sterownik musi wywołać freeCommonBuffer , aby zwolnić każdy wspólny bufor przydzielony.