Obtention d’un objet Adapter
Au démarrage de l’appareil, un pilote qui utilise le système ou le bus-master DMA appelle IoGetDmaAdapter pour obtenir un pointeur vers un objet d’adaptateur et déterminer le nombre maximal de registres de carte disponibles pour chaque opération de transfert. Lorsqu’un pilote appelle IoGetDmaAdapter, le gestionnaire d’E/S appelle à son tour la HAL pour obtenir les informations nécessaires spécifiques à la plateforme.
Un pilote doit fournir certaines informations dans une structure de DEVICE_DESCRIPTION définie par le système dans son appel à IoGetDmaAdapter. Les pilotes doivent utiliser RtlZeroMemory pour initialiser la structure DEVICE_DESCRIPTION avec des zéros avant d’y définir des valeurs.
Les données requises incluent des informations sur les fonctionnalités de l’appareil du pilote, telles que si l’appareil est un bus master, s’il dispose de fonctionnalités de diffusion/collecte et le nombre d’octets de données que l’appareil peut transférer à la fois (MaximumLength).
Les données de description de l’appareil requises incluent également des informations spécifiques à la plateforme, telles que le numéro spécifique à la plateforme et le numéro attribué par le système du bus qu’un pilote d’un appareil master bus contrôle. Un pilote peut obtenir ces informations en appelant IoGetDeviceProperty.
La structure DEVICE_DESCRIPTION inclut certains champs qui peuvent ne pas être pertinents pour certains périphériques ou pilotes DMA. Par exemple, le champ BusNumber n’est pas utilisé dans les pilotes WDM. Chaque pilote doit fournir des valeurs pour les membres de structure appropriés et doit définir les valeurs de tous les autres membres sur zéro.
Le pilote d’un appareil subordonné ne doit pas passer TRUE dans le champ ScatterGather , sauf si l’appareil est capable d’attendre que le contrôleur DMA système soit reprogrammé lorsqu’une demande doit être fractionnée en deux opérations DMA ou plus.
IoGetDmaAdapter retourne à la fois un pointeur vers un objet d’adaptateur et une valeur spécifique à la plateforme ou à l’appareil indiquant le nombre de registres de carte disponibles avec l’objet adaptateur pour chaque opération de transfert DMA.
L’objet adaptateur retourné contient trois champs accessibles aux pilotes :
Numéro de version (Version)
Taille (Taille)
Pointeur vers une structure DMA_OPERATIONS (DmaOperations)
La structure DMA_OPERATIONS comprend une table de pointeurs vers les fonctions que le pilote doit utiliser pour effectuer des opérations DMA sur son appareil. Les fonctions sont accessibles uniquement via les pointeurs de cette structure de données ; un pilote ne peut pas les appeler directement par nom. (Notez que ces routines remplacent les routines HalXxx prises en charge dans les versions précédentes de Windows NT. Pour garantir la compatibilité des pilotes hérités, les fichiers d’en-tête Wdm.h et Ntddk.h fournissent des macros avec les noms obsolètes, mais les nouveaux pilotes doivent toujours appeler les fonctions via la structure de données.)
Le nombre de registres de carte peut varier d’un appareil à l’autre et d’une plateforme à l’autre. En règle générale, hal affecte un certain nombre de registres de carte selon les critères suivants :
Si possible, la valeur HAL renvoie une valeur supérieure au nombre de registres de carte nécessaires au transfert d’octets MaximumLength , comme spécifié dans l’appel du pilote à IoGetDmaAdapter.
Sinon, hal retourne une valeur inférieure qui est aussi grande que possible pour la plateforme particulière.
En d’autres termes, le HAL donne généralement à chaque pilote suffisamment de registres de carte pour optimiser le débit DMA pour son appareil, mais le HAL peut retourner une valeur inférieure sur certaines plateformes Windows. Il n’existe aucune garantie qu’un pilote obtient le nombre d’inscriptions de carte qu’il demande. Les pilotes doivent donc toujours case activée la valeur retournée.
Tout pilote de périphérique DMA doit fournir un stockage pour le pointeur d’objet de l’adaptateur et la valeur NumberOfMapRegisters retournée par IoGetDmaAdapter. Ce pointeur est un paramètre obligatoire pour les routines de support fournies par le système utilisées pour DMA. Étant donné que la plupart de ces routines de prise en charge doivent être appelées à l’adresse IRQL = DISPATCH_LEVEL, le stockage alloué au pilote doit être résident. La plupart des pilotes DMA fournissent le stockage nécessaire dans une extension de périphérique. Toutefois, le stockage peut se trouver dans une extension de contrôleur si le pilote utilise également un objet contrôleur ou dans un pool non paginé alloué par le pilote. Pour plus d’informations, consultez Allocation de la mémoire System-Space et Gestion des priorités matérielles .
Une fois que le pilote a terminé toutes les opérations DMA, il appelle PutDmaAdapter pour libérer l’objet adaptateur.
Les sections suivantes Using System DMA et Using Bus-Master DMA) décrivent comment les pilotes monolithiques des appareils DMA utilisent des routines de support pour répondre aux demandes de transfert. Ces sections supposent que le pilote possède les éléments suivants :
Une routine StartIo standard, plutôt que de configurer et de gérer une file d’attente interne d’IRPs
Routine interne pour fractionner les demandes de transfert pour lesquelles un nombre insuffisant de registres de carte est disponible
Aucune contrainte DMA spécifique à l’appareil
En d’autres termes, ces sections décrivent la technique la plus simple possible pour les opérations DMA des pilotes, mais les pilotes individuels n’utilisent pas nécessairement exactement les mêmes techniques. Pour n’importe quel pilote d’un périphérique DMA, les routines de pilotes doivent fractionner les demandes de transfert DMA volumineuses dépend du modèle de pilote (classe/port ou monolithique), des fonctionnalités de l’appareil et de toutes les contraintes DMA spécifiques à l’appareil que le pilote doit gérer.