Punto de entrada de controlador de dispositivo de

Finalidad

Realiza E/S orientada a bloques mediante la planificación de una lectura o grabación en un dispositivo de bloque.

Sintaxis

void ddstrategy ( bp)
struct buf *bp;

Parámetro

Elemento Descripción
BP Apunta a una estructura buf que describe toda la información necesaria para realizar la transferencia de datos.

Descripción

Cuando el kernel necesita una transferencia de E/S de bloque, llama a la rutina de estrategia ddestrategia del controlador de dispositivo para dicho dispositivo. La rutina de estrategia planifica la E/S en el dispositivo. Normalmente, esto requiere las acciones siguientes:

  • La solicitud o las solicitudes deben añadirse en la lista de solicitudes de E/S que el dispositivo debe procesar.
  • Si la lista de solicitudes estaba vacía antes de las adiciones anteriores, se debe llamar a la rutina de E/S de inicio del dispositivo.

Proceso requerido

La rutina ddestrategia puede recibir una sola solicitud con varias estructuras buf . Sin embargo, no es necesario procesar las solicitudes en ningún orden específico.

La rutina de estrategia se puede pasar una lista de operaciones a realizar. Los 2av_forwen la cabecera buf describe esta lista terminada en nulo de cabeceras buf . Esta lista no está doblemente enlazada:av_backno está definido.

Los controladores de dispositivo de bloque deben poder realizar varias transferencias de bloques. Si el dispositivo no puede realizar varias transferencias de bloques, o sólo puede realizar varias transferencias de bloques bajo ciertas condiciones, el controlador de dispositivo debe transferir los datos con más de una operación de dispositivo.

Almacenamientos intermedios de kernel y utilización de la estructura de buf

Un área de memoria se deja a un lado dentro del espacio de memoria del núcleo para amortiguar las transferencias de datos entre un programa y el dispositivo periférico. Cada almacenamiento intermedio de kernel tiene una cabecera, la estructura buf , que contiene toda la información necesaria para realizar la transferencia de datos. La rutina ddestrategia es responsable de actualizar los campos de esta cabecera como parte de la transferencia.

El llamante de la rutina de estrategia debe establecer lab_iodonepara apuntar a la rutina de E/S del llamante. Cuando se completa una operación de E/S, el controlador de dispositivo llama al servicio de kernel de iodone , que a continuación llama a la rutina de E/S realizada especificada en elb_iodone:NONE. El servicio de kernel de iodone realiza esta llamada desde el nivel de interrupción de INTIODONA .

El valor de lab_flagsel campo se construye lógicamente ORing cero o más posibleb_flagsvalores de distintivo de campo.

Atención:
  • No modifique ninguno de los campos siguientes de la estructura buf pasada al punto de entrada ddestrategia : elb_forw,b_back,b_dev,b_un, ob_blkno:NONE. La modificación de estos campos puede causar resultados imprevisibles y desastrosos.
  • No modifique ninguno de los campos siguientes de una estructura buf adquirida con el servicio geteblk : elb_flags,b_forw,b_back,b_dev,b_count, ob_un:NONE. La modificación de cualquiera de estos campos puede causar resultados imprevisibles y desastrosos.

Entorno de ejecución

La rutina ddestrategia debe codificarse para ejecutarse en un entorno de ejecución de manejador de interrupciones (mitad inferior del controlador de dispositivo). Es decir, la rutina no debe tocar el almacenamiento del usuario, ni la falta de página, ni el sueño.

Valores de retorno

La rutina ddestrategia , a diferencia de otras rutinas de controlador de dispositivo, no devuelve un código de retorno. Cualquier información de error se devuelve en los campos adecuados dentro de la estructura buf al que apunta el parámetro bp .

Cuando sea aplicable, se deben utilizar los valores de retorno definidos en el estándar POSIX 1003.1 para las subrutinas read y write .