Point d'entrée du pilote de périphérique de lecture

Objectif

Lectures dans les données à partir d'une unité de caractères.

Syntaxe

#include <sys/device.h>
#include <sys/types.h>

int ddread ( devno,  uiop,  chan,  ext)
dev_t devno;
struct uio *uiop;
chan_t chan;
int ext;

Paramètres

Article Descriptif
Devno Indique les numéros d'unité principaux et secondaires.
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 le paramètre d'extension.

Descriptif

Lorsqu'un programme émet un appel de sous-routine Lire ou Readx ou lorsque le service de noyau Fp_rwuio est utilisé, le noyau appelle le point d'entrée Ddread .

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 Ureadc et Uiomove pour transférer des données vers et hors de la zone tampon utilisateur lors d'un appel de sous-routine Lire . Ces services reçoivent un pointeur vers la structure Uio et mettent à jour les zones de la structure par le nombre d'octets transférés. Les seules zones de la structure Uio qui ne peuvent pas être modifiées par le transfert de données sont lesuio_fmodeetuio_segflg.

Pour la plupart des unités, la routine Ddread envoie la demande au gestionnaire d'unités, puis attend qu'elle se termine. L'attente peut être effectuée en appelant le service de noyau _sommeil . Ce service suspend le pilote et le processus qui l'a appelé et permet d'exécuter d'autres processus jusqu'à ce qu'un événement spécifié se produise.

Une fois l'opération d'E-S terminée, l'unité émet généralement une 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 Ddread de reprendre.

:NONE.uio_residContient initialement le nombre total d'octets à lire à partir de 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 la lecture 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 Ddread pour indiquer que tous les octets demandés ont été lus. Si une erreur se produit, cette zone doit contenir le nombre d'octets restant à lire lorsque l'erreur s'est produite.

Si une demande de lecture 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 la lecture commence à la fin des fonctions de l'unité, aucune erreur ne doit être renvoyée. Toutefois, leuio_residNe doit pas être modifié, ce qui indique qu'aucun octet n'a été transféré. Si la lecture commence après la fin des fonctions de l'unité, un code retour ENXIO doit être renvoyé, sans modifier lauio_resid:NONE.

Lorsque le point d'entrée Ddread est fourni pour les E-S brutes à un périphérique de bloc, cette routine convertit généralement les demandes en demandes d'E-S par bloc à l'aide du service de noyau Uphysio .

Environnement d'exécution

La routine Ddread est exécutée uniquement dans l'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 Ddread peut indiquer une condition d'erreur à l'appelant en renvoyant un code retour différent de zéro. Cela amène l'appel du 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 read doivent être utilisées.