Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’extension de framework SPB (SpbCx) prend en charge les séquences de transfert d’E/S. Une séquence de transfert d’E/S est un ensemble ordonné de transferts de bus (opérations de lecture et d’écriture) qui est effectué en tant qu’opération de bus atomique unique. Tous les transferts d’une séquence de transfert d’E/S accèdent au même appareil cible sur le bus. Pendant qu’une séquence est en cours d’exécution, aucun autre appareil du bus n’est accessible, même si le pilote du contrôleur SPB peut recevoir des demandes d’E/S pour d’autres appareils avant la fin de la séquence de transfert d’E/S.
Un exemple de séquence de transfert d’E/S est une opération d'écriture-lecture, qui est une opération d’écriture de bus suivie d’une opération de lecture de bus. Un pilote de périphérique périphérique client peut utiliser ce type de séquence pour écrire dans un registre de sélection de fonction dans un périphérique connecté à SPB, puis lire la valeur de la fonction d’appareil sélectionnée. Ces deux transferts peuvent être de longueurs différentes. Par exemple, l’opération d’écriture peut transférer un octet de données, et l’opération de lecture peut transférer de nombreux octets de données.
Types de séquences de transfert d’E/S
Un client peut lancer une séquence de transfert d’E/S de l’une des façons suivantes :
Le client peut spécifier l'intégralité de la séquence dans une requête de contrôle I/O IOCTL_SPB_EXECUTE_SEQUENCE. Cette demande permet au pilote du contrôleur SPB d’utiliser les optimisations de performances spécifiques au matériel disponibles pour effectuer la séquence de transfert. Pour plus d’informations, consultez Single-Request Séquences.
Le client peut envoyer une demande de contrôle d’E/S IOCTL_SPB_LOCK_CONTROLLER pour verrouiller le contrôleur au début d’une séquence et envoyer un IOCTL_SPB_UNLOCK_CONTROLLER une fois la séquence terminée. Pendant que le contrôleur est verrouillé, le client envoie une demande d’E/S distincte (IRP_MJ_READ ou IRP_MJ_WRITE) pour chaque opération de lecture ou d’écriture dans la séquence. Pour plus d’informations, consultez Client-Implemented Séquences.
Dans la mesure du possible, un client doit utiliser la demande de IOCTL_SPB_EXECUTE_SEQUENCE , ce qui est plus rapide, est moins sujette aux erreurs et diminue considérablement le temps pendant lequel d’autres clients sont verrouillés hors du bus. Toutefois, un client peut utiliser les requêtes IOCTL_SPB_LOCK_CONTROLLER et IOCTL_SPB_UNLOCK_CONTROLLER s’il doit examiner la valeur lue durant un transfert de la séquence avant de lancer un transfert ultérieur dans la séquence. Dans ce cas, une conception soignée est nécessaire pour éviter d’empêcher l'accès d’autres clients au bus plus longtemps que nécessaire, et un pilote périphérique mal conçu peut dégrader les performances globales du système.
séquences de Single-Request
Pour améliorer les performances, votre pilote de contrôleur SPB doit implémenter une fonction de rappel EvtSpbControllerIoSequence pour gérer les requêtes IOCTL_SPB_EXECUTE_SEQUENCE . Cette approche ajoute une certaine complexité au pilote du contrôleur SPB, mais évite de demander au client d’effectuer une séquence de transfert d’E/S sous la forme d’une série d’opérations de lecture et d’écriture individuelles alors que d’autres clients sont verrouillés hors du bus.
Remarque
L’implémentation d’une fonction EvtSpbControllerIoSequence est fortement recommandée et peut devenir une exigence pour Windows 8.
L’implémentation d’une séquence de transfert est similaire à celle d’une opération de lecture ou d’écriture simple, mais nécessite également des mises à jour de l’état stocké de l’opération de séquence entre les transferts individuels dans la séquence. Une fois le premier transfert terminé, le pilote du contrôleur SPB met à jour l’état de séquence pour sélectionner le transfert suivant dans la séquence. L’état de séquence est stocké dans le contexte de l’appareil et inclut le handle SPBREQUEST transmis au rappel EvtSpbControllerIoSequence . Le pilote du contrôleur SPB utilise ce handle pour obtenir les paramètres de mémoire tampon, de longueur, de direction et de position pour les transferts individuels dans la séquence. Pour plus d’informations sur l’obtention de ces paramètres, consultez SpbRequestGetTransferParameters.
Si le pilote du contrôleur SPB n’est pas en mesure d’effectuer l’opération de IOCTL_SPB_EXECUTE_SEQUENCE demandée, il termine la demande avec un code d’échec. Si une telle défaillance se produit, le client peut, en tant qu’option, verrouiller le bus, effectuer explicitement la séquence de transfert d’E/S en tant que série de demandes d’E/S simples, puis déverrouiller le bus. Pour plus d’informations, consultez Client-Implemented Séquences.
SpbCx effectue la vérification des paramètres sur les demandes IOCTL_SPB_XXX qu'il reçoit des pilotes de périphérique. Pour les requêtes IOCTL_SPB_EXECUTE_SEQUENCE , SpbCx rejette à la fois les séquences vides et les séquences qui contiennent des pointeurs de mémoire tampon NULL ou des mémoires tampons de longueur nulle.
Le pilote du contrôleur SPB doit vérifier que la longueur de chaque transfert dans une séquence ne dépasse pas la limite spécifiée par le pilote. Par exemple, l’exemple de pilote SkeletonI2C dans le Kit de pilotes Windows (WDK) échoue à une requête de IOCTL_SPB_EXECUTE_SEQUENCE qui spécifie un transfert dépassant 4 Ko octets et définit le code d’état de cette requête sur STATUS_INVALID_PARAMETER. Avant de lancer une opération de séquence pour une demande de IOCTL_SPB_EXECUTE_SEQUENCE , le pilote doit valider les paramètres de tous les transferts de la séquence pour vérifier que l’opération peut être correctement effectuée.
SpbCx ne précède jamais un rappel EvtSpbControllerIoSequence avec un rappel EvtSpbControllerLock , et il ne suit jamais un rappel EvtSpbControllerIoSequence avec un rappel EvtSpbControllerUnlock .
séquences de Client-Implemented
Un client d’un pilote de contrôleur SPB peut effectuer explicitement une séquence de transfert d’E/S en tant que série de lectures et d’écritures simples. Le client peut être un pilote en mode noyau ou un pilote en mode utilisateur qui contrôle un périphérique attaché au bus. Avant le premier transfert dans la séquence, le client envoie une demande IOCTL_SPB_LOCK_CONTROLLER à l’appareil cible pour empêcher tout accès de bus non lié entre les transferts de la séquence. Ensuite, le client envoie IRP_MJ_READ et IRP_MJ_WRITE demandes pour effectuer les transferts dans la séquence. Enfin, le client envoie une demande IOCTL_SPB_UNLOCK_CONTROLLER pour libérer le verrou.
Un client peut avoir besoin d’implémenter ce type de séquence de transfert d’E/S si un transfert ultérieur dans la séquence a une dépendance sur un transfert antérieur. Par exemple, la première lecture peut indiquer le nombre d’octets supplémentaires à lire ou écrire par la suite. Si aucune dépendance de ce type n’existe, toutefois, le client doit envoyer une demande de IOCTL_SPB_EXECUTE_SEQUENCE au pilote du contrôleur SPB, ce qui peut effectuer la séquence plus efficacement.
Entre la requête IOCTL_SPB_LOCK_CONTROLLER qui démarre une séquence implémentée par le client et la requête IOCTL_SPB_UNLOCK_CONTROLLER qui met fin à la séquence, les seules demandes d’E/S que le client peut envoyer à l’appareil cible sont IRP_MJ_READ et IRP_MJ_WRITE demandes. Toute violation de cette règle est une erreur.
Les verrous SPB sont utilisés uniquement pour garantir qu’une séquence de lectures et d’écritures est effectuée en tant qu’opération de bus atomique et doit être utilisée exclusivement à cet effet.
Pour plus d’informations, consultez Gestion des séquences Client-Implemented.