Compartilhar via


Bloqueios de conexão do SPB

Os bloqueios de conexão são úteis para permitir que dois clientes compartilhem o acesso a um dispositivo periférico alvo em um barramento periférico simples (SPB). Ambos os clientes podem abrir conexões lógicas para o mesmo dispositivo de destino e usar o bloqueio de conexão quando qualquer cliente exigir acesso exclusivo ao dispositivo para executar uma série de operações de E/S. Quando um cliente mantém o bloqueio de conexão, as solicitações do segundo cliente para acessar o dispositivo são automaticamente adiadas até que o primeiro cliente libere o bloqueio.

Um cliente usa as solicitações IOCTL_SPB_LOCK_CONNECTION e IOCTL_SPB_UNLOCK_CONNECTION para adquirir e liberar o bloqueio de conexão em um dispositivo de destino em um SPB. Um cliente envia essas solicitações de controle de E/S (IOCTL) para o objeto de arquivo do dispositivo.

O driver de um dispositivo periférico conectado ao SPB normalmente é um driver User-Mode Driver Framework (UMDF) ou um driver Kernel-Mode Driver Framework (KMDF). Para enviar uma solicitação IOCTL para um dispositivo periférico conectado a SPB, um driver UMDF chama um método como IWDFIoRequest::Send. Um driver KMDF chama um método como WdfIoTargetSendIoctlSynchronously.

Normalmente, os bloqueios de conexão são desnecessários. A maioria dos drivers de cliente geralmente tem acesso exclusivo a um dispositivo de destino em um SPB. Um bloqueio de conexão é necessário apenas no caso relativamente raro em que dois clientes devem compartilhar o acesso ao mesmo dispositivo de destino, e um ou ambos os clientes às vezes devem ter acesso exclusivo ao dispositivo para uma série de operações de E/S.

Por padrão, se dois clientes compartilharem um dispositivo de destino, a extensão da estrutura SPB (SpbCx) serializa as solicitações de E/S para o dispositivo de acordo com a ordem na qual eles chegam na fila de solicitações SpbCx. O bloqueio de conexão substitui a ordenação padrão de solicitações. Depois que um cliente adquire o bloqueio de conexão, o SpbCx retém as solicitações de E/S recebidas do segundo cliente até que o primeiro cliente libere o bloqueio.

Na implementação atual do SpbCx, o principal uso de bloqueios de conexão é habilitar o driver cliente para que um dispositivo de destino compartilhe o acesso ao dispositivo com o driver ACPI, Acpi.sys. Acpi.sys é um driver fornecido pelo sistema que gerencia determinados dispositivos de recursos principais em nome do firmware ACPI para a plataforma de hardware. Por exemplo, uma plataforma que usa um SoC (System on a Chip) também pode conter um PMIC (circuito integrado de gerenciamento de energia) que é acessado por Acpi.sys e um driver cliente.

Um driver cliente é responsável por determinar se ele requer um bloqueio de conexão para operações de E/S que exigem acesso exclusivo a um dispositivo de destino. Se um driver exigir bloqueios de conexão em algumas plataformas de hardware ou configurações de plataforma, mas não em outras, o desenvolvedor de driver e o desenvolvedor da plataforma deverão concordar com um mecanismo específico do driver para determinar quando os bloqueios de conexão devem ser usados. Normalmente, as informações sobre se usar bloqueios de conexão são incluídas no firmware da plataforma. Por exemplo, o bloco de informações definido pelo fornecedor no descritor de recursos ACPI para o dispositivo pode conter um bit de sinalizador para indicar se o driver compartilha o dispositivo com Acpi.sys.

Exemplo de bloqueio de conexão

Um uso típico de um bloqueio de conexão é implementar uma operação atômica de leitura-modificação-gravação. Se dois clientes compartilharem acesso ao mesmo dispositivo de destino em um SPB (barramento periférico simples), qualquer cliente poderá usar o bloqueio de conexão para mesclar uma operação de leitura e uma operação de gravação em uma única operação atômica de leitura-modificação-gravação. O bloqueio de conexão impede que o outro cliente acesse o dispositivo de destino entre as operações de leitura e gravação.

A lista a seguir descreve a série de solicitações de E/S que um cliente pode enviar para um dispositivo de destino conectado ao SPB para executar uma operação de leitura-modificação-gravação no dispositivo:

  1. IOCTL_SPB_LOCK_CONNECTION – Adquira o bloqueio de conexão no dispositivo de destino.
  2. IRP_MJ_READ – Leia um bloco de dados do endereço do dispositivo para que o cliente possa interpretar e modificar os dados.
  3. IRP_MJ_WRITE – Escreva o bloco modificado de dados no endereço do dispositivo.
  4. IOCTL_SPB_UNLOCK_CONNECTION – libere o bloqueio de conexão no dispositivo de destino.

A lista anterior pode ser apropriada para um dispositivo simples que implementa uma única função de dispositivo.

No entanto, um dispositivo mais complexo pode implementar várias funções de dispositivo. Esse dispositivo pode conter um registro de endereço de função que o cliente carrega no início de uma transferência de dados. Para este dispositivo, uma solicitação IOCTL_SPB_EXECUTE_SEQUENCE pode combinar o carregamento do registrador de endereço de função e a transferência de dados a seguir em uma única operação de barramento atômico. Para obter mais informações, consulte a descrição do dispositivo de exemplo I2C em Operações de Barramento Atômico.

Comparação com bloqueios do controlador

Um cliente usa um bloqueio de conexão para obter acesso exclusivo a um dispositivo de destino, mas esse bloqueio não impede transferências de dados para ou de outros dispositivos no barramento.

Para executar uma série de transferências de dados como uma operação de barramento atômico, os clientes normalmente usam uma IOCTL_SPB_EXECUTE_SEQUENCE solicitação. Uma maneira menos comum de executar uma operação de barramento atômico é usar um bloqueio do controlador. Um cliente envia solicitações IOCTL_SPB_LOCK_CONTROLLER e IOCTL_SPB_UNLOCK_CONTROLLER para adquirir e liberar um bloqueio do controlador.

Os bloqueios do controlador são distintos dos bloqueios de conexão. Um bloqueio de controlador permite que uma sequência de transferências de E/S de e para um dispositivo de destino no barramento seja executada como uma única operação de barramento atômico. Enquanto o bloqueio do controlador está em vigor, as transferências de ou para outros dispositivos no barramento são adiadas até que o bloqueio do controlador seja liberado. Para obter mais informações, consulte Operações de Barramento Atômico.

Observação

Em algumas implementações, um bloqueio de conexão pode, como efeito colateral, impedir transferências para outros dispositivos no barramento. No entanto, esse comportamento depende da implementação e os drivers de cliente não devem depender dele. Por outro lado, um bloqueio do controlador impede que outro cliente acesse o mesmo dispositivo de destino que o cliente que mantém o bloqueio do controlador, e os clientes podem depender com segurança desse comportamento.

Um cliente pode precisar adquirir um bloqueio de conexão e um bloqueio de controlador antes de executar um conjunto de operações de E/S em um dispositivo de destino. O bloqueio de conexão impede que um segundo cliente que compartilha o acesso ao mesmo dispositivo de destino execute operações de E/S no dispositivo e o bloqueio do controlador impede que clientes de outros dispositivos no barramento executem operações de E/S nesses outros dispositivos. (As operações de E/S que são impedidas de ocorrer enquanto esses bloqueios são mantidos são simplesmente adiadas até que os bloqueios sejam liberados.)

Quando um cliente adquire um bloqueio de conexão e um bloqueio de controlador para um dispositivo de destino em um SPB, o cliente deve adquirir o bloqueio de conexão antes de adquirir o bloqueio do controlador e deve liberar o bloqueio do controlador antes de liberar o bloqueio de conexão. Depois que um cliente adquire um bloqueio de conexão, o cliente pode, se necessário, adquirir e liberar o bloqueio do controlador quantas vezes for necessário antes que o cliente libere o bloqueio de conexão.

Aquisições aninhadas de um bloqueio de conexão são ilegais. Depois que um cliente tiver adquirido um bloqueio de conexão, o cliente não deverá tentar adquirir o bloqueio novamente até que o cliente libere o bloqueio pela primeira vez. Da mesma forma, aquisições aninhadas de um bloqueio de controlador não são permitidas.