Reaprendendo o sistema operacional-15 | Interrupções e vetores de interrupção: Por que linguagens como Java / js podem capturar a entrada do teclado?

índice

Pergunta 1: Qual é o nosso objetivo?

Pergunta 2: Como abstrair botões?

Pergunta 3: como lidar com os pressionamentos de tecla? Usar o processamento do sistema operacional ou deixar que cada programa o implemente sozinho?

Pergunta 4: Qual modelo o programa usa para responder aos pressionamentos de tecla?

Pergunta 5: Ao processar os pressionamentos de tecla do usuário, preciso interromper o programa que está sendo executado?

Pergunta 6: Como o sistema operacional sabe qual tecla o usuário pressionou?

Questão 7: Como a placa-mãe sabe que o teclado está pressionado?

Arranjo de ideias: design interrompido

Tipo de interrupção

Pergunta 1: Por que linguagens como Java / Js podem capturar a entrada do teclado?

Questão 2: É compreensível que o sistema operacional seja capaz de lidar com as teclas do teclado, então também podemos usar o teclado quando ligamos o computador, mas o sistema operacional não foi carregado na memória nesse momento. Como explicar isso?

 


Processo de exploração: como projetar todo o link que responde ao teclado?
Quando você tem um problema, precisa se acalmar para pensar e explorar soluções. Você pode verificar informações, assistir a vídeos ou consultar especialistas, mas antes disso, você deve primeiro pensar e resolver. Algumas perguntas podem ser respondidas diretamente, e algumas perguntas precisam continuar a se aprofundar para encontrar o suporte teórico por trás delas.

Pergunta 1: Qual é o nosso objetivo?

Nosso objetivo é implementar programas de resposta ao pressionamento de tecla em Java / JS. Essa implementação é um pouco como uma instrução Switch-Case - diferentes programas são executados de acordo com diferentes teclas, como pressionar a tecla Enter para embrulhar e pressionar as teclas esquerda e direita para mover o cursor.

Pergunta 2: Como abstrair botões?

Geralmente, não há mais de 100 teclas no teclado. Portanto, podemos considerar o uso de um byte de dados para descrever qual tecla o usuário pressiona. O botão tem duas operações, uma é pressionar e a outra é soltar.Estas são duas operações diferentes. Para um byte de 8 bits, considere usar o 1 mais significativo para descrever o estado pressionado ou liberado e, em seguida, os 7 bits a seguir (0 ~ 127) descrevem qual tecla foi pressionada. Desta forma, desde que determinemos a sequência de chave / liberação do usuário, não haverá ambigüidade para nosso sistema.

Pergunta 3: como lidar com os pressionamentos de tecla? Usar o processamento do sistema operacional ou deixar que cada programa o implemente sozinho?

O processamento de chaves é um programa geral e você pode considerar parte do processamento primeiro pelo sistema operacional, como:

Quando o usuário pressiona a tecla Enter, o sistema operacional primeiro executa um pacote unificado e, em seguida, converte o código da chave na string Enter para facilitar o uso de vários programas.

É melhor para o sistema operacional realizar o cálculo primeiro para processar a operação da chave de combinação. Como a camada inferior conhece apenas a chave e a liberação, a chave de combinação deve ser avaliada pelo fator de tempo.

Você pode pensar na seguinte situação como uma combinação de teclas Ctrl + C. Esse comportamento pode ser tratado de maneira uniforme pelo sistema operacional, conforme mostrado abaixo:

按下 Ctrl
按下 C
释放 Ctrl
释放 C

Pergunta 4: Qual modelo o programa usa para responder aos pressionamentos de tecla?

Quando um aplicativo escrito em Java ou JS deseja responder aos pressionamentos de tecla, o modelo de mensagem deve ser considerado. Porque se o programa continuar a escanear as chaves, isso trará uma grande carga para todo o sistema. Por exemplo, se o programa escrever um loop while para verificar se há pressionamentos de tecla, isso custará muito. Se o programa registrar uma função que responde a pressionamentos de tecla no sistema operacional, essa função será executada apenas quando os pressionamentos de tecla forem realmente acionados, o que pode reduzir a sobrecarga.

Pergunta 5: Ao processar os pressionamentos de tecla do usuário, preciso interromper o programa que está sendo executado?

Em termos de experiência do usuário, o pressionamento de teclas deve ser uma operação de alta prioridade.Por exemplo, quando o usuário pressiona Ctrl + C ou Esc, pode ser porque o usuário deseja interromper o programa em execução no momento. Mesmo se o usuário quiser apenas inserir, devemos concentrar os recursos para o usuário o máximo possível, porque não queremos que o usuário sinta o atraso.

Se você precisa considerar que o programa será interrompido a qualquer momento para responder a outras situações de prioridade mais alta, então este comportamento deve ser apoiado na parte inferior da execução do programa, e é melhor apoiá-lo no nível do hardware, que é o mais rápido. Isso nos leva ao protagonista desta interrupção da aula. Para obter detalhes sobre como lidar com isso, consulte nossa análise na parte de interrupção abaixo.

Pergunta 6: Como o sistema operacional sabe qual tecla o usuário pressionou?

Há uma pergunta semelhante à pergunta 5. O sistema operacional aciona continuamente a leitura das teclas do teclado ou aciona um programa pertencente ao sistema operacional toda vez que surge uma tecla do teclado?

Obviamente, o último é mais eficiente.

Então, quem pode interromper o programa do sistema operacional a qualquer hora e em qualquer lugar? Quem tem essa autoridade? É uma conta de administrador? Claro que não, a própria máquina deve ter um alto nível de autoridade.

Vamos pensar neste modelo, cada vez que o usuário pressiona uma tecla, uma habilidade da CPU é acionada.Esta habilidade irá interromper o programa que está sendo executado para processar o botão. Deve haver um programa para processar botões dentro da CPU? Isso definitivamente não funcionará, porque esperamos que a CPU seja usada para cálculos.Se a CPU tiver seu próprio programa, isso complicará o problema. Isso é chamado de acoplamento no design de software. O trabalho da CPU é se concentrar na execução das instruções com eficiência.

Portanto, toda vez que uma tecla é pressionada, deve haver um mecanismo para notificar a UCP. Podemos pensar em usar o barramento para notificar a CPU, ou seja, a placa-mãe está notificando a CPU.

Então, como a CPU notifica o sistema operacional após receber a notificação? A CPU pode apenas interromper o programa em execução e, em seguida, alternar para outro programa que precisa ser executado. Para ser franco, é mudar o ponteiro do PC.A CPU tem apenas uma maneira de mudar o programa executado. Aqui, gostaria de pedir que você pensasse, há apenas uma maneira: a CPU interrompe o programa atualmente em execução e, em seguida, executa outro programa para alterar o ponteiro do PC?

A seguir, vamos pensar mais, como a CPU sabe para quanto o ponteiro do PC deve ser definido? A CPU sabe a localização do programa no qual o sistema operacional responde aos pressionamentos de tecla?

A resposta é claro, não saber.

Portanto, só podemos controlar a CPU para saltar para uma posição fixa. Por exemplo, assim que a CPU recebe informações da placa-mãe (uma tecla é acionada), a CPU interrompe imediatamente o programa em execução no momento e define o ponteiro do PC para 0. Ou seja, o ponteiro do PC lerá a próxima instrução do endereço de memória 0 na próxima etapa. Claro, este é apenas um dos nossos pensamentos e é necessária uma consideração mais aprofundada. O que o sistema operacional precisa fazer é escrever uma instrução no endereço de memória 0, por exemplo, deixar o ponteiro do PC saltar para a posição onde ele processa o programa-chave.

Dito isso, vamos resumir, o que a CPU deve fazer é mudar o ponteiro do PC (equivalente a interromper o programa em execução) assim que vê a interrupção, e quanto o PC muda para pode ser avaliado de acordo com os diferentes tipos , como pressionar um botão. 0. O sistema operacional escreverá instruções nesses locais específicos e, quando ocorrer uma interrupção, ele assumirá o controle do programa, ou seja, permitirá que o ponteiro do PC aponte para o programa que o sistema operacional controla as teclas digitadas.

Questão 7: Como a placa-mãe sabe que o teclado está pressionado?

Depois de cavar camada por camada, "Como projetar todo o link que responde ao teclado?" O sistema operacional atual tem sido capaz de assumir os botões. Em seguida, precisamos pensar em como a placa-mãe sabe que há botões e informa o CPU.

Você pode pensar em uma tecla do teclado como o pressionamento de um determinado botão, e precisamos de um chip para converter as informações da tecla no valor de uma tecla específica. Por exemplo, quando o usuário pressiona a tecla A, em que a tecla de linha e coluna A está ativada, isso pode ser considerado um sinal elétrico. Então, precisamos do chip para converter esse sinal elétrico em um número específico (um Byte). Após a conversão ser concluída, a placa-mãe pode receber este número (código de chave), então escrever o número em um de seus próprios registros e notificar a CPU.

Para facilitar o cálculo da CPU, após a CPU receber a notificação da placa-mãe, o código-chave será armazenado em um registro, o que facilita a execução do programa de pressionamento de tecla.

Arranjo de ideias: design interrompido

O design geral é dividido em 3 camadas, a primeira camada é o design do hardware, a segunda camada é o design do sistema operacional e a terceira camada é o design da linguagem de programação.

A coleção de códigos-chave é a capacidade do chip do teclado e da placa-mãe. Depois que a placa-mãe sabe que existe um novo botão, ela informa à CPU que a CPU interromperá o programa em execução no momento e pulará o ponteiro do PC para uma posição fixa, que chamamos de interrupção.

Considerando que haverá vários eventos no sistema, precisamos determinar a localização do salto do ponteiro do PC de acordo com o tipo de interrupção.A localização do salto do ponteiro do PC pode ser diferente dependendo do tipo de interrupção. Por exemplo, programas-chave, programas prontos para impressora, exceções do sistema, etc., todos precisam ser interrompidos. Por exemplo, as chamadas do sistema também precisam interromper o programa que está sendo executado e alternar para o modo kernel para executar o programa kernel.

Portanto, precisamos classificar os diferentes tipos de interrupções.Este tipo é chamado de identificador de interrupção . Por exemplo, para um botão, podemos considerar o uso do número 16. O número 16 é o código de identificação do tipo de interrupção do botão. Quando diferentes tipos de interrupções ocorrem, a CPU precisa saber para qual endereço o ponteiro do PC deve pular.Este endereço é chamado de Vetor de Interrupção .

Você pode considerar tal implementação: quando a interrupção número 16 ocorre, o ponteiro do PC da máquina de 32 bits salta diretamente para o local da memória do endereço de memória 16 * 4. Se o projeto tiver um máximo de 255 interrupções, o número vai de 0 a 255, apenas 1K de endereço de memória é necessário para armazenar o vetor de interrupção - este espaço de 1K é chamado de tabela de vetor de interrupção.

32 bits são exatamente 4 bytes, o que significa que 255 4 bytes podem armazenar toda a tabela de vetores.

Portanto, após receber a interrupção, a CPU opera o ponteiro do PC de acordo com o tipo de interrupção para encontrar o vetor de interrupção. O sistema operacional deve modificar o vetor de interrupção e inserir uma instrução antes disso. Por exemplo, o sistema operacional grava uma instrução Jump aqui para saltar o ponteiro do PC para o programa que lida com o tipo de interrupção correspondente.

Depois que o sistema operacional assumir, tomando o programa de pressionamento de tecla como exemplo, o sistema operacional executará algum processamento, incluindo o seguinte:

Coloque o botão em uma fila e salve-o. Isso ocorre porque o sistema operacional não pode garantir o processamento de todas as chaves em tempo hábil. Por exemplo, quando as chaves são muito rápidas, elas precisam ser armazenadas primeiro e, em seguida, processadas lentamente no compartilhamento de tempo.

Calcule a combinação de teclas. Você pode usar a relação de tempo entre pressionar e soltar.

Após um determinado cálculo, o botão é abstraído em uma mensagem (estrutura de evento ou objeto).

Fornece API para o aplicativo, para que o aplicativo possa monitorar as mensagens processadas pelo sistema operacional.

Distribuir mensagens de teclas pressionadas para programas que monitoram teclas pressionadas.

Portanto, o programa está no nível de linguagem, como linguagens com máquinas virtuais como Java / Node.js, só precisa fazer interface com a API do sistema operacional.

Tipo de interrupção

De acordo com a parte acionadora da interrupção, ela é dividida em interrupção síncrona e interrupção assíncrona ;

Conforme a interrupção é forçada a disparar, ela é dividida em interrupção mascarável e interrupção não mascarável .

As interrupções podem ser acionadas diretamente por instruções da CPU. Essas interrupções ativamente acionadas são chamadas de interrupções síncronas . Existem vários casos de interrupção síncrona.

  1. A chamada do sistema precisa mudar do modo de usuário para o modo kernel. Nesse caso, o programa precisa acionar uma interrupção, chamada trap. Depois que a interrupção é acionada, a chamada do sistema precisa continuar.
  2. Também há uma interrupção de sincronização incorreta (falha), geralmente por causa de algum erro ser detectado, é necessário acionar uma interrupção, a interrupção após a resposta será executada novamente no local que acionou o erro, como páginas perdidas interromper falha de página .
  3. Exceções de programa, esta situação é semelhante ao Trap, usado para implementar exceções lançadas pelo programa.

Outra parte da interrupção não é acionada diretamente pela CPU, pois ela precisa responder a notificações externas, como interrupções acionadas por dispositivos como teclados e mouses. Esse tipo de interrupção é chamada de interrupção assíncrona.

A CPU geralmente suporta a configuração de um bit de máscara de interrupção (um registro). Após configurá-lo para 1, a CPU não responderá mais às interrupções temporariamente . Para entrada de teclado e mouse, como armadilhas, erros, exceções, etc., serão blindados temporariamente. Mas para algumas interrupções particularmente importantes, como interrupções de desligamento causadas por falhas de CPU, elas ainda serão acionadas normalmente. As interrupções que podem ser mascaradas são chamadas de interrupções mascaráveis, e a maioria das interrupções são interrupções mascaráveis.

Isso também pode explicar porque alguns programas não podem ser encerrados com ctrl + c.

Pergunta 1: Por que linguagens como Java / Js podem capturar a entrada do teclado?

Para capturar a entrada do teclado, a camada de hardware precisa abstrair as teclas em interrupções e interromper a execução da CPU. A CPU encontra o vetor de interrupção correspondente de acordo com o tipo de interrupção. O sistema operacional pré-configura o vetor de interrupção, de forma que o sistema operacional assume o programa após a ocorrência de uma interrupção. O sistema operacional implementa um algoritmo básico para analisar pressionamentos de tecla, abstrai pressionamentos de tecla em eventos de teclado, fornece uma fila para armazenar várias teclas e também fornece uma API para monitorar pressionamentos de tecla. Portanto, os aplicativos, como a máquina virtual Java / Node.js, podem usar eventos de teclado chamando a API do sistema operacional.

Questão 2: É compreensível que o sistema operacional seja capaz de lidar com as teclas do teclado, então também podemos usar o teclado quando ligamos o computador, mas o sistema operacional não foi carregado na memória nesse momento. Como explicar isso?

Geralmente, há uma versão simplificada do sistema operacional em uma ROM da placa-mãe, chamada BIOS (Basic Input / Ouput System). Antes que o sistema operacional assuma o controle do computador, o BIOS gerencia a máquina e auxilia no carregamento do sistema operacional na memória. O sistema operacional anterior também usava os recursos do BIOS. Depois que o sistema operacional moderno assumiu o controle, ele substituiria o vetor de interrupção do BIOS.

 

 

Acho que você gosta

Origin blog.csdn.net/MyySophia/article/details/114044259
Recomendado
Clasificación