Sdílet prostřednictvím


Jak odeslat zřetězené struktury MDL

Tento článek popisuje schopnosti zřetězených MDL ve vrstvě ovladače USB a způsob, jak klientský ovladač může odeslat přenosový buffer jako řetěz struktur MDL.

Většina řadičů hostitele USB vyžaduje, aby přenosová vyrovnávací paměť byla prakticky souvislá. Prakticky souvislý znamená, že vyrovnávací paměť může začínat a končit kdekoli na stránce, ale zbytek vyrovnávací paměti musí začínat a končit na hranici stránky. Mnoho klientských ovladačů USB dokáže tento požadavek splnit. U některých klientských ovladačů, zejména těch, které potřebují přidat nebo odebrat další data do nebo z vyrovnávací paměti, není přidělení virtuálně souvislé paměti pro přenosovou vyrovnávací paměť preferováno.

Představte si například sadu sítí se třemi ovladači, ovladačem síťového protokolu, zprostředkujícím ovladačem a miniportovým ovladačem. Ovladač protokolu zahájí přenos a odešle paket dalšímu ovladači v zásobníku: mezilehlému ovladači. Zprostředkující ovladač chce do paketu přidat vlastní hlavičku (obsaženou v samostatném bloku paměti). Zprostředkující ovladač odesílá hlavičku a přijatý paket dalšímu ovladači v zásobníku, kterým je ovladač miniportu. Rozhraní ovladače miniportu spolupracuje se zásobníkem USB ovladačů a proto musí připravit téměř souvislou přenosovou vyrovnávací paměť. Pokud chcete vytvořit takovou vyrovnávací paměť, ovladač miniportu přidělí velkou vyrovnávací paměť, přidá vlastní hlavičku a následně zkopíruje datovou část. Vzhledem k tomu, že datová část je obvykle velká, může kopírování celé datové části mít významný dopad na výkon.

Klientský ovladač může tento dopad na výkon překonat odesláním vyrovnávací paměti jako řetězce seznamu popisovačů paměti (MDL). Nový zásobník ovladačů USB ve Windows 8 umožňuje přijmout zřetězený MDL (viz MDL) z klientského ovladače. Díky poskytnutí zřetězeného MDL může klientský ovladač odkazovat na nesouvislé stránky v paměti místo provádění nadbytečných operací kopírování. Tato funkce odebere omezení počtu, velikosti a zarovnání vyrovnávacích pamětí, což umožňuje segmentovat přenosovou vyrovnávací paměť ve fyzické paměti.

Aby bylo možné používat zřetězené MDL, musí klientský ovladač zjistit, zda základní zásobník ovladačů USB načtený systémem Windows podporuje tuto funkci, a pak vytvořit řetězec MDL ve správném pořadí.

Než začnete

Zřetězená funkce MDL je podporována pouze pro hromadné, izochronní a přerušované přenosy. Než se dotážete na zřetězenou schopnost MDL, ujistěte se, že váš klientský ovladač má úchyt USBD pro registraci ovladače se sadou ovladačů USB. Pokud chcete vytvořit popisovač USBD, zavolejte USBD_CreateHandle. Klientský ovladač obvykle vytvoří popisovač USBD ve své rutině AddDevice.

V obslužné rutině IRP_MN_START_DEVICE klientského ovladače nebo kdykoli později můžete zadat dotaz na řetězenou schopnost MDL. Klientský ovladač se nesmí dotazovat na tuto funkci v rutině AddDevice .

Instrukce

  1. Volejte rutinu USBD_QueryUsbCapability, abyste zjistili, jestli zásobník ovladačů USB podporuje schopnost propojených MDLů. Pokud chcete zadat dotaz na tuto schopnost, zadejte jako identifikátor GUID usbCapabilityChainedMdls. Nastavte outputBuffer parametr na NULL a OutputBufferSize parametr na 0.

  2. Zkontrolujte hodnotu NTSTATUS vrácenou USBD_QueryUsbCapability a vyhodnoťte výsledek. Pokud se rutina úspěšně dokončí, je podporována funkce zřetězených MDL. Jakákoli jiná hodnota značí, že funkce není podporovaná.

  3. Vytvořte řetězec MDLs. Každý MDL má ukazatel Další , který odkazuje na jiný MDL.

    Ovladač může sestavit řetěz MDL ručním nastavením ukazatele Next.

    V předchozím příkladu ovladač protokolu odešle paket jako MDL. Zprostředkující ovladač může vytvořit další MDL, který odkazuje na blok paměti obsahující data záhlaví. Pokud chcete vytvořit řetěz, může zprostředkující ovladač nasměrovat ukazatel Next hlavičkového MDL na ukazatel MDL přijatý z ovladače protokolu. Mezičasový ovladač pak může předat řetězec dvou MDL k ovladači miniportu, který poskytuje odkaz na zřetězený MDL v URB pro požadavek a odešle požadavek do stohu ovladačů USB. Další informace najdete v tématu Použití MDLs.

  4. Při vytváření URB pro vstupně-výstupní požadavek, který používá zřetězený seznam MDLs, nastavte člen transferBufferMDL přidružené struktury URB (například _URB_BULK_OR_INTERRUPT_TRANSFER nebo _URB_ISOCH_TRANSFER) na první MDL v řetězci a nastavte TransferBufferLength na celkový počet bajtů, které se mají přenést. Data mohou zahrnovat více než jednu položku MDL v řetězci MDL.

    Ve Windows 8 byly přidány dva nové typy funkcí URB, které umožňují klientskému ovladači používat zřetězený seznam MDL pro přenos dat. Pokud chcete tuto funkci použít, ujistěte se, že je člen funkce hlavičky URB nastavený na jednu z následujících funkcí URB:

    • URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDL
    • URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL

    Informace o těchto funkcích URB najdete v tématu _URB_HEADER.

Poznámky

Příklad kódu, který se dotazuje podkladového zásobníku ovladačů USB, abyste zjistili, jestli zásobník ovladačů může přijímat zřetězený kód MDL, najdete v tématu USBD_QueryUsbCapability.