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.
Ovladač, který obsluhuje interaktivní nebo pomalé zařízení, nebo který obvykle přenáší relativně malé objemy dat, by měl použít metodu přenosu ve vyrovnávací paměti pro vstupně-výstupní operace. Použití vstupně-výstupních operací ve vyrovnávací paměti pro malé interaktivní přenosy zlepšuje celkové využití fyzické paměti, protože správce paměti nemusí pro každý přenos uzamknout celou fyzickou stránku, stejně jako u ovladačů, které vyžadují přímé vstupně-výstupní operace. Obecně platí, že video, klávesnice, myš, sériové a paralelní ovladače požadují vstupně-výstupní operace ve vyrovnávací paměti.
Správce vstupně-výstupních operací určuje, že vstupně-výstupní operace používá vyrovnávací paměť následujícím způsobem:
Pro požadavky IRP_MJ_READ a IRP_MJ_WRITE je DO_BUFFERED_IO nastavena v Příznaky člen struktury DEVICE_OBJECT. Další informace najdete v tématu Inicializace objektu zařízení.
Pro požadavky IRP_MJ_DEVICE_CONTROL a IRP_MJ_INTERNAL_DEVICE_CONTROL obsahuje hodnota kódu IOCTL METHOD_BUFFERED jako hodnotu TransferType v hodnotě IOCTL. Další informace najdete v tématu Definování kódů ovládacích prvků vstupně-výstupních operací.
Následující obrázek znázorňuje, jak správce vstupně-výstupních operací nastaví požadavek IRP_MJ_READ na operaci přenosu, která používá vyrovnávací paměť pro I/O.
Obrázek ukazuje přehled o tom, jak mohou ovladače používat ukazatel SystemBuffer v IRP k přenosu dat pro žádost o čtení, pokud ovladač zkombinoval příznaky objektu zařízení s DO_BUFFERED_IO pomocí operace OR.
Některé rozsahy virtuálních adres uživatelského prostoru představují vyrovnávací paměť aktuálního vlákna a obsah této vyrovnávací paměti může být uložen někde v rozsahu fyzických adres založených na stránce (tmavé stínování na předchozím obrázku).
Správce vstupů/výstupů (I/O) zpracovává požadavek aktuálního vlákna na čtení, přičemž vlákno předává rozsah virtuálních adres uživatelského prostoru, které představují vyrovnávací paměť.
Správce vstupně-výstupních operací zkontroluje, zda je uživatelsky dodaná vyrovnávací paměť přístupná, a zavolá funkci ExAllocatePoolWithTag k vytvoření nestránkové vyrovnávací paměti systémového prostoru (SystemBuffer) o velikosti uživatelsky dodané vyrovnávací paměti.
Správce vstupně-výstupních operací poskytuje přístup k nově přidělenému SystemBuffer v protokolu IRP, který odesílá ovladači.
Pokud se na obrázku zobrazila žádost o zápis, správce vstupně-výstupních operací zkopíruje data z vyrovnávací paměti uživatele do systémové vyrovnávací paměti před odesláním protokolu IRP do ovladače.
V případě požadavku na čtení zobrazeného na předchozím obrázku ovladač načte data ze zařízení do vyrovnávací paměti systémového prostoru. Paměť pro tuto vyrovnávací paměť není poškozena a ovladač může bezpečně přistupovat k vyrovnávací paměti bez prvního uzamčení. Jakmile bude žádost o čtení splněna, ovladač zavolá IoCompleteRequest s IRP.
Když je původní vlákno znovu aktivní, správce vstupně-výstupních operací zkopíruje data pro čtení ze systémové vyrovnávací paměti do vyrovnávací paměti uživatele. Volá také ExFreePool k uvolnění systémové vyrovnávací paměti.
Jakmile správce vstupně-výstupních operací vytvoří vyrovnávací paměť systémového prostoru pro ovladač, může být vlákno v uživatelském režimu vyměněno a jeho fyzická paměť může být znovu použita jiným vláknem, a to i vláknerem patřícím jinému procesu. Rozsah virtuálních adres v systémovém prostoru zadaný v protokolu IRP však zůstane platný, dokud ovladač nevyvolá IoCompleteRequest s protokolem IRP.
Ovladače, které přenášejí velké objemy dat současně, zejména ovladače, které provádějí přenosy s více stránkami, by se neměly pokoušet používat bufferované I/O. Při spuštění systému se nestránkový fond může fragmentovat, takže správce vstupně-výstupních operací nemůže přidělit velké, souvislé vyrovnávací paměti prostoru systému pro odeslání v IRPs pro takový ovladač.
Ovladač obvykle používá vyrovnávací vstupně-výstupní operace pro některé typy IRP, jako jsou IRP_MJ_DEVICE_CONTROL žádosti, i když také používá přímé vstupně-výstupní. Ovladače, které používají přímé vstupně-výstupní operace, obvykle to dělají pouze pro požadavky IRP_MJ_READ a IRP_MJ_WRITE a případně požadavky definované ovladačem IRP_MJ_INTERNAL_DEVICE_CONTROL, které vyžadují velké přenosy dat.
Každý požadavek IRP_MJ_DEVICE_CONTROL a IRP_MJ_INTERNAL_DEVICE_CONTROL obsahuje kód pro řízení vstupně-výstupních operací. Pokud řídicí kód I/O označuje, že IRP musí být podporován pomocí vyrovnávacího I/O, správce I/O používá jednu systémovou vyrovnávací paměť k zastoupení vstupních a výstupních vyrovnávacích pamětí uživatelské aplikace. Ovladač, který podporuje takový kód řízení vstupně-výstupních operací, musí číst vstupní data (pokud existuje) z vyrovnávací paměti a pak zadat výstupní data (pokud existuje) přepsáním vstupních dat. Další informace najdete v tématu Definování kódů ovládacích prvků vstupně-výstupních operací.