Punto de entrada de controlador de dispositivo de

Finalidad

Graba datos en un dispositivo de caracteres.

Sintaxis

#include <sys/device.h>
#include <sys/types.h>
int ddwrite (devno, uiop, chan, ext)
dev_t  devno;
struct uio * uiop;
chan_t  chan;
int  ext;

Parámetros

Elemento Descripción
devno Especifica el números de dispositivo mayor y menor.
uiop Apunta a una estructura uio que describe el área de datos o áreas de las que se debe escribir.
chan Especifica el número de canal.
ext Especifica el parámetro de extensión.

Descripción

Cuando un programa emite una llamada de subrutina de Escribir o Artículo o cuando se utiliza el servicio de kernel de fp_rwuio , el kernel llama al punto de entrada ddwrite .

Este punto de entrada recibe un puntero a una estructura uio , que proporciona variables utilizadas para especificar la operación de transferencia de datos.

Los controladores de dispositivo de caracteres pueden utilizar los servicios de kernel de uwritec y uiomove para transferir datos dentro y fuera del área de almacenamiento intermedio de usuario durante una llamada de subrutina de Escribir . Estos servicios pasan un puntero a la estructura uio . Actualizan los campos de la estructura por el número de bytes transferidos. Los únicos campos de la estructura uio que no son potencialmente modificados por la transferencia de datos son losuio_fmodeyuio_segflgcampos.

Para la mayoría de los dispositivos, la rutina ddwrite pone en cola la solicitud al manejador de dispositivos y, a continuación, espera a que finalice. La espera se realiza normalmente llamando al servicio de kernel de Sueño para que espere un suceso. El servicio de kernel de Sueño suspende el controlador y el proceso que lo ha llamado y permite que se ejecuten otros procesos.

Cuando se completa la operación de E/S, el dispositivo suele provocar un interrupción, lo que hace que se llame al manejador de interrupciones del controlador de dispositivo. A continuación, el manejador de interrupciones llama al servicio de kernel de e_wakeup especificando el suceso esperado, lo que permite reanudar la rutina de ddwrite .

Los 2uio_residinicialmente contiene el número total de bytes para grabar en el dispositivo. Si el controlador de dispositivo lo soporta, eluio_offsetindica el desplazamiento de byte en el dispositivo desde el que se debe iniciar la grabación.

Los 2uio_offsetcampo es un entero de 64 bits (offset_t); esto permite al sistema de archivos enviar solicitudes de E/S a los puntos de entrada de lectura y grabación de un controlador de dispositivo que tienen desplazamientos lógicos más allá de 2 gigabytes. Los controladores de dispositivo deben utilizar el cuidado de no causar una pérdida de importancia asignando el desplazamiento a una variable de 32 bits o utilizándola en cálculos que desbordan una variable de 32 bits.

Si no se produce ningún error, eluio_residdebe ser 0 a la vuelta de la rutina ddwrite para indicar que se han escrito todos los bytes solicitados. Si se produce un error, este campo debe contener el número de bytes que quedan por escribir cuando se ha producido el error.

Si una solicitud de grabación se inicia en un desplazamiento de dispositivo válido pero se extiende más allá del final de las prestaciones del dispositivo, no se debe devolver ningún error. Sin embargo, los métodosuio_residdebe indicar el número de bytes no transferidos. Si la grabación se inicia en o después del final de las funciones del dispositivo, no se deben transferir datos. Se debe devolver un código de error de ENXIO y eluio_residno se debe modificar el campo.

Cuando se proporciona el punto de entrada ddwrite para la E/S sin formato a un dispositivo de bloque, esta rutina suele utilizar el servicio de kernel de ufisico para convertir las solicitudes en solicitudes de E/S de bloque.

Entorno de ejecución

La rutina ddwrite sólo se ejecuta en entorno de proceso. Debe proporcionar la serialización necesaria de sus estructuras de datos utilizando los servicios de kernel de bloqueo junto con una palabra de bloqueo privada definida en el controlador.

Valores de retorno

El punto de entrada ddwrite puede indicar una condición de error al llamante devolviendo un valor de retorno distinto de cero. Esto hace que la subrutina devuelva un valor de-1 . También hace que el código de retorno esté disponible para el programa de modalidad de usuario en la variable global errno . El código de error utilizado debe ser uno de los valores definidos en el/usr/include/sys/errno.h archivo.

Cuando sea aplicable, se deben utilizar los valores de retorno definidos en el estándar POSIX 1003.1 para la subrutina write .

Información relacionada

El punto de entrada del controlador de dispositivo de ddread .

Servicio de kernel de Sueño , servicio de kernel de e_wakeup , servicio de kernel de fp_rwuio , servicio de kernel de uiomove , servicio de kernel de ufisico , servicio de kernel de uwritec .

La estructura uio .

Las subrutinas Escribir y Artículo .

Visión general de extensión del kernel del controlador, Entendiendo Los Roles De Controlador De Dispositivo, Interrupciones de comprensión, Cómo comprender el bloqueo en Conceptos de programación de extensiones de kernel y soporte de dispositivos.