Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A extensão da estrutura SPB (SpbCx) dá suporte a sequências de transferência de E/S. Uma sequência de transferência de E/S é um conjunto ordenado de transferências de barramento (operações de leitura e gravação) que é realizada como uma única operação atômica de barramento. Todas as transferências em uma sequência de transferência de E/S acessam o mesmo dispositivo de destino no barramento. Enquanto uma sequência está sendo executada, nenhum outro dispositivo no barramento pode ser acessado, mesmo que o driver do controlador SPB possa receber solicitações de E/S para outros dispositivos antes que a sequência de transferência de E/S seja concluída.
Um exemplo de uma sequência de transferência de E/S é uma operação de gravação-leitura, que é uma operação de gravação de barramento seguida por uma operação de leitura de barramento. Um driver de dispositivo periférico cliente pode usar esse tipo de sequência para gravar em um registro de seleção de função em um dispositivo periférico conectado a SPB e ler o valor da função de dispositivo selecionada. Essas duas transferências podem ter comprimentos diferentes. Por exemplo, a operação de gravação pode transferir um byte de dados e a operação de leitura pode transferir muitos bytes de dados.
Tipos de sequências de transferência de E/S
Um cliente pode iniciar uma sequência de transferência de E/S de uma destas maneiras:
O cliente pode especificar a sequência inteira em uma solicitação de controle de E/S IOCTL_SPB_EXECUTE_SEQUENCE. Essa solicitação permite que o driver do controlador SPB use quaisquer otimizações de desempenho específicas de hardware disponíveis para executar a sequência de transferência. Para obter mais informações, consulte Single-Request Sequences.
O cliente pode enviar uma solicitação de controle de E/S IOCTL_SPB_LOCK_CONTROLLER para bloquear o controlador no início de uma sequência e enviar um IOCTL_SPB_UNLOCK_CONTROLLER quando a sequência for concluída. Enquanto o controlador está bloqueado, o cliente envia uma solicitação de E/S separada (IRP_MJ_READ ou IRP_MJ_WRITE) para cada operação de leitura ou gravação na sequência. Para obter mais informações, consulte Client-Implemented Sequences.
Sempre que possível, um cliente deve usar a solicitação IOCTL_SPB_EXECUTE_SEQUENCE , que é mais rápida, é menos propensa a erros e diminui significativamente o tempo durante o qual outros clientes são bloqueados para fora do ônibus. No entanto, um cliente poderá usar as solicitações IOCTL_SPB_LOCK_CONTROLLER e IOCTL_SPB_UNLOCK_CONTROLLER se precisar examinar o valor lido durante uma das transferências na sequência antes de iniciar uma transferência posterior na sequência. Nesse caso, o design cuidadoso é necessário para evitar bloquear outros clientes do barramento por mais tempo do que o necessário, e um driver periférico mal projetado pode prejudicar o desempenho geral do sistema.
Sequências de Single-Request
Para melhorar o desempenho, o driver do controlador SPB deve implementar uma função de retorno de chamada EvtSpbControllerIoSequence para lidar com IOCTL_SPB_EXECUTE_SEQUENCE solicitações. Essa abordagem adiciona alguma complexidade ao driver do controlador SPB, mas evita exigir que o cliente execute uma sequência de transferência de E/S como uma série de operações individuais de leitura e gravação enquanto outros clientes estão bloqueados fora do barramento.
Observação
A implementação de uma função EvtSpbControllerIoSequence é altamente recomendada e pode se tornar um requisito para o Windows 8.
A implementação de uma sequência de transferência é semelhante à de uma operação simples de leitura ou gravação, mas também requer atualizações para o estado armazenado da operação de sequência entre as transferências individuais na sequência. Após a conclusão da primeira transferência, o driver do controlador SPB atualiza o estado da sequência para selecionar a próxima transferência na sequência. O estado da sequência é armazenado no contexto do dispositivo e inclui o identificador SPBREQUEST, que é fornecido ao retorno de chamada EvtSpbControllerIoSequence. O driver do controlador SPB usa esse identificador para obter os parâmetros de buffer, comprimento, direção e posição para as transferências individuais na sequência. Para obter mais informações sobre como obter esses parâmetros, consulte SpbRequestGetTransferParameters.
Se o driver do controlador SPB não puder executar a operação de IOCTL_SPB_EXECUTE_SEQUENCE solicitada, ele concluirá a solicitação com um código de falha. Se essa falha ocorrer, o cliente poderá, como opção, bloquear o barramento, executar explicitamente a sequência de transferência de E/S como uma série de solicitações de E/S simples e desbloquear o barramento. Para obter mais informações, consulte Client-Implemented Sequences.
O SpbCx faz verificação de parâmetros em solicitações IOCTL_SPB_XXX que recebe de drivers de dispositivos periféricos. Para solicitações IOCTL_SPB_EXECUTE_SEQUENCE, o SpbCx rejeita sequências vazias e sequências que contêm ponteiros de buffer NULL ou buffers de comprimento zero.
O driver do controlador SPB deve verificar se o comprimento de cada transferência em uma sequência não excede o limite especificado pelo driver. Por exemplo, o driver de exemplo SkeletonI2C no WDK (Windows Driver Kit) falha em uma solicitação IOCTL_SPB_EXECUTE_SEQUENCE que especifica uma transferência que excede 4K bytes e define o código de status dessa solicitação para STATUS_INVALID_PARAMETER. Antes de iniciar uma operação de sequência para uma solicitação IOCTL_SPB_EXECUTE_SEQUENCE, o driver deve validar os parâmetros de todas as transferências na sequência para verificar se a operação pode ser concluída com êxito.
SpbCx nunca precede um retorno de chamada EvtSpbControllerIoSequence com um retorno de chamada EvtSpbControllerLock e nunca segue um retorno de chamada EvtSpbControllerIoSequence com um retorno de chamada EvtSpbControllerUnlock.
Sequências de Client-Implemented
Um cliente de um driver de controlador SPB pode executar explicitamente uma sequência de transferência de E/S como uma série de leituras e gravações simples. O cliente pode ser um controlador em modo kernel ou um controlador em modo de usuário que controla um dispositivo periférico conectado ao barramento. Antes da primeira transferência na sequência, o cliente envia uma solicitação IOCTL_SPB_LOCK_CONTROLLER para o dispositivo de destino para impedir que outros acessos de ônibus não relacionados ocorram entre as transferências na sequência. Em seguida, o cliente envia IRP_MJ_READ e IRP_MJ_WRITE solicitações para executar as transferências na sequência. Por fim, o cliente envia uma solicitação IOCTL_SPB_UNLOCK_CONTROLLER para liberar o bloqueio.
Um cliente pode precisar implementar esse tipo de sequência de transferência de E/S se uma transferência posterior na sequência tiver uma dependência de uma transferência anterior. Por exemplo, a primeira leitura pode indicar quantos bytes mais posteriormente ler ou gravar. No entanto, se essa dependência não existir, o cliente deverá enviar uma solicitação IOCTL_SPB_EXECUTE_SEQUENCE para o driver do controlador SPB, que pode executar a sequência com mais eficiência.
Entre a solicitação IOCTL_SPB_LOCK_CONTROLLER que inicia uma sequência implementada pelo cliente e a solicitação IOCTL_SPB_UNLOCK_CONTROLLER que encerra a sequência, as únicas solicitações de E/S que o cliente pode enviar para o dispositivo de destino são IRP_MJ_READ e IRP_MJ_WRITE solicitações. Qualquer violação dessa regra é um erro.
Os bloqueios SPB são usados apenas para garantir que uma sequência de leituras e gravações seja executada como uma operação de barramento atômico e devem ser usados exclusivamente para essa finalidade.
Para obter mais informações, consulte Manipulando sequências de Client-Implemented.