Aqui está uma afirmação em que acabei de pensar. Alguém pode me dizer se e por que isso é verdade?
Declaração: Como os teclados USB dependem de um driver e arquitetura genéricos USB que só têm acesso a níveis mais baixos de IRQ, ele não pode conceder ao teclado acesso a um IRQ com a prioridade mais alta que outro controlador (por exemplo, PS2).
Isso (se for verdade) significa que os teclados USB teriam prioridade mais baixa (em termos de disponibilidade mais que velocidade) do que os teclados conectados a outro tipo de porta (como PS2)?
Tomemos, por exemplo, um teclado USB mapeado para um IRQ de prioridade média, em um sistema com defeito preso a outra rotina de interrupção de prioridade média. Devido à sua prioridade relativamente igual, os eventos do teclado seriam ignorados e você não poderá enviar Ctrl-Alt-del ou qualquer outro pressionamento de tecla de emergência. Se o teclado tivesse uma prioridade mais alta, o sistema poderia entrar na rotina de interrupção de pressionamento de tecla.
Ou o controlador USB tem um alcance IRQ suficiente (seja contínuo por prioridade ou não) para dar ao teclado a prioridade necessária (basicamente logo abaixo da falta de energia)?
E os teclados virtuais, mapeados através da conexão de rede em uma sessão de área de trabalho remota?
Edição: Minha pergunta não é muito sobre velocidade (veja comentários): a questão principal é: um teclado PS2 tem mais chances de falar com uma CPU que está presa em algum lugar em uma prioridade de interrupção maior que USB e menor que teclado?
fonte
Respostas:
Não se trata da faixa de IRQ, mas de três fatores principais:
No passado, teclados e mouses tinham um IRQ dedicado (IRQ1 para teclados, IRQ12 para mouses PS / 2).
Isso significava que, quando uma tecla era pressionada, ela tinha uma linha quase direta com a CPU (via PIC; mas ainda assim, apenas um salto). Isso permitiu que os eventos do teclado fossem processados muito rapidamente no hardware, principalmente porque ele possuía IRQ1. (É claro que isso é tudo sobre o uso normal do teclado e ignora a linha de redefinição que vai do controlador do teclado diretamente para a CPU.)
Por outro lado, os dispositivos USB compartilham o mesmo barramento e o IRQ do controlador USB (que geralmente é um dos direcionadores de IRQ que são compartilhados com outros dispositivos, como placas de rede, placas de vídeo e outros). Assim, com um teclado USB, os eventos vão do controlador do teclado, através do barramento USB para o controlador host USB, de lá para o PIC secundário, depois para o PIC principal e, em seguida, para os drivers no sistema operacional ou no BIOS , depois na CPU. Além disso, há dados de verificação de erros adicionados aos dados transferidos por USB.
Em outras palavras, simplesmente há mais coisas acontecendo com um teclado USB do que com um teclado AT ou PS / 2. O caminho dos dados é mais longo e há mais dados, e pode até ser necessário passar por software . Mesmo que a largura de banda USB seja suficientemente grande, ter outros dispositivos na mesma porta causa colisões e atrasos (você pode adicionar um hub, mas todas as portas nele ainda têm a mesma porta no controlador). Portanto, há muito mais espera acontecendo.
Além disso, ter seu próprio (IRQ significava que um teclado mais antigo poderia interromper o processamento da CPU sempre que necessário. Com USB, o teclado não possui esse mecanismo e só pode enviar alguns dados e esperar / esperar que o controlador USB interrompa a CPU em algum ponto.
Os teclados virtuais são ainda piores porque eles definitivamente passam por software que, obviamente, não pode competir com uma linha de hardware.
Aqui está uma visualização simples da diferença entre um teclado AT ou PS / 2 e um teclado USB:
fonte
Ctrl+Alt+Del
. t funciona através de uma linha de hardware, mas é processado através de software.Resposta curta
Ambos os teclados teriam desempenho absolutamente igual para o código no nível do usuário. Pode haver pequenas diferenças ( nano a microssegundos em um PC moderno) se você escrever drivers de dispositivo. Se o sistema travar, os dois teclados não resolveriam o problema. Vá para reinicialização completa.
Resposta longa TL; DR;
O que é uma interrupção?
Quando o hardware (ou alguma parte crítica do software interno do SO, como o kernel) requer um serviço de processador, ele aciona uma mensagem ou uma interrupção , solicitando que o processador adie o que está fazendo e atenda a essa solicitação.
Como funciona?
Quando o hardware gera uma interrupção (por exemplo, pressionar uma tecla), essa solicitação entra em um controlador de interrupção. O controlador interrompe imediatamente a CPU em uma única linha de seu código de máquina (a CPU ainda executa esta última linha). Quando o processador está pronto para atender a essa solicitação, solicita a um controlador de interrupção uma solicitação de interrupção (IRQ) e uma rotina de manipulação. O controlador de interrupção possui uma estrutura de dados interna - Tabela de Despacho de Interrupção que contém um ponteiro para uma rotina que deveria ser executada pela CPU para um IRQ específico.
Todas as interrupções diferentes correspondem ao nível de solicitação de interrupção (IRQL) limitado bem definido . Por exemplo, em sistemas x86, existem 32 IRQLs e, em x64 e IA64, existem realmente menos - 16 IRQLs. Claramente, existem mais dispositivos de hardware e serviços de software que os IRQLs, o que significa que todos os objetos do sistema compartilham IRQLs.
Tabela IRQLs para x64
IRQL maior (com número maior) tem prioridade mais alta. Todos os componentes de um sistema tentam manter o IRQL atual de um processador no nível mais baixo possível - 0. Se ocorrer uma interrupção de nível superior, o nível atual de IRQL de um processador é aumentado e as interrupções com nível inferior não serão tratadas até todas as interrupções com níveis mais altos são resolvidas. O IRQ pode ser manipulado em lote se o planejador de IRQ conseguir enfileirar vários IRQs do mesmo nível para execução do processador.
Qual é o ponto?
Tudo isso foi muito bem projetado para separar o usuário final das complexidades do hardware e criar uma arquitetura universal que pode funcionar com muitos tipos de hardware / software.
O código no nível do usuário (ou seja, não no nível do kernel) é executado apenas quando o processador está no IRQL Passivo / Baixo (0). A questão é que você só pode manipular um evento pressionado por tecla em seu aplicativo depois que todos os IRQLs forem manipulados. Portanto, para um teclado, não importa o IRQL atribuído à interrupção do hardware.
IRQL são apenas abstrações de SO e não são definidas . O IRQ e o IRQL correspondentes são armazenados no registro do Windows (por exemplo) e qualquer usuário entusiasmado pode alterá-los manualmente.
Conclusões
Citações da pergunta
Talvez o autor tenha dito um menor IRQL em vez de menos canais de IRQ . De qualquer forma, isso realmente não importa, pois não é visível para o usuário em nenhum PC moderno. As possíveis diferenças são do nível de nano a microssegundos e ocorrem apenas no nível do kernel. Nos dois casos, o código no nível do usuário é bloqueado pelo kernel do SO.
Não é verdade por causa da maneira como o sistema operacional foi projetado. Se o sistema operacional estiver ocupado com algo e for "lento", os dois teclados se comportariam de forma idêntica.
Nesse caso, o sistema terá BSOD, as rotinas de manuseio de IRQ devem ser projetadas de acordo com um determinado padrão (por exemplo, devem ser rápidas, síncronas, sem bloqueio, etc.). Qualquer desvio disso e do kernel será BSOD.
Se o sistema travar, muitas coisas podem dar errado, mas provavelmente o IRQL de pressionamento de tecla será tratado no nível do driver. O problema é que ele não será entregue ao aplicativo que assinou essa notificação, pois o sistema operacional está ocupado fazendo outra coisa.
fonte