Gestion des méthodes d’accès aux tampons dans les pilotes UMDF
Si vous écrivez un pilote UMDF, vous pouvez spécifier des préférences pour la méthode d’accès à la mémoire tampon que l’infrastructure utilise pour les demandes de lecture et d’écriture, ainsi que pour les demandes de contrôle d’E/S d’appareil. Les valeurs qu’un pilote UMDF fournit sont uniquement des préférences et ne sont pas garanties pour être utilisées par l’infrastructure.
- Spécification d’une méthode d’accès à la mémoire tampon par défaut
- Récupération de la méthode Access pour une demande d’E/S
- Conversion d’E/S en mémoire tampon ni d’E/S directes
Spécification d’une méthode d’accès à la mémoire tampon par défaut
À compter d’UMDF version 2.0, un pilote UMDF appelle WdfDeviceInitSetIoTypeEx pour inscrire les méthodes d’accès préférées pour les demandes de lecture/écriture et pour les demandes de contrôle d’E/S d’appareil.
Si le pilote n’appelle pas WdfDeviceInitSetIoTypeExEx, UMDF utilise la méthode mise en mémoire tampon pour les demandes d’E/S sur cet appareil.
L’infrastructure utilise les règles suivantes pour déterminer la méthode d’accès à utiliser :
Tous les pilotes UMDF d’une pile de pilotes doivent utiliser la même méthode pour accéder aux mémoires tampons d’un appareil, et l’infrastructure privilégie les E/S mises en mémoire tampon.
Si UMDF détermine que certains pilotes préfèrent les E/S mises en mémoire tampon ou les E/S directes pour un appareil, tandis que d’autres pilotes préfèrent uniquement les E/S mises en mémoire tampon pour l’appareil, UMDF utilise les E/S mises en mémoire tampon pour tous les pilotes. Si un ou plusieurs pilotes d’une pile préfèrent uniquement les E/S mises en mémoire tampon tandis que d’autres préfèrent uniquement les E/S directes, UMDF consigne un événement dans le journal des événements système et ne démarre pas la pile de pilotes.
Votre pilote peut appeler WdfDeviceGetDeviceStackIoType pour déterminer les méthodes d’accès à la mémoire tampon qu’UMDF a attribuées aux demandes de lecture/écriture et aux demandes de contrôle d’E/S d’un appareil.
Dans certains cas, UMDF affecte des E/S directes à un appareil, mais pour des performances optimales, utilise les E/S mises en mémoire tampon pour une ou plusieurs des demandes de l’appareil. Par exemple, UMDF utilise les E/S mises en mémoire tampon pour les petites mémoires tampons s’il peut copier les données dans la mémoire tampon du pilote plus rapidement qu’il ne peut mapper les mémoires tampons pour un accès direct.
Si vous le souhaitez, votre pilote peut fournir une valeur DirectTransferThreshold lorsqu’il appelle WdfDeviceInitSetIoTypeEx. L’infrastructure utilise cette valeur pour déterminer la plus petite taille de mémoire tampon pour laquelle l’infrastructure utilisera les E/S directes. En règle générale, vous n’avez pas besoin de fournir cette valeur, car l’infrastructure utilise des paramètres qui fournissent les meilleures performances.
UMDF utilise les E/S directes uniquement pour l’espace tampon qui commence et se termine sur une limite de page mémoire. Si le début ou la fin d’une mémoire tampon ne se trouve pas sur une limite de page, UMDF utilise des E/S mises en mémoire tampon pour cette partie de la mémoire tampon. En d’autres termes, UMDF peut utiliser à la fois les E/S mises en mémoire tampon et les E/S directes pour un transfert de données volumineux qui se compose de plusieurs demandes d’E/S.
Pour les demandes de contrôle d’E/S d’appareil, UMDF utilise les E/S directes uniquement si le code de contrôle d’E/S (IOCTL) spécifie les E/S directes et uniquement si tous les pilotes UMDF de cet appareil ont appelé WdfDeviceInitSetIoTypeEx pour spécifier la méthode d’accès direct.
Récupération de la méthode Access pour une demande d’E/S
Les pilotes utilisent le même ensemble de méthodes d’objet de requête pour accéder aux mémoires tampons de données, quelle que soit la méthode d’accès à la mémoire tampon. Par conséquent, la plupart des pilotes n’ont généralement pas besoin de savoir si UMDF utilise des E/S mises en mémoire tampon ou des E/S directes pour une demande d’E/S.
Dans certains cas, vous pouvez améliorer les performances d’un pilote si vous connaissez la méthode d’accès pour une demande d’E/S. Par exemple, considérez un appareil à haut débit qui utilise généralement des E/S directes. Lorsque le pilote reçoit une demande d’E/S, il copie les données de l’espace de mémoire tampon partagé dans la mémoire du pilote local pour validation.
Toutefois, le pilote peut parfois recevoir une mémoire tampon qui utilise des E/S mises en mémoire tampon. Étant donné que le gestionnaire d’E/S a déjà copié ces données dans une mémoire tampon intermédiaire, le pilote n’a pas besoin de copier les paramètres localement. En évitant l’opération de copie, le pilote améliore les performances.
Un pilote UMDF appelle WdfRequestGetEffectiveIoType pour obtenir la méthode d’accès à la mémoire tampon d’une demande d’E/S. Comme décrit ci-dessus, le type d’E/S d’une demande spécifique peut différer des paramètres de type d’E/S attribués par l’infrastructure pour un appareil.
Conversion d’E/S en mémoire tampon ni d’E/S directes
Un pilote UMDF ne peut pas utiliser la méthode « ni l’un ni l’autre ».
Toutefois, les définitions de certains codes de contrôle d’E/S d’appareil (IOCTL) spécifient que les requêtes utilisent la méthode « ni l’un ni l’autre ». Si vous le souhaitez, un pilote UMDF peut convertir la méthode d’accès à la mémoire tampon de telles demandes de contrôle d’E/S d’appareil en E/S en mémoire tampon ou en E/S directes. Utiliser les étapes suivantes :
Incluez la directive UmdfMethodNeitherAction dans une section INF DDInstall du fichier INF de votre pilote. Vous pouvez définir la valeur de la directive pour indiquer qu’UMDF doit passer les demandes de contrôle d’E/S d’appareil qui utilisent la méthode d’accès « ni » au pilote. (Sinon, UMDF effectue ces demandes d’E/S avec une erreur status valeur.)
Accédez aux mémoires tampons de la demande d’E/S à l’aide des méthodes d’objet fournies par UMDF pour les E/S mises en mémoire tampon ou les E/S directes.
Vous devez activer la prise en charge des demandes IOCTL qui utilisent la méthode « ni l’un ni l’autre » uniquement si vous êtes sûr qu’UMDF peut convertir la méthode d’accès en E/S mises en mémoire tampon ou en E/S directes. Par exemple, si le IOCTL spécifie une demande personnalisée qui ne suit pas les règles de spécification de mémoire tampon décrites dans Descriptions de mémoire tampon pour les codes de contrôle d’E/S, UMDF ne peut pas convertir les mémoires tampons.