Sdílet prostřednictvím


Použití vstupně-výstupních operací s bufferem

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:

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.

diagram znázorňující vyrovnávané I/O pro uživatelské vyrovnávací paměti.

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.

  1. 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).

  2. 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ěť.

  3. 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.

  4. 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.

  5. 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.

  6. 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í.