Sobre a operação de um PC usando o exemplo do Windows 10 e o teclado da Parte 2

Nesta parte, consideraremos para que lado as informações sobre a tecla pressionada do teclado até a CPU, haverá muitas fotos e essa não é a última parte. Vou falar sobre isso do ponto de vista de um programador que escreve no modo de usuário - programas de usuário, web, aplicativos móveis - portanto, pode haver imprecisões. É improvável que as pessoas envolvidas em eletrônicos encontrem algo útil para elas mesmas. A primeira parte está aqui .


O problema do ensino superior para programadores é que os alunos estudam em detalhes aspectos individuais retirados do contexto sem entender como isso tudo se encaixa. Vários semestres de matemática superior para entender física, para entender engenharia elétrica, eletrodomésticos, montadores, sistemas operacionais, algoritmos, programação de sistemas e um monte de outras disciplinas envolvidas em um programa padrão de cinco anos. A abundância de detalhes e ninguém explica como isso se encaixa no quadro geral, pressupõe-se que, após 5 anos, o aluno o prenda na cabeça e depois trabalhe com o .Net e nunca toque nos modos eletrônico e de kernel. Acredito que não é necessário conhecer com tanto detalhe o funcionamento de um computador, basta ter um entendimento geral do que está acontecendo na pilha tecnológica. Se as pessoas que compunham os programas de treinamento para universidades abriram escolas de condução,você aprenderia russo, caligrafia e hidrodinâmica, porque precisa se comunicar com os inspetores, trocar fluidos e escrever notas explicativas. Haverá algumas imprecisões no artigo, portanto não será adequado para a aprovação no exame em disciplinas especializadas, mas depois será mais fácil entender o dispositivo do PC.

Sob tráfego de gatos.

Uma tecla do teclado é um botão que fecha os contatos e uma corrente elétrica passa por eles. O mecanismo de fechamento / abertura é feito de forma que o botão não precise ser pressionado completamente, pois, caso contrário, os dedos se cansarão rapidamente e o teclado não será ergonômico. Na seção, a chave se parece com isso. No lado direito, está o contato ao qual a tensão é aplicada.


O "cérebro" do teclado que pode determinar o pressionamento de tecla é um microcontrolador , que é essencialmente um mini-computador com um programa que verifica cada tecla aplicando tensão a ela e, se ela passar, a tecla será pressionada. As pernas do microcontrolador têm nomes próprios e podem ser acessadas em código; são usadas para se comunicar com o mundo exterior. As pernas podem controlar a operação do microcontrolador, relatar o status do chip ou servir para ler / transmitir dados.
O programa ( firmware ) pode ser escrito em C ou assembler, é carregado no microcontrolador através do programador . É um dispositivo com um conector para instalar um microcontrolador e pode ser conectado a um computador via USB, no qual um software especial está sendo executado. Aqui está a aparência do programador na vida real:
Através do programa, cada perna pode ser configurada ou medida da tensão. O algoritmo para encontrar a tecla pressionada é aplicar tensão a uma perna e medi-la na outra, e se a tecla foi pressionada, a segunda perna terá aproximadamente o mesmo volt da entrada. Assim, em um loop infinito, todas as chaves são verificadas. Como regra, o teclado possui 80-110 botões e o controlador de contato (pinos) é muito menor. Portanto, eles usam uma abordagem como a "matriz do teclado" - todas as chaves são distribuídas em colunas e linhas, e o algoritmo é reduzido para encontrar uma coluna que cruza a linha à qual o programa aplicou a tensão. A correspondência de coluna / linha para contatos é destacada aqui.


Na realidade, a matriz pode ser assim. À esquerda é industrial e à direita é caseira.


No pseudocódigo, a parte do programa de firmware que determina as teclas pressionadas pode ser assim.

for (int i = 0; i < COLSC; i++) {
 	SetPower(columns[i], 3.0 f);
  	for (int j = 0; j < ROWSC; j++) {
    		float power = GetPower(rows[j]);
    		if (power >= 3.0f - THRESHOLD) {
      			BYTE key = keys[i, j];
      			SendKey(key);
    		}
  	}
}

Cada tecla corresponde a um código de verificação, é padronizada e é um número de 8 bits, ou seja, um byte. Portanto, quando a tecla Y for pressionada, o controlador do teclado precisará enviar o número 21 (0x15) e, quando liberado - 149 (0x95). Como é feita a remessa? Certamente você trabalhou com JSON, serviços da Web ou enviou dados entre processos e sabe que para enviar dados é necessário serializar , ou seja, transformar em uma matriz de bytes ou texto formatado que o destinatário possa desserializar , ou seja, recrie um objeto em seu espaço de endereço. E o que pode serializar dados em um nível tão baixo? Precisamos transferir apenas 1 byte (8 bits). Olhando para o futuro, direi que transmitiremos dados pouco a pouco.

Em matemática, existe uma fórmula que pode converter qualquer número decimal que nos seja familiar em uma sequência de zeros e uns e vice-versa. Esta fórmula encontrou aplicação em tecnologia de computadores. Na primeira parte, mencionei casualmente que a tecnologia analógica explora as leis da física, enquanto o digital funciona no nível de zeros e uns. Isso significa que um telefone analógico codifica todo o espectro de uma voz humana em uma sequência de ondas eletromagnéticas, e um telefone digital usa um microchip que converte uma voz humana em dados digitais, por exemplo, em arquivos WAV, e depois os transfere em uma sequência de zeros e outros na forma de ondas eletromagnéticas. Somente neste caso, em vez de todo o espectro da voz, apenas dois valores devem ser representados - 0 e 1. Eles podem ser representados por ondas de comprimentos diferentes, tensões diferentes,pulsos de luz através da fibra óptica, listras preto e branco no papel, orifícios no cartão perfurado.

O código de varredura da tecla Y pressionada no binário se parece com 0001 0101. Nós os transmitiremos ao longo da perna do microcontrolador responsável pelos dados ( DATA ). A unidade lógica é 3.3V ou superior, zero lógico- tensão é de cerca de 0V. Aqui está o problema - como passo três zeros seguidos? Para fazer isso, precisamos de uma segunda etapa que chamaremos de CLOCK, quando nela significa que a sessão de transmissão de um bit começou e o zero terminou. Essa mudança nos valores (tensões) ocorrerá com um determinado intervalo de tempo, digamos 50 nanossegundos, porque no outro extremo existe um segundo microcontrolador que trabalha em sua própria velocidade e escuta as pernas às quais CLOCK e DATA estão conectados em um loop sem fim. Neste exemplo, assumirei que o teclado está conectado através do conector PS2, que é mostrado abaixo. Através da porta USB, o algoritmo de transferência será diferente. Como você pode ver, a porta PS2 possui pinos chamados Data, Clock.Além deles, há também um contato através do qual o controlador de porta PS2 distribui a tensão de 5V necessária para a operação do teclado e um contato de terra, que é simplesmente exibido no corpo do teclado. Outros contatos não são usados.
A porta PS / 2 é chamada de barramento serial , porque transmite os bits um por um (uma sequência de bits). A porta paralela transmite dados de uma só vez para vários contatos e pode transferir, por exemplo, um byte (8 bits) de uma vez para uma sessão de transferência de dados.

Qual é a diferença entre uma porta, um barramento e um protocolo? Um barramento, como uma porta, é um conjunto de contatos (fiação) e um acordo sobre como usá-los, apenas a porta possui uma conexão para conectar dispositivos externos e o barramento é usado para comunicar componentes na placa-mãe. Uma porta é essencialmente um barramento com um conector no meio. Um protocolo é uma interação através de contatos. No exemplo com PS / 2, essa era a ordem de transferência de dados através dos contatos Relógio e Dados.

Anteriormente, o microcontrolador Intel 8042 era muito comum e era usado tanto no teclado quanto como um controlador de porta PS2, ou seja, dois chips idênticos trocaram dados. O driver da porta PS2 no Windows é chamado 8042prt.sys.

De fato, transmitimos não 8 bits, mas 11, porque os dados são transmitidos como um pacote ou mensagem de dados . Outros 3 bits indicam o início e o fim dos dados - um zero no início e 0 1 no final, um protocolo para transferir dados do dispositivo para o host no PS2. Pode parecer com a função SendKey no pseudo-código, se você preferir entender o código. Ele envia dados sobre a tecla pressionada através do barramento PS2.


void SendBit(BYTE bit) {
	float power = (bit != 0) ? 3.3f : 0.0f;
	SetPower(DATA, power);
	SetPower(CLOCK, 3.3f);
	Sleep(50);
	SetPower(CLOCK, 0.0f);
	Sleep(50);
}

void SendData(BYTE data) {
	SendBit(0);
	
	for (BYTE i = 0; i < sizeof(BYTE); i++) {
		BYTE bit = (data >> i) & 1;
		SendBit(bit);
	}

	SendBit(0);
	SendBit(1);
}

Nem sempre é necessário definir manualmente a tensão em cada perna individualmente para transferência de dados. Em alguns casos, o valor armazenado no registro é exibido automaticamente nos contatos.

No gráfico, essa transferência de dados será visualizada da seguinte maneira. O tempo é ao longo do eixo X, a tensão é ao longo do eixo Y.


Na tecnologia analógica, o sinal pode estar distorcido, isto é, o fio não está conectado a nada, mas o voltímetro mostra 0,5V nele devido ao fato de haver um campo eletromagnético próximo. Portanto, o conceito de tensão limite é usado. Se a tensão for menor que o limite, assumimos que obtivemos um zero lógico, caso contrário, a unidade. Levando em consideração possíveis distorções, o código de digitalização da tecla Y pressionada pode ser assim:


Antes de examinarmos de perto como os dados do teclado chegam à CPU, vamos falar sobre microchips , barramentos e placas - mãe .

Microcontroladores e microcircuitos


O microcontrolador pode executar um programa costurado nele, possui uma certa quantidade de memória RAM e um local para armazenar dados e código do programa. No chip, o programa pode ser definido na fase de design. A criação manual de um circuito elétrico implementando um algoritmo consome muito tempo e, portanto, uma linguagem de programação especial chamada VHDL (Linguagem de Descrição de Hardware) pode ser usada para projetar microcircuitos . Esta é uma linguagem de programação de alto nível que é traduzida em um plano de circuito, é executada através de um programa que encontra a localização ideal dos elementos de rádio no quadro e é feita, finalmente, em forma física. As imagens são apenas para fins ilustrativos.



Como os dados e comandos são representados em microchips e microcontroladores? A base da tecnologia computacional é um transistor, que a humanidade aprendeu a fabricar em dimensões microscópicas. Um transistor é um elemento de rádio que possui três pernas: uma entrada, uma saída e entre eles um controle que abre ou fecha uma corrente entre duas pernas. A figura abaixo ilustra a operação do transistor, a água ilustra a corrente.


A tensão é aplicada à perna de entrada; se o controle tiver tensão, a corrente passa para a saída; caso contrário, haverá 0V. Tendo 8 transistores, cada um dos quais com um LED conectado à saída que acende ou não, podemos imaginar 256 combinações únicas (2 à potência de 8). Lapochki são interpretados da direita para a esquerda, bem como números decimais. Os dígitos inferiores estão à direita.
Essa. uma lâmpada representa um bit de informação (0 ou 1) e oito lâmpadas correspondem a um byte. É possível criar operadores lógicos AND, OR, NOT, XOR em transistores.


Por exemplo, no circuito do operador AND (à esquerda na figura acima), a saída só terá voltagem se as duas voltagens de entrada forem diferentes de zero. Alguém já inventou algoritmos para adição, multiplicação, divisão e subtração com base em operações lógicas bit a bit e mudanças de bits. Os fabricantes de chips precisam apenas implementá-los. A operação do algoritmo de adição bit a bit é ilustrada abaixo; não iremos analisá-lo:


Os nanotransistores são microscópicos e podem ser colocados na placa aos milhões. O processador Intel é mostrado abaixo e como pode ser a aparência de um de seus núcleos. A imagem é ilustrativa.


Os microcircuitos podem conter um microcontrolador na mesma placa e no mesmo caso.

Pneus


Normalmente, nos livros didáticos, os pneus são mostrados como setas em negrito, como na figura abaixo. Isso é feito para não desenhar todas as conexões dos contatos, que podem ser muitas. A operação do barramento PS2 é muito simples, tudo o que você precisa é de três pinos. Mas existem ônibus que, por exemplo, têm 124 contatos para transferência de dados.



Existem os seguintes tipos de pneus:
  • Os bits de dados nesses contatos são interpretados como dados: número, símbolo, parte de uma imagem ou outros dados binários. A largura do barramento afeta a taxa de transferência, o número de bits transmitidos por segundo
  • Endereços - os bits desses pinos são interpretados como um endereço físico na memória. A largura desse barramento determina a capacidade máxima de RAM suportada.
  • — . CPU RAM I/O.
  • . , . ATX 24 Pin 12V PSU Connector, .


Um pneu pode consistir em substratos , isto é, alguns contatos são usados ​​para dados, outros para endereços, outros para controle e contatos para os quais a energia é transmitida. A abordagem em que os mesmos contatos são usados ​​alternadamente para transmitir dados e endereços é chamada de multiplexação . Por exemplo, o processador Intel 8086 possui um barramento de dados e endereço de 20 bits. No diagrama de pinos, seus contatos são indicados por AD0-AD19 (pernas 16-2 e 39-35).


Em um caso mais complexo, podemos ter vários microcircuitos conectados aos mesmos contatos. Para comunicação normal, eles precisam de um chip adicional que determine quem em que ponto do tempo os poderá usar, chamado de controlador de barramento.. Na figura abaixo, um barramento esférico no vácuo: quatro microcontroladores idênticos transmitem dados ao microcontrolador consumidor através do controlador de barramento. O fio vermelho é a tensão que o controlador de barramento distribui para todos os chips conectados a ele. Os dados são transmitidos através dos fios verdes e a “negociação” com o controlador de barramento é realizada, e o fio azul é Clock, através do qual o controlador de barramento sincroniza a comunicação dos controladores, porque eles podem operar em velocidades diferentes. Se a unidade lógica estiver no fio azul, o chip autorizado a usar o barramento poderá executar um ato de interação com o mundo exterior - leia um pouco, por exemplo.


O controlador de barramento pode ser considerado como um componente integral, porque a comunicação com o mundo externo passará por ele e quantos chips ou dispositivos externos reais realmente estão no barramento não são importantes. Para transferência de dados, a placa-mãe possui uma extensa rede de barramento. Apesar do grande número de chipsets, eles geralmente seguem um layout típico, porque todos os dispositivos conectados à placa-mãe são divididos em:
  • Lento - teclado, disco rígido, placa de rede, áudio etc.
  • Rápido - CPU, RAM, GPU.
Com base nessa divisão, a placa-mãe possui dois chips principais - a Ponte Sul , que coordena o trabalho de todos os dispositivos lentos, e a Ponte Norte, para coordenação de dispositivos rápidos. Nos computadores modernos, o Northbridge está localizado na própria CPU e o Southbridge pode ser chamado de Platform Controller Hub, mas isso não muda a essência. Ambas as pontes são interconectadas por um barramento através do qual se informam sobre eventos significativos. De particular interesse é o gerador de relógio pelo qual o processador, a RAM e a placa gráfica sincronizam seu trabalho, o mesmo fio azul. Overclockisso está essencialmente alterando as configurações do BIOS para que a sincronização ocorra com mais frequência, enquanto o hardware, principalmente a CPU, esquenta mais, consome mais energia e desenvolve mais rapidamente seus recursos. O oposto é o relógio quando a velocidade diminui para economizar energia da bateria ou reduzir o ruído.

Um chipset é um conjunto de chips que foram projetados para funcionar entre si. Eles fornecem comunicação entre os componentes na placa-mãe e fornecem funcionalidades como temporizadores. O chipset funciona com apenas uma marca de processador; a AMD não pode ser inserida na placa-mãe com o chipset Intel; eles ainda têm contatos diferentes. O diagrama da placa-mãe é apresentado abaixo:
Deseja um exemplo de encapsulamento de hardware? Os chipsets Intel têm um chip chamado Super IO , é mostrado na figura abaixo e é conectado à ponte sul através do barramento LPC. LPC é o nome inteligente para a fiação CLOCK, DATA, VCC (POWER). Esse chip contém a emulação de todos os chips antigos que já foram usados ​​para periféricos, incluindo o chip 8042 que foi usado para a porta PS2. Há também um emulador de controlador de porta para disquete e outras relíquias que interferem no progresso. No diagrama geral da placa-mãe, o Super IO e o barramento LPC são indicados acima .


A moderna porta PS2 se conecta diretamente ao chip Super I / O. Verde é o teclado, roxo é o mouse. Anteriormente, ele era conectado ao microcontrolador Intel 8042.


A placa-mãe é feita de dielétrico, ou seja, material que não conduz corrente. A corrente pode passar apenas pelas linhas impressas no quadro. A placa-mãe possui muitas camadas, cada uma com seus próprios contatos impressos e, portanto, se você perfurar a placa-mãe onde as linhas não são visíveis, poderá estragá-la danificando os contatos invisíveis dentro da placa. Agora você pode dar uma olhada no processo de distribuição de dados do PS2 para a CPU.

A estrada do PS2 para o processador


Normalmente, a arquitetura do computador é considerada no processador 8086. Por um lado, isso é correto, porque é bastante simples comparado às CPUs modernas e, por outro lado, está errado, porque é antigo e não reflete a arquitetura de uma máquina moderna. O Intel 8086 não precisava de pontes, porque era tão lento que podia funcionar com periféricos em um barramento, ou seja, em uma frequência. Não conheço os modernos conjuntos de chips e CPU, então vou explicar sobre os fictícios que se assemelham aos reais. No meu exemplo, haverá uma CPU fictícia muito semelhante à Intel 8086. O chip Super IO possui mais de cem contatos e existe documentação na Internet, mas não vejo o ponto de determinar quais pinos o teclado e o barramento LPC realmente usam para se comunicar com South Bridge. O principal é o princípio, que pode ser implementado de diferentes maneiras.

Vamos dar uma rápida olhada na foto para lembrar que já passamos. As setas verdes indicam o caminho que vamos seguir.


Portanto, os dados do teclado já chegaram ao controlador de porta PS2, que já foi um chip Intel 8042, e agora é emulado pelo chip Super IO. E agora vamos analisar o curso de ações adicionais na minha placa-mãe fictícia com uma CPU fictícia. O controlador PS2 recebeu um código de varredura da tecla Y pressionada e agora fornece tensão ao sinal de contato (linha roxa, veja a figura abaixo) na qual o controlador de interrupção programável deve notificar sobre os dados do teclado. Esse sinal é transmitido de um chip para outro até que a ponte norte o passe ao gerente de interrupção.


Controlador de interrupção programável é um Intel 8259 de chips em que 8 pés (seus nomes IRQ0-IRQ7) são reservadas para receber notificações de determinadas portas ( I nterrupt R e Q uest). Um teclado está vinculado ao pino IRQ1, IRQ7 a uma impressora, disquete a algum pino, placa de som, portas paralelas e outras . Obviamente, pode haver muito mais do que oito dispositivos, portanto, uma técnica como cascata foi usada quando outro PIC semelhante foi conectado a uma perna com o nome IRQ2, no qual a contagem não começou de 0, mas 7. O mouse está vinculado ao IRQ12, ou seja, pé IRQ5 no segundo PIC.

O controlador de interrupção agora deve notificar a CPU do evento no teclado. Isso acontece da seguinte maneira:
  1. INT (Interrupt) , INTR (Interrupt Request) . CPU , , .. . , . exception .
  2. INTR, .
  3. ( D0-D7) , . PIC ( IRQ).

    , ? . . — (x, y, z, w). .
  4. CPU AD0-AD7 , . IDT (Interrupt Descriptior Table) , , . CPU .

    . . , IDT C# .

    struct IDT_entry{
    	unsigned short int offset_lowerbits;
    	unsigned short int selector;
    	unsigned char zero;
    	unsigned char type_attr;
    	unsigned short int offset_higherbits;
    };
     
    struct IDT_entry IDT[256];
    
  5. , INTA (Interrupt Acknowledged).

O manipulador de interrupção do teclado no código mais simples ficará assim. Ele chama um comando que sinaliza a conclusão do processamento de interrupção, ou seja, envia um sinal para o pé INTA.

void irq1_handler(void) {
	  outb(0x20, 0x20); //EOI
}

Você pode aprender mais sobre como a tabela de vetores de interrupção é configurada no osdev .

Agora sabemos como ocorreu a interrupção, mas não sabemos como o manipulador de interrupção lê informações sobre a tecla pressionada. Do ponto de vista do software, a porta PS2 é dois registros, só que eles não são acessados por nomes ou endereços na memória pelo número da porta I / O . Esses dois registros de byte único são atribuídos às portas 0x60 e 0x64, o primeiro (0x60) conterá o código de verificação da chave. A segunda porta é usada para transferir status e comandos para a porta PS2 (não o teclado!). O conjunto de arquitetura x86 instrução tem o comando IN storeTo , fromPortNumque lê o valor da porta de E / S especificada no registro especificado. Por exemplo, IN AL, 0x60 salvará os dados do teclado no registro AL. Pode funcionar algo como isto:

  1. No processador que estamos considerando, existem pernas AD0-AD20, elas podem ser usadas para indicar o endereço e os dados. Este é um barramento de dados e um barramento de endereços. Além deles, há várias pernas de controle, por exemplo, pino nº 28 (S2), cujo valor indicará para a ponte norte onde a leitura ocorrerá - a partir da memória ou de um dispositivo de entrada / saída. O comando IN define o valor aqui falando sobre o dispositivo de E / S.
  2. CPU (- AD0-AD20) 0110 0000, 0x60. CPU , . , - , - . 0x60 SuperIO , - .
  3. Super IO . 0x60 PS2, .
  4. . Intel 8042, SuperIO, LPC , . .. , .
  5. CPU (- 8 AD0-AD20).
  6. CPU AL. .

Todo esse algoritmo funciona em escala de nanossegundos e, portanto, é executado quase instantaneamente, mesmo que o processador tenha passado algum tempo aguardando a operação de E / S.

Como agora você entende a leitura de dispositivos externos, mesmo como memória RAM, etc. CPU é bastante lenta. Essa lentidão pode ser percebida escrevendo um programa que imprime 10.000 linhas em um arquivo linha por linha, em vez de copiá-las para o buffer e salvar imediatamente. O disco rígido está conectado à ponte sul e, dentro dela, também existe um controlador que controla o posicionamento direto dos dados.

A RAM está conectada à CPU através do barramento e a leitura demora algum tempo. Para acelerar a CPU, ela possui um cache, ou seja, A área na qual os transistores estão localizados, representando dados que em breve serão necessários ou usados ​​com frequência, sua leitura é muito mais rápida que na placa de RAM, que se comunica com a CPU através da Ponte Norte. A RAM é chamada de memória de acesso aleatório dinâmico , porque os capacitores são usados ​​para representar dados nela. Um capacitor é um elemento de rádio que, como uma bateria, mantém a carga por um tempo até que esteja completamente descarregada. Somente aqui a descarga ocorre muito rapidamente. Portanto, os capacitores devem ser recarregados, isso acontece instantaneamente, basta aplicar tensão. Capacitor carregado - lógico 1, caso contrário 0. Para a memória cache é usadaRAM estática, ou seja, ele não precisa ser recarregado e, portanto, funciona mais rápido, mas custa mais. O cache é dividido em 3 níveis, que são verificados sequencialmente durante a pesquisa dos dados solicitados antes do processador acessar a RAM. Em processadores mais antigos, o cache de primeiro nível (L1) fazia parte da CPU e trabalhava com ele na mesma frequência, quando os caches L2 e L3 eram chips externos. Agora eles estão todos no mesmo chip que o processador. O cache L1 é o mais rápido e menor em tamanho de memória, L2 tem mais memória, mas mais lento. L3 é o maior cache e o mais lento, geralmente chamado de cache compartilhado , porque armazena dados para todos os núcleos da CPU, enquanto L1 e L2 são criados para cada núcleo individual.

Na próxima parte, falaremos sobre como o Windows recebe e processa os dados recebidos.

All Articles