Structure uio

Objectif

Décrit une mémoire tampon à utiliser dans un transfert de données.

Introduction

La structure d'E-S utilisateur ou Uio est une structure de données décrivant une mémoire tampon à utiliser dans un transfert de données. La structure Uio est généralement utilisée dans les interfaces de lecture et d'écriture pour les pilotes de périphérique prenant en charge le caractère ou les E/S brutes. Elle est également utile dans d'autres instances où une mémoire tampon d'entrée ou de sortie peut exister dans différents types d'espaces adresse et dans laquelle la mémoire tampon n'est pas contiguë dans la mémoire virtuelle.

La structure uio est définie dans le fichier /usr/include/sys/uio.h .

Descriptif

La structure Uio décrit une mémoire tampon qui n'est pas contiguë dans la mémoire virtuelle. Il indique également l'espace adresse dans lequel la mémoire tampon est définie. Lorsqu'il est utilisé dans l'interface de lecture et d'écriture de l'unité de caractères, il contient également les indicateurs en mode ouverture de l'unité, ainsi que le décalage de lecture / écriture de l'unité.

Le noyau fournit des services qui accèdent aux données à l'aide d'une structure Uio . Les services de noyau Ureadc, Uwritec, Uiomoveet Uphysio effectuent toutes les transferts de données dans ou hors d'une mémoire tampon de données décrite par une structure Uio . Le service de noyau Ureadc écrit un caractère dans la mémoire tampon décrite par la structure Uio . Le service de noyau Uwritec lit un caractère dans la mémoire tampon. Ces deux services ont des noms opposés à ce à quoi vous vous attendez, car ils sont nommés pour l'action utilisateur initiateur de l'opération. Une lecture de la partie de l'utilisateur aboutit ainsi à l'écriture d'un pilote de périphérique dans la mémoire tampon, tandis qu'une écriture entraîne la lecture d'un pilote à partir de la mémoire tampon.

Le service de noyau Uiomove copie les données vers ou depuis une mémoire tampon décrite par une structure Uio depuis ou vers une mémoire tampon dans l'espace adresse du système. Le service de noyau Uphysio est utilisé principalement par les pilotes de périphérique de bloc fournissant le support d'E-S brutes. Le service de noyau Uphysio convertit la demande de lecture ou d'écriture de caractères en demande de lecture ou d'écriture de bloc et l'envoie à la routine Ddstrategy .

La mémoire tampon décrite par la structure Uio peut être constituée de plusieurs zones non contiguës de mémoire virtuelle de différentes longueurs. Ceci est réalisé en décrivant la mémoire tampon de données avec un tableau d'éléments, chacun comprenant une adresse de mémoire virtuelle et une longueur d'octet. Chaque élément est défini comme étant uniovec. La structure Uio contient également une zone spécifiant le nombre total d'octets dans la mémoire tampon de données décrit par la structure.

Une autre zone de la structure Uio décrit l'espace adresse de la mémoire tampon de données, qui peut être un espace système, un espace utilisateur ou un espace intermémoire. Si l'espace adresse est défini en tant que mémoire croisée, un tableau supplémentaire de descripteurs de mémoire croisée est spécifié dans la structure Uio pour correspondre à la grappe deiovecéléments.

La structure Uio contient également un décalage d'octets (uio_offset). Cette zone est un entier 64 bits (offset_t); il 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.

La routine appelée (pilote de périphérique) est autorisée à modifier les zones des structures Uio et Iovec à mesure que le transfert de données progresse. La finaleuio_residLe nombre est en fait utilisé pour déterminer la quantité de données transférées. Par conséquent, ce nombre doit être décalé, avec chaque opération, par le nombre d'octets réellement copiés.

La structure Uio contient les zones suivantes:

Zone Descriptif
uio_iov Pointeur vers un tableau de structures Iovec décrivant la mémoire tampon de l'utilisateur pour le transfert de données.
uio_xmem Pointeur vers un tableau de structures Xmem contenant les descripteurs de mémoire croisée pour le tableau Iovec .
uio_iovcnt Nombre de structures Iovec encore en cours de traitement dans le tableau pointé paruio_iovPointeur. Le nombre doit être d'au moins 1. Si le nombre est supérieur à 1, une Nuage de points des données doit être exécutée dans ou hors des zones décrites par les structures Iovec .
uio_iovdcnt Nombre de structures Iovec déjà traitées dans le tableau Iovec .
uio_offset The file offset established by a previous Lseek, Llrechercher subroutine call. La plupart des unités de caractères ignorent cette variable, mais certaines, telles que la pseudo-unité /dev/mem , l'utilisent et la gèrent.
uio_segflg Indicateur signalant le type de mémoire tampon décrit par la structure Uio . Cet indicateur décrit généralement si la zone de données est dans l'espace utilisateur ou noyau ou si elle est en mémoire croisée. Reportez-vous au fichier /usr/include/sys/uio.h pour obtenir une description des valeurs possibles de cet indicateur et de leur signification.
uio_fmode Valeur du mode de fichier indiqué lors de l'ouverture du fichier ou modifiée par le sous-programme Fcntl . Cet indicateur décrit les paramètres de contrôle de fichier. Le fichier /usr/include/sys/fcntl.h contient des valeurs spécifiques pour cet indicateur.
uio_resid Nombre d'octets pour le transfert de données. Il ne doit pas dépasser la somme de tous lesiov_lenDans le tableau des structures Iovec . Dans un premier temps, cette zone contient le nombre total d'octets, et une fois l'opération terminée, la valeur doit être décrémentée par le nombre réel d'octets transférés.

La structure Iovec contient l'adresse de départ et la longueur d'une zone de données contiguës à utiliser dans un transfert de données. La structure Iovec est le type d'élément dans un tableau désigné par leuio_iovDans la structure Uio . Ce tableau peut contenir n'importe quel nombre de structures Iovec , chacune d'entre elles décrivant une seule unité de stockage contigu. Ensemble, ces unités représentent la superficie totale dans laquelle, ou à partir de laquelle, les données doivent être transférées. :NONE.uio_iovcntDonne le nombre de structures Iovec dans le tableau.

La structure Iovec contient les zones suivantes:

Zone Descriptif
iov_base Variable dans la structure Iovec contenant l'adresse de base de la zone de données contiguës dans l'espace adresse spécifié par leuio_segflag:NONE. La longueur de la zone de données contiguës est spécifiée pariov_len:NONE.
iov_len Variable dans la structure Iovec contenant la longueur d'octet de la zone de données à partir de l'adresse indiquée dans la variable Base iov_base .