Partager via


Verrous de connexion SPB

Les verrous de connexion sont utiles pour permettre à deux clients de partager l’accès à un périphérique cible sur un simple bus périphérique (SPB). Les deux clients peuvent ouvrir des connexions logiques au même appareil cible et utiliser le verrou de connexion lorsque l’un des clients nécessite un accès exclusif à l’appareil pour effectuer une série d’opérations d’E/S. Lorsqu’un client contient le verrou de connexion, les demandes du deuxième client pour accéder à l’appareil sont automatiquement différées jusqu’à ce que le premier client libère le verrou.

Un client utilise les demandes de IOCTL_SPB_LOCK_CONNECTION et de IOCTL_SPB_UNLOCK_CONNECTION pour acquérir et libérer le verrou de connexion sur un appareil cible sur un SPB. Un client envoie ces demandes de contrôle d’E/S (IOCTL) à l’objet de fichier de l’appareil.

Le pilote d’un périphérique connecté à SPB est généralement soit un pilote User-Mode (Driver Framework UMDF), soit un pilote Kernel-Mode (Driver Framework KMDF). Pour envoyer une demande IOCTL à un périphérique connecté à SPB, un pilote UMDF appelle une méthode telle que IWDFIoRequest ::Send. Un pilote KMDF appelle une méthode telle que WdfIoTargetSendIoctlSynchronously.

En règle générale, les verrous de connexion sont inutiles. La plupart des pilotes clients ont toujours un accès exclusif à un appareil cible sur un SPB. Un verrou de connexion est nécessaire uniquement dans le cas relativement rare dans lequel deux clients doivent partager l’accès au même appareil cible, et un ou les deux clients doivent parfois avoir un accès exclusif à l’appareil pour une série d’opérations d’E/S.

Par défaut, si deux clients partagent un appareil cible, l’extension de framework SPB (SpbCx) sérialise les demandes d’E/S pour l’appareil en fonction de l’ordre dans lequel ils arrivent dans la file d’attente de requêtes SpbCx. Le verrou de connexion remplace l’ordre par défaut des requêtes. Une fois qu’un client a acquis le verrou de connexion, SpbCx conserve les demandes d’E/S qu’il reçoit du deuxième client jusqu’à ce que le premier client libère le verrou.

Dans l’implémentation actuelle de SpbCx, l’utilisation principale des verrous de connexion consiste à permettre au pilote client d’un périphérique cible de partager l’accès à l’appareil avec le pilote ACPI, Acpi.sys. Acpi.sys est un pilote fourni par le système qui gère certains périphériques de ressources principales pour le compte du microprogramme ACPI pour la plateforme matérielle. Par exemple, une plateforme qui utilise un système sur une puce (SoC) peut également contenir un circuit intégré de gestion de l’alimentation (PMIC) accessible à la fois par Acpi.sys et un pilote client.

Un pilote client est chargé de déterminer s’il nécessite un verrou de connexion pour les opérations d’E/S nécessitant un accès exclusif à un appareil cible. Si un pilote nécessite des verrous de connexion dans certaines plateformes matérielles ou configurations de plateforme, mais pas dans d’autres, le développeur du pilote et le développeur de plateforme doivent accepter un mécanisme spécifique au pilote pour déterminer quand les verrous de connexion doivent être utilisés. En règle générale, des informations sur l’utilisation des verrous de connexion sont incluses dans le microprogramme de la plateforme. Par exemple, le bloc d’informations défini par le fournisseur dans le descripteur de ressource ACPI pour l’appareil peut contenir un bit d’indicateur pour indiquer si le pilote partage l’appareil avec Acpi.sys.

Exemple de verrouillage de connexion

Une utilisation classique d’un verrou de connexion consiste à implémenter une opération de lecture-modification-écriture atomique. Si deux clients partagent l’accès au même appareil cible sur un bus périphérique simple (SPB), l’un ou l’autre client peut utiliser le verrou de connexion pour fusionner une opération de lecture et une opération d’écriture en une seule opération de lecture-modification-écriture atomique. Le verrou de connexion empêche l’autre client d’accéder à l’appareil cible entre les opérations de lecture et d’écriture.

La liste suivante décrit la série de demandes d’E/S qu’un client peut envoyer à un appareil cible connecté à SPB pour effectuer une opération en lecture-modification-écriture sur l’appareil :

  1. IOCTL_SPB_LOCK_CONNECTION : acquérir le verrou de connexion sur l’appareil cible.
  2. IRP_MJ_READ : lisez un bloc de données à partir de l’adresse de l’appareil afin que le client puisse interpréter et modifier les données.
  3. IRP_MJ_WRITE : écrivez le bloc de données modifié dans l’adresse du périphérique.
  4. IOCTL_SPB_UNLOCK_CONNECTION : relâchez le verrou de connexion sur l’appareil cible.

La liste précédente peut être appropriée pour un appareil simple qui implémente une fonction d’appareil unique.

Toutefois, un appareil plus complexe peut implémenter plusieurs fonctions d’appareil. Cet appareil peut contenir un registre d’adresses de fonction que le client charge au début d’un transfert de données. Pour cet appareil, une demande IOCTL_SPB_EXECUTE_SEQUENCE peut combiner le chargement du registre de l'adresse de fonction et le transfert de données qui suit en une seule opération de bus atomique. Pour plus d’informations, consultez la description de l’exemple d’appareil I2C dans les opérations Atomic Bus.

Comparaison avec les verrous de contrôleur

Un client utilise un verrou de connexion pour obtenir un accès exclusif à un appareil cible, mais le verrou de connexion n’empêche pas les transferts de données vers ou depuis d’autres appareils sur le bus.

Pour effectuer une série de transferts de données en tant qu’opération de bus atomique, les clients utilisent généralement une demande de IOCTL_SPB_EXECUTE_SEQUENCE . Une méthode moins courante pour effectuer une opération de bus atomique consiste à utiliser un verrou de contrôleur. Un client envoie des requêtes IOCTL_SPB_LOCK_CONTROLLER et IOCTL_SPB_UNLOCK_CONTROLLER pour acquérir et libérer un verrou de contrôleur.

Les verrous de contrôleur sont distincts des verrous de connexion. Un verrou de contrôleur permet d’effectuer une séquence de transferts d’E/S vers et depuis un appareil cible sur le bus comme une opération de bus atomique unique. Pendant que le verrou du contrôleur est en vigueur, les transferts vers ou depuis d’autres appareils du bus sont différés jusqu’à ce que le verrou du contrôleur soit libéré. Pour plus d’informations, consultez Opérations de Bus Atomiques.

Remarque

Dans certaines implémentations, un verrou de connexion peut, en tant qu’effet secondaire, empêcher les transferts vers d’autres appareils sur le bus. Toutefois, ce comportement dépend de l’implémentation et les pilotes clients ne doivent pas s’y fier. En revanche, un verrou de contrôleur empêche un autre client d’accéder au même appareil cible que le client qui contient le verrou du contrôleur, et les clients peuvent dépendre en toute sécurité de ce comportement.

Un client peut avoir besoin d’acquérir un verrou de connexion et un verrou de contrôleur avant d’effectuer un ensemble d’opérations d’E/S sur un appareil cible. Le verrou de connexion empêche un deuxième client qui partage l’accès au même appareil cible d’effectuer des opérations d’E/S sur l’appareil, et le verrou du contrôleur empêche les clients d’autres appareils sur le bus d’effectuer des opérations d’E/S sur ces autres appareils. (Les opérations d’E/S qui ne peuvent pas se produire pendant que ces verrous sont conservés sont simplement différés jusqu’à ce que les verrous soient libérés.)

Lorsqu’un client acquiert à la fois un verrou de connexion et un verrou de contrôleur pour un appareil cible sur un SPB, le client doit acquérir le verrou de connexion avant d’acquérir le verrou du contrôleur, et doit libérer le verrou du contrôleur avant de libérer le verrou de connexion. Une fois qu’un client a acquis un verrou de connexion, le client peut, si nécessaire, acquérir et libérer le verrou du contrôleur autant de fois que nécessaire avant que le client libère le verrou de connexion.

Les acquisitions imbriquées d’un verrou de connexion sont illégales. Une fois qu’un client a acquis un verrou de connexion, le client ne doit pas essayer d’acquérir à nouveau le verrou tant que le client ne libère pas le verrou pour la première fois. De même, les acquisitions imbriquées d’un verrou de contrôleur ne sont pas autorisées.