Compartilhar via


Bloqueios de conexão SPB

Os bloqueios de conexão são úteis para permitir que dois clientes compartilhem o acesso a um dispositivo periférico de destino em um SPB (barramento periférico) simples. Os dois clientes podem abrir conexões lógicas com o mesmo dispositivo de destino e usar o bloqueio de conexão quando um deles requer acesso exclusivo ao dispositivo para realizar 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 UMDF (User-Mode Driver Framework) ou um driver KMDF (Kernel-Mode Driver Framework). Para enviar uma solicitação IOCTL a um dispositivo periférico conectado ao 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 cliente sempre 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 precisam compartilhar o acesso ao mesmo dispositivo de destino, e um ou os dois clientes às vezes precisam 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 de estrutura SPB (SpbCx) serializará solicitações de E/S para o dispositivo de acordo com a ordem em que elas chegam na fila de solicitações SpbCx. O bloqueio de conexão substitui a ordem padrão das solicitações. Depois que um cliente adquire o bloqueio de conexão, o SpbCx retém as solicitações de E/S que recebe 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 é permitir que o driver cliente de 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 pelo 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 do driver e o desenvolvedor da plataforma devem chegar a um acordo sobre um mecanismo específico de driver para determinar quando os bloqueios de conexão devem ser usados. Normalmente, as informações sobre o uso de 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 o Acpi.sys.

Exemplo de bloqueio de conexão

Um uso típico de um bloqueio de conexão é a implementação de uma operação atômica de leitura-modificação-gravação. Se dois clientes compartilharem o acesso ao mesmo dispositivo de destino em um SPB (barramento periférico simples), qualquer um dos clientes 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 de gravação.

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

  1. IOCTL_SPB_LOCK_CONNECTION: adquirir o bloqueio de conexão no dispositivo de destino.
  2. IRP_MJ_READ: ler um bloco de dados do endereço do dispositivo para que o cliente possa interpretar e modificar os dados.
  3. IRP_MJ_WRITE: gravar o bloco de dados modificado no endereço do dispositivo.
  4. IOCTL_SPB_UNLOCK_CONNECTION: liberar o bloqueio de conexão no dispositivo de destino.

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

No entanto, um dispositivo mais complexo pode implementar várias funções. 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 esse dispositivo, uma solicitação IOCTL_SPB_EXECUTE_SEQUENCE pode combinar o carregamento do registro de endereço de função e a transferência de dados que se segue em uma única operação de barramento atômico. Para obter mais informações, consulte a descrição do dispositivo I2C de exemplo 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 o bloqueio de conexão não impede transferências de dados de ou para outros dispositivos no barramento.

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

Os bloqueios de 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 realizada como uma única operação de barramento atômico. Enquanto o bloqueio de controlador estiver em vigor, as transferências de ou para outros dispositivos no barramento serão adiadas até que o bloqueio de controlador seja liberado. Para obter mais informações, confira 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 confiar nele. Por outro lado, um bloqueio de controlador impede, de forma confiável, que outro cliente acesse o mesmo dispositivo de destino que o cliente que mantém o bloqueio de controlador, e os clientes podem contar com esse comportamento com segurança.

Um cliente pode precisar adquirir um bloqueio de conexão e um bloqueio de controlador antes de realizar 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 acesso ao mesmo dispositivo de destino realize operações de E/S no dispositivo, e o bloqueio de controlador impede que clientes de outros dispositivos no barramento realizem operações de E/S nesses outros dispositivos. (As operações de E/S impedidas enquanto esses bloqueios são mantidos são simplesmente adiadas até que os bloqueios sejam liberados.)

Ao adquirir 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 do bloqueio de controlador e liberar o bloqueio de controlador antes de liberar o bloqueio de conexão. Depois que o cliente adquire um bloqueio de conexão, se necessário, ele poderá adquirir e liberar o bloqueio de controlador quantas vezes forem necessárias antes de liberar o bloqueio de conexão.

As aquisições aninhadas de um bloqueio de conexão são ilegais. Depois de adquirir um bloqueio de conexão, o cliente não deve tentar readquirir o bloqueio antes de liberá-lo primeiro. Da mesma forma, aquisições aninhadas de um bloqueio de controlador não são permitidas.