Point d'entrée du pilote de périphérique ddwrite
Objectif
Ecrit les données dans un périphérique de type caractère.
Syntaxe
Paramètres
| Article | Descriptif |
|---|---|
| Devno | Indique le Numéros d'unités principaux et mineurs. |
| Uiop | Pointe vers une structure Uio décrivant la zone de données ou les zones à écrire. |
| Chan | Indique le Numéro de canal. |
| poste | Indique Paramètre d'extension. |
Descriptif
Lorsqu'un programme émet un appel de sous-routine écrire ou Writex ou lorsque le service de noyau Fp_rwuio est utilisé, le noyau appelle le point d'entrée Ddwrite .
Ce point d'entrée reçoit un pointeur vers une structure Uio , qui fournit des variables utilisées pour spécifier l'opération de transfert de données.
Les pilotes de périphérique de caractères peuvent utiliser les services de noyau Uwritec et Uiomove pour transférer des données vers et hors de la zone tampon utilisateur lors d'un appel de sous-routine écrire . Ces services sont transmis à la structure Uio . Ils mettent à jour les zones de la structure par le nombre d'octets transférés. Les seules zones de la structure Uio qui ne sont pas potentiellement modifiées par le transfert de données sont lesuio_fmodeetuio_segflg.
Pour la plupart des unités, la routine Ddwrite met en file d'attente la demande au gestionnaire d'unités, puis attend qu'elle se termine. L'attente est généralement effectuée en appelant le service de noyau _sommeil à attendre un événement. Le service de noyau _sommeil suspend le pilote et le processus qui l'a appelé et permet d'exécuter d'autres processus.
Lorsque l'opération d'E-S est terminée, l'unité entraîne généralement un Interruption, ce qui entraîne l'appel du gestionnaire d'interruption du pilote de périphérique. Le gestionnaire d'interruption appelle ensuite le service de noyau _wakeup spécifiant l'événement attendu, ce qui permet à la routine Ddwrite de reprendre.
:NONE.uio_residContient initialement le nombre total d'octets à écrire sur l'unité. Si le pilote de périphérique le prend en charge,uio_offsetIndique le décalage d'octets sur le périphérique à partir duquel l'écriture doit démarrer.
:NONE.uio_offsetZone est un entier 64 bits (offset_t); cela permet au système de fichiers d'envoyer des demandes d'E-S à des points d'entrée de lecture & écriture d'un pilote de périphérique qui ont des décalés logiques au-delà de 2 gigaoctets. Les pilotes de périphérique doivent utiliser les soins pour ne pas provoquer de perte de signification en affectant le décalage à une variable 32 bits ou en l'utilisant dans les calculs qui dépassent une variable 32 bits.
Si aucune erreur ne se produit, leuio_residDoit être 0 en retour de la routine Ddwrite pour indiquer que tous les octets demandés ont été écrits. Si une erreur se produit, cette zone doit contenir le nombre d'octets restant à écrire lorsque l'erreur s'est produite.
Si une demande d'écriture démarre à un décalage d'unité valide mais s'étend au-delà de la fin des fonctions de l'unité, aucune erreur ne doit être renvoyée. Toutefois, leuio_residDoit indiquer le nombre d'octets non transférés. Si l'écriture commence à ou après la fin des fonctions de l'unité, aucune donnée ne doit être transférée. Un code d'erreur ENXIO doit être renvoyé et leuio_residNe doit pas être modifié.
Lorsque le point d'entrée Ddwrite est fourni pour les E-S brutes à un périphérique de bloc, cette routine utilise généralement le service de noyau Uphysio pour convertir les demandes en demandes d'entrée-sortie de bloc.
Environnement d'exécution
La routine Ddwrite est exécutée uniquement dans Environnement de processus. Il doit fournir la sérialisation requise de ses structures de données en utilisant les services de noyau de verrouillage en conjonction avec un mot de verrouillage privé défini dans le pilote.
Valeurs renvoyées
Le point d'entrée Ddwrite peut indiquer une condition d'erreur à l'appelant en renvoyant une valeur de retour différente de zéro. Cela amène le sous-programme à renvoyer une valeur de-1 . Il rend également le code retour disponible pour le programme en mode utilisateur dans la variable globale Errno . Le code d'erreur utilisé doit être l'une des valeurs définies dans le/usr/include/sys/errno.h déposer.
Le cas échéant, les valeurs de retour définies dans la norme POSIX 1003.1 pour la sous-routine write doivent être utilisées.
Informations connexes
Point d'entrée du pilote de périphérique Ddread .
Le service de noyau _sommeil , le service de noyau _wakeup , le service de noyau Fp_rwuio , le service de noyau Uiomove , le service de noyau Uphysio , le service de noyau Uwritec .
La structure Uio .
Sous-routines écrire et Writex .
Présentation de l'extension du noyau du pilote de périphérique, Understanding Device Driver Roles, Comprendre les interruptions, Compréhension du verrouillage Dans Concepts de programmation de prise en charge des extensions et des périphériques du noyau.