Compartir a través de


Bloqueos de conexión de SPB

Los bloqueos de conexión son útiles para permitir que dos clientes compartan acceso a un dispositivo periférico de destino en un simple bus periférico (SPB). Ambos clientes pueden abrir conexiones lógicas al mismo dispositivo de destino y usar el bloqueo de conexión cuando cualquiera de los clientes requiere acceso exclusivo al dispositivo para realizar una serie de operaciones de E/S. Cuando un cliente tiene el bloqueo de conexión, las solicitudes realizadas por el segundo cliente para acceder al dispositivo se aplazan automáticamente hasta que el primer cliente libera el bloqueo.

Un cliente usa las solicitudes IOCTL_SPB_LOCK_CONNECTION y IOCTL_SPB_UNLOCK_CONNECTION para adquirir y liberar el bloqueo de conexión en un dispositivo de destino en un SPB. Un cliente envía estas solicitudes de control de E/S (IOCTL) al objeto de archivo del dispositivo.

El controlador de un dispositivo periférico conectado a SPB suele ser un controlador del marco de controladores del modo de usuario (UMDF) o un controlador del marco de controladores en modo kernel (KMDF). Para enviar una solicitud IOCTL a un dispositivo periférico conectado a SPB, un controlador UMDF llama a un método como IWDFIoRequest::Send. Un controlador KMDF llama a un método como WdfIoTargetSendIoctlSynchronously.

Normalmente, los bloqueos de conexión no son necesarios. La mayoría de los controladores cliente siempre tienen acceso exclusivo a un dispositivo de destino en un SPB. Solo se necesita un bloqueo de conexión en el caso relativamente poco frecuente en el que dos clientes deben compartir el acceso al mismo dispositivo de destino, y uno o ambos clientes a veces deben tener acceso exclusivo al dispositivo para una serie de operaciones de E/S.

De forma predeterminada, si dos clientes comparten un dispositivo de destino, la extensión de marco de SPB (SpbCx) serializa las solicitudes de E/S para el dispositivo según el orden en que llegan a la cola de solicitudes de SpbCx. El bloqueo de conexión invalida el orden predeterminado de las solicitudes. Cuando un cliente adquiere el bloqueo de conexión, SpbCx retiene las solicitudes de E/S que recibe del segundo cliente hasta que el primer cliente libera el bloqueo.

En la implementación actual de SpbCx, el uso principal de bloqueos de conexión es permitir que el controlador cliente de un dispositivo de destino comparta el acceso al dispositivo con el controlador ACPI, Acpi.sys. Acpi.sys es un controlador suministrado por el sistema que administra determinados dispositivos de recursos principales en nombre del firmware ACPI para la plataforma de hardware. Por ejemplo, una plataforma que usa un sistema en un chip (SoC) también puede contener un circuito integrado de administración de energía (PMIC) al que acceden tanto Acpi.sys como un controlador cliente.

Un controlador cliente se encarga de determinar si requiere un bloqueo de conexión para las operaciones de E/S que requieren acceso exclusivo a un dispositivo de destino. Si un controlador requiere bloqueos de conexión en algunas plataformas de hardware o configuraciones de plataforma, pero no en otras, el desarrollador de controladores y el desarrollador de la plataforma deben aceptar un mecanismo específico del controlador para determinar cuándo se van a usar los bloqueos de conexión. Normalmente, la información sobre si usar bloqueos de conexión se incluye en el firmware de la plataforma. Por ejemplo, el bloque de información definido por el proveedor en el descriptor de recursos ACPI para el dispositivo podría contener un bit de marca para indicar si el controlador comparte el dispositivo con Acpi.sys.

Ejemplo de bloqueo de conexión

Un uso típico de un bloqueo de conexión es implementar una operación atómica de lectura-modificación-escritura. Si dos clientes comparten acceso al mismo dispositivo de destino en un bus periférico simple (SPB), cualquiera de los clientes puede usar el bloqueo de conexión para combinar una operación de lectura y una operación de escritura en una sola operación de lectura y escritura atómica. El bloqueo de conexión impide que el otro cliente acceda al dispositivo de destino entre las operaciones de lectura y escritura.

En la lista siguiente se describe la serie de solicitudes de E/S que un cliente puede enviar a un dispositivo de destino conectado a SPB para realizar una operación de lectura-modificación-escritura en el dispositivo:

  1. IOCTL_SPB_LOCK_CONNECTION - Adquiere el bloqueo de conexión en el dispositivo de destino.
  2. IRP_MJ_READ - Lee un bloque de datos de la dirección del dispositivo para que el cliente pueda interpretar y modificar los datos.
  3. IRP_MJ_WRITE - Escribe el bloque de datos modificado en la dirección del dispositivo.
  4. IOCTL_SPB_UNLOCK_CONNECTION - Libera el bloqueo de conexión en el dispositivo de destino.

La lista anterior puede ser adecuada para un dispositivo simple que implemente una sola función de dispositivo.

Sin embargo, un dispositivo más complejo podría implementar varias funciones de dispositivo. Este dispositivo puede contener un registro de dirección de función que el cliente carga al principio de una transferencia de datos. Para este dispositivo, una solicitud IOCTL_SPB_EXECUTE_SEQUENCE puede combinar la carga del registro de direcciones de función y la transferencia de datos que sigue a una única operación atómica de bus. Para obtener más información, consulte la descripción del dispositivo I2C de ejemplo en operaciones de bus atómicas.

Comparación con bloqueos de controlador

Un cliente usa un bloqueo de conexión para obtener acceso exclusivo a un dispositivo de destino, pero el bloqueo de conexión no impide las transferencias de datos hacia o desde otros dispositivos del bus.

Para realizar una serie de transferencias de datos como una operación de bus atómica, los clientes suelen usar una solicitud IOCTL_SPB_EXECUTE_SEQUENCE. Una manera menos común de realizar una operación de bus atómica es usar un bloqueo de controlador. Un cliente envía solicitudes IOCTL_SPB_LOCK_CONTROLLER y IOCTL_SPB_UNLOCK_CONTROLLER para adquirir y liberar un bloqueo de controlador.

Los bloqueos de controlador son distintos de los bloqueos de conexión. Un bloqueo de controlador permite realizar una secuencia de transferencias de E/S hacia y desde un dispositivo de destino en el bus como una sola operación atómica de bus. Mientras el bloqueo del controlador está en vigor, las transferencias a o desde otros dispositivos del bus se aplazan hasta que se libera el bloqueo del controlador. Para obtener más información, consulte Operaciones atómicas de bus.

Nota:

En algunas implementaciones, un bloqueo de conexión podría, como efecto secundario, evitar las transferencias a otros dispositivos del bus. Sin embargo, este comportamiento depende de la implementación y los controladores de cliente no deben confiar en él. Por el contrario, un bloqueo de controlador impide que otro cliente acceda al mismo dispositivo de destino que el cliente que tiene el bloqueo del controlador, y los clientes pueden confiar en este comportamiento de forma segura.

Es posible que un cliente tenga que adquirir un bloqueo de conexión y un bloqueo de controlador antes de realizar un conjunto de operaciones de E/S en un dispositivo de destino. El bloqueo de conexión impide que un segundo cliente que comparta el acceso al mismo dispositivo de destino realice operaciones de E/S en el dispositivo y el bloqueo del controlador impide que los clientes de otros dispositivos del bus realicen operaciones de E/S en estos otros dispositivos. (Las operaciones de E/S que se impiden que se produzcan mientras estos bloqueos se mantienen simplemente se aplazan hasta que se liberen los bloqueos).

Cuando un cliente adquiere un bloqueo de conexión y un bloqueo de controlador para un dispositivo de destino en un SPB, el cliente debe adquirir el bloqueo de conexión antes de adquirir el bloqueo del controlador y debe liberar el bloqueo del controlador antes de liberar el bloqueo de conexión. Cuando un cliente adquiere un bloqueo de conexión puede, si es necesario, adquirir y liberar el bloqueo del controlador tantas veces como sea necesario antes de que el cliente libere el bloqueo de conexión.

Las adquisiciones anidadas de un bloqueo de conexión son ilegales. Cuando un cliente haya adquirido un bloqueo de conexión, el cliente no debe intentar volver a adquirir el bloqueo hasta que el cliente libere el bloqueo por primera vez. Del mismo modo, no se permiten adquisiciones anidadas de un bloqueo de controlador.