Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V některých platformách vykazuje procesor a systémový řadič DMA (nebo adaptéry DMA hlavní sběrnice) anomálie koherence mezipaměti. Následující pokyny umožňují ovladačům, které používají verzi 1 nebo 2 operačního rozhraní DMA (viz DMA_OPERATIONS), aby zachovaly konzistentní stavy mezipaměti ve všech podporovaných architekturách procesorů, včetně architektur, které neobsahují hardware pro automatické vynucení kompatibility mezipaměti.
Poznámka Pokyny v tomto tématu platí pouze pro ovladače, které používají verze 1 a 2 operačního rozhraní DMA. Ovladače, které používají verzi 3 tohoto rozhraní, musí dodržovat jinou sadu pokynů. Další informace naleznete ve verzi 3 operačního rozhraní DMA.
Aby se zachovala integrita dat během operací DMA, musí ovladače nejnižší úrovně dodržovat tyto pokyny.
Před zahájením operace přenosu volejte KeFlushIoBuffers , abyste zachovali konzistenci mezi daty, která mohou být uložena v mezipaměti procesoru a dat v paměti.
Pokud ovladač volá AllocateCommonBuffer s parametrem CacheEnabled nastaveným na TRUE, ovladač musí před zahájením operace přenosu do/z vyrovnávací paměti volat KeFlushIoBuffers .
Zavolejte FlushAdapterBuffers na konci každé operace přenosu zařízení, abyste měli jistotu, že všechny zbývající bajty ve vyrovnávací paměti řadiče DMA systému byly zapsány do paměti nebo do podřízeného zařízení.
Nebo zavolejte FlushAdapterBuffers na konci každé operace přenosu pro danou IRP, abyste měli jistotu, že všechna data byla načtena do systémové paměti nebo zapsána do hlavního zařízení DMA sběrnice.
Následující obrázek ukazuje, proč je důležité vyprázdnit mezipaměť procesoru před operací čtení nebo zápisu pomocí DMA, pokud hostitelský procesor a řadič DMA automaticky neudržujíhernost mezipaměti.
Asynchronní operace čtení nebo zápisu DMA přistupuje k datům v paměti, ne v mezipaměti procesoru. Pokud není tato mezipaměť vyprázdněna voláním KeFlushIoBuffers těsně před čtením, data přenášená do systémové paměti operací DMA může být přepsána zastaralými daty, pokud je mezipaměť procesoru vyprázdněna později. Pokud mezipaměť procesoru není vyprázdněna voláním KeFlushIoBuffers těsně před zápisem, mohou být data v této mezipaměti více up-to-date než kopie v paměti.
KeFlushIoBuffers neprovede žádnou akci, pokud se procesor a řadič DMA můžou spoléhat na zachování koherence cache, takže volání této podpůrné rutiny nemají téměř žádnou režii na takovéto technologii.
Jak je vidět také na předchozím obrázku, řadiče DMA, které jsou reprezentovány jako objekty adaptérů, mohou mít interní buffery. Takový řadič DMA může přenášet data uložená v blocích s pevnou velikostí, obvykle osm nebo více bajtů najednou. Kromě toho mohou tyto řadiče DMA čekat, až se jejich vnitřní vyrovnávací paměti zaplní před každou operací přenosu.
Vezměte v úvahu případ ovladače nejnižší úrovně, který používá podřízené DMA ke čtení dat v blocích s proměnlivou velikostí nebo v blocích s pevnou velikostí, které nejsou nedílnou násobkem velikosti mezipaměti řadiče DMA systému. Pokud tento ovladač nevolá FlushAdapterBuffers na konci každého přenosu zařízení, není jisté, kdy bude každý ovladačem požadovaný bajt skutečně přenesen.
Ovladač zařízení DMA hlavní sběrnice by měl také na konci každé operace přenosu v rámci IRP volat FlushAdapterBuffers, aby bylo zajištěno, že všechna data byla přenesena do systémové paměti nebo ven do zařízení.
FlushAdapterBuffers vrátí logickou hodnotu, která označuje, jestli byla požadovaná operace vyprázdnění úspěšná. Ovladač může tuto hodnotu použít k určení, jak nastavit vstupně-výstupní stavový blok při dokončení protokolu IRP pro operaci čtení nebo zápisu DMA.