Acerca del funcionamiento de una PC con el ejemplo de Windows 10 y el teclado de la Parte 2

En esta parte, consideraremos en qué dirección va la información sobre la tecla presionada desde el teclado a la CPU, habrá muchas imágenes y esta no es la última parte. Hablaré sobre esto desde el punto de vista de un programador que escribe en modo de usuario (programas de usuario, web, aplicaciones móviles), por lo tanto, puede haber imprecisiones. Es poco probable que las personas involucradas en la electrónica encuentren algo útil para sí mismas. La primera parte está aquí .


El problema de la educación superior de programadores es que los estudiantes estudian en detalle aspectos individuales sacados de contexto sin comprender cómo encaja todo esto. Varios semestres de matemática superior para comprender la física, comprender la ingeniería eléctrica, los electrodomésticos, el ensamblador, el sistema operativo, los algoritmos, la programación del sistema y un montón de otras materias incluidas en un programa estándar de cinco años. La abundancia de detalles y nadie explica cómo encaja esto en el panorama general, se supone que después de 5 años, el estudiante se lo vinculará a sí mismo, y luego irá a trabajar con .Net y nunca tocará la electrónica y el modo kernel. Creo que no es necesario saber con tanto detalle sobre el funcionamiento de una computadora, es suficiente tener una comprensión general de lo que está sucediendo en la pila tecnológica. Si las personas que conforman los programas de capacitación para universidades abrieron escuelas de manejo,aprendería ruso, caligrafía e hidrodinámica, porque necesita comunicarse con los inspectores, cambiar fluidos y escribir notas explicativas. Habrá algunas imprecisiones en el artículo, por lo que no será adecuado para aprobar el examen en materias especializadas, pero después será más fácil entender el dispositivo de la PC.

Bajo tráfico de gatos.

Una tecla del teclado es un botón que cierra los contactos y una corriente eléctrica pasa a través de ellos. El mecanismo de cierre / apertura está hecho de tal manera que no es necesario presionar el botón por completo, ya que de lo contrario los dedos se cansarán rápidamente y el teclado no será ergonómico. En la sección, la clave se ve así. En el lado derecho está el contacto al que se aplica el voltaje.


El "cerebro" del teclado que puede determinar la pulsación de tecla es un microcontrolador , que es esencialmente una mini computadora con un programa que verifica cada tecla aplicando voltaje y si pasa, entonces se presiona la tecla. Las patas del microcontrolador tienen sus propios nombres y se puede acceder en código, se utilizan para comunicarse con el mundo exterior. Las patas pueden controlar el funcionamiento del microcontrolador, informar el estado del chip o servir para leer / transmitir datos.
El programa ( firmware ) se puede escribir en C o ensamblador, se carga en el microcontrolador a través del programador . Es un dispositivo con un conector para instalar un microcontrolador y se puede conectar a una computadora a través de USB, en el que se ejecuta un software especial. Así es como se ve el programador en la vida real:
A través del programa, cada tramo se puede configurar o medir el voltaje. El algoritmo para encontrar la tecla presionada es aplicar voltaje a una pata y medirlo en la otra, y si se presionó la tecla, la segunda pata tendrá aproximadamente el mismo voltio que la entrada. Entonces, en un bucle infinito, se verifican todas las teclas. Como regla general, el teclado tiene 80-110 botones, y el controlador de contacto (pines) es mucho más pequeño. Por lo tanto, utilizan un enfoque como la "matriz de teclado": todas las teclas se distribuyen en columnas y filas, y el algoritmo se reduce a encontrar una columna que intersecte la fila a la que el programa aplicó voltaje. La correspondencia de columna / fila con los contactos se resalta aquí.


En realidad, la matriz puede verse así. A la izquierda es industrial y a la derecha es casera.


En el pseudocódigo, la parte del programa de firmware que determina las teclas presionadas puede tener este aspecto.

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 un código de escaneo, está estandarizada y es un número de 8 bits, es decir un byte Por lo tanto, cuando se presiona la tecla Y, el controlador del teclado tendrá que enviar el número 21 (0x15) y, cuando se suelte, 149 (0x95). ¿Cómo se realiza el envío? Seguramente trabajó con JSON, servicios web o envió datos entre procesos y sabe que para enviar datos necesita serializar , es decir convertirse en una matriz de bytes o texto formateado que el destinatario puede deserializar , es decir recrear un objeto en su espacio de direcciones. ¿Y qué puede serializar datos a un nivel tan bajo? Necesitamos transferir solo 1 byte (8 bits). Mirando hacia el futuro, diré que transmitiremos datos poco a poco.

En matemáticas, hay una fórmula que puede convertir cualquier número decimal que nos sea familiar en una secuencia de ceros y unos y viceversa. Esta fórmula ha encontrado aplicación en tecnología informática. En la primera parte, mencioné casualmente que la tecnología analógica explota las leyes de la física, mientras que la digital funciona a nivel de ceros y unos. Esto significa que un teléfono analógico codifica todo el espectro de la voz humana en una secuencia de ondas electromagnéticas, y un teléfono digital utiliza un microchip que convierte la voz humana en datos digitales, por ejemplo, en archivos WAV, y luego los transfiere en una secuencia de ceros y unos en forma de ondas electromagnéticas. Solo en este caso, en lugar de todo el espectro de la voz, solo se deben representar dos valores: 0 y 1. Pueden representarse mediante ondas de diferentes longitudes, diferentes voltajes,la luz pulsa a través de la fibra óptica, rayas blancas y negras en el papel, agujeros en la tarjeta perforada.

El código de escaneo de la tecla Y presionada en binario se parece a 0001 0101. Los transmitiremos a lo largo de la rama del microcontrolador que es responsable de los datos ( DATOS ). La unidad lógica es 3.3V o superior, cero lógico- el voltaje es de aproximadamente 0V. Aquí está el truco: ¿cómo paso tres ceros seguidos? Para hacer esto, necesitamos un segundo tramo que llamaremos CLOCK, cuando en él uno significa que la sesión de transmisión de un bit ha comenzado y cero ha finalizado. Tal cambio en los valores (voltajes) ocurrirá con un cierto intervalo de tiempo, digamos 50 nanosegundos, porque en el otro extremo hay un segundo microcontrolador que funciona a su propia velocidad y escucha las patas a las que CLOCK y DATA están conectados en un bucle sin fin. En este ejemplo, supondré que el teclado está conectado a través del conector PS2, que se muestra a continuación. A través del puerto USB, el algoritmo de transferencia será diferente. Como puede ver, el puerto PS2 tiene pines llamados Datos, Reloj.Además de ellos, también hay un contacto a través del cual el controlador del puerto PS2 distribuye el voltaje de 5V necesario para la operación al teclado y un contacto a tierra, que simplemente se muestra en el cuerpo del teclado. No se utilizan otros contactos.
El puerto PS / 2 se denomina bus serie , porque transmite bits uno por uno (una secuencia de bits). El puerto paralelo transmite datos a la vez a varios contactos y puede transferir, por ejemplo, un byte (8 bits) a la vez para una sesión de transferencia de datos.

¿Cuál es la diferencia entre un puerto, un bus y un protocolo? Un bus, como un puerto, es un conjunto de contactos (cableado) y un acuerdo sobre cómo usarlos, solo el puerto tiene una conexión para conectar dispositivos externos, y el bus se usa para comunicar componentes en la placa base. Un puerto es esencialmente un bus con un conector en el medio. Un protocolo es una interacción a través de contactos. En el ejemplo con PS / 2, este fue el orden de transferencia de datos a través de los contactos Reloj y Datos.

Anteriormente, el microcontrolador Intel 8042 era muy común y se usaba tanto en el teclado como en un controlador de puerto PS2, es decir. Dos chips idénticos intercambiaron datos. El controlador del puerto PS2 en Windows se llama 8042prt.sys.

De hecho, transmitimos no 8 bits, sino 11, porque los datos se transmiten como un paquete o mensaje de datos . Unos 3 bits adicionales indican el comienzo y el final de los datos: uno cero al principio y 0 1 al final, un protocolo de este tipo para transferir datos desde el dispositivo al host en PS2. Esto puede parecerse a la función SendKey en pseudocódigo, si prefiere comprender el código. Envía datos sobre la tecla presionada a través del bus 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);
}

No siempre es necesario establecer manualmente el voltaje en cada pata individualmente para la transferencia de datos. En algunos casos, el valor almacenado en el registro se muestra automáticamente en los contactos.

En el gráfico, dicha transferencia de datos se visualizará de la siguiente manera. El tiempo está en el eje X y el voltaje en el eje Y.


En tecnología analógica, la señal puede estar distorsionada, es decir el cable no está conectado a nada, pero el voltímetro muestra 0,5 V debido al hecho de que hay un campo electromagnético cerca. Por lo tanto, se utiliza el concepto de voltaje umbral. Si el voltaje es menor que el umbral, entonces suponemos que tenemos un cero lógico, de lo contrario, la unidad. Teniendo en cuenta las posibles distorsiones, el código de escaneo de la tecla Y presionada puede aparecer así:


Antes de echar un vistazo más de cerca a cómo los datos del teclado llegan a la CPU, hablemos de microchips , buses y placas base .

Microcontroladores y microcircuitos


El microcontrolador puede ejecutar un programa cosido, tiene una cierta cantidad de memoria RAM y un lugar para almacenar datos y código de programa. En el chip, el programa se puede configurar en la etapa de diseño. La creación manual de un circuito eléctrico que implementa un algoritmo consume mucho tiempo y, por lo tanto, se puede utilizar un lenguaje de programación especial llamado VHDL (Lenguaje de descripción de hardware) para diseñar microcircuitos . Este es un lenguaje de programación de alto nivel que se traduce en un plan de circuito, se ejecuta a través de un programa que encuentra la ubicación óptima de los elementos de radio en el tablero y finalmente se realiza en forma física. Las imágenes son sólo para fines ilustrativos.



¿Cómo se representan los datos y comandos en microchips y microcontroladores? La base de la tecnología informática es un transistor, que la humanidad ha aprendido a hacer en dimensiones microscópicas. Un transistor es un elemento de radio que tiene tres patas: una entrada, una salida, y entre ellas un control que abre o cierra una corriente entre dos patas. La siguiente figura ilustra el funcionamiento del transistor, el agua ilustra la corriente.


El voltaje se aplica al tramo de entrada, si el control tiene voltaje, entonces la corriente pasa a la salida, de lo contrario habrá 0V. Con 8 transistores, cada uno de los cuales tiene un LED conectado a la pata de salida que se ilumina o no, podemos imaginar 256 combinaciones únicas (2 a la potencia de 8). Los lapochki se interpretan de derecha a izquierda, así como los números decimales. Los dígitos inferiores están a la derecha.
Aquellos. una bombilla representa un bit de información (0 o 1), y ocho de esas bombillas corresponden a un byte. Es posible construir operadores lógicos AND, OR, NOT, XOR en transistores.


Por ejemplo, en el circuito del operador AND (a la izquierda en la imagen de arriba), la salida solo tendrá voltaje si ambos voltajes de entrada no son cero. Alguien ya ha inventado algoritmos de suma, multiplicación, división y sustracción basados ​​en operaciones lógicas bit a bit y cambios de bit. Los fabricantes de chips solo necesitan implementarlos. A continuación se ilustra el funcionamiento del algoritmo de adición bit a bit; no lo analizaremos:


Los nanotransistores son microscópicos y se pueden colocar en el tablero por millones. A continuación se muestra el procesador Intel y cómo se vería aproximadamente uno de sus núcleos. La imagen es ilustrativa.


Los microcircuitos pueden contener un microcontrolador en la misma placa y en el mismo caso.

Llantas


Por lo general, en los libros de texto, los neumáticos se muestran como flechas en negrita, como en la imagen a continuación. Esto se hace para no dibujar todas las conexiones de los contactos, que pueden ser muchas. El funcionamiento del bus PS2 es muy simple, todo lo que necesita son tres pines. Pero hay buses que, por ejemplo, tienen 124 contactos para la transferencia de datos.



Existen los siguientes tipos de neumáticos:
  • Datos: los bits de estos contactos se interpretan como datos: número, símbolo, parte de una imagen u otros datos binarios. El ancho del bus afecta el rendimiento, número de bits transmitidos por segundo
  • Direcciones: los bits en estos pines se interpretan como una dirección física en la memoria. El ancho de este bus determina la capacidad máxima de RAM admitida.
  • — . CPU RAM I/O.
  • . , . ATX 24 Pin 12V PSU Connector, .


Un neumático puede consistir en sustratos , es decir algunos contactos se usan para datos, otros para direcciones, otros para control y contactos a los que se transmite energía. El enfoque cuando los mismos contactos se usan alternativamente para transmitir datos y direcciones se llama multiplexación . Por ejemplo, el procesador Intel 8086 tiene un bus de datos y direcciones de 20 bits, en el diagrama de pines sus contactos se indican mediante AD0-AD19 (patas 16-2 y 39-35).


En un caso más complejo, podemos tener varios microcircuitos conectados a los mismos contactos. Para una comunicación normal, necesitan un chip adicional que determinará quién puede usarlos en qué momento, se llama controlador de bus. En la figura siguiente, un bus esférico en el vacío: cuatro microcontroladores idénticos transmiten datos al microcontrolador del consumidor a través del controlador del bus. El cable rojo es el voltaje que el controlador del bus distribuye a todos los chips conectados a él. Los datos se transmiten a través de los cables verdes y se realiza una "negociación" con el controlador de bus, y el cable azul es Clock, a través del cual el controlador de bus sincroniza la comunicación de los controladores, ya que pueden operar a diferentes velocidades. Si la unidad lógica está en el cable azul, entonces el chip con derecho a usar el bus puede realizar un acto de interacción con el mundo exterior: leer un poco, por ejemplo.


El controlador de bus puede considerarse como un componente integral, ya que la comunicación con el mundo exterior lo atravesará y cuántos chips o dispositivos externos reales hay realmente en el bus no es importante. Para la transferencia de datos, la placa base tiene una extensa red de autobuses. A pesar del hecho de que hay una gran cantidad de conjuntos de chips, en su mayor parte siguen un diseño típico, porque todos los dispositivos conectados a la placa base se dividen en:
  • Lento: teclado, disco duro, tarjeta de red, audio, etc.
  • Rápido: CPU, RAM, GPU.
Basado en esta división, la placa base tiene dos chips principales: el South Bridge , que coordina el trabajo de todos los dispositivos lentos, y el North Bridge, para la coordinación de los dispositivos rápidos. En las computadoras modernas, el Northbridge está ubicado en la CPU misma, y ​​el Southbridge puede llamarse Platform Controller Hub, pero esto no cambia la esencia. Ambos puentes están interconectados por un autobús a través del cual se informan mutuamente sobre eventos importantes. De particular interés es el generador de reloj mediante el cual el procesador, la RAM y la tarjeta gráfica sincronizan su trabajo, el mismo cable azul. OverclockingEsto esencialmente está cambiando la configuración del BIOS para que la sincronización ocurra con mayor frecuencia, mientras que el hardware, principalmente la CPU, se calentará más, consumirá más energía y desarrollará sus recursos más rápidamente. Lo contrario es el overclocking , cuando la velocidad disminuye para ahorrar batería o reducir el ruido.

Un conjunto de chips es un conjunto de chips que fueron diseñados para funcionar entre sí. Proporcionan comunicación entre componentes en la placa base y proporcionan funcionalidad como temporizadores. El conjunto de chips funciona con una sola marca de procesador, AMD no se puede insertar en la placa base con el conjunto de chips Intel, incluso tienen contactos diferentes. El diagrama de la placa base se presenta a continuación:
¿Quieres un ejemplo de encapsulación de hardware? Los chipsets Intel tienen un chip llamado Super IO , se muestra en la imagen a continuación y está conectado al Puente Sur a través del bus LPC. LPC es el nombre inteligente para el cableado de CLOCK, DATA, VCC (POWER). Este chip contiene la emulación de todos los chips antiguos que alguna vez se usaron para periféricos, incluido el chip 8042 que se usó para el puerto PS2. También hay un emulador de controlador de puerto para disquete y otras reliquias que interfieren con el progreso. En el diagrama general de la placa base, tanto Super IO como el bus LPC se indican arriba .


El moderno puerto PS2 se conecta directamente al chip Super I / O. El verde es el teclado, el púrpura es el mouse. Anteriormente, se conectaba al microcontrolador Intel 8042.


La placa base está hecha de dieléctrico, es decir material que no conduce corriente. La corriente solo puede pasar por las líneas impresas en la pizarra. La placa base tiene muchas capas, cada una de las cuales tiene sus propios contactos impresos y, por lo tanto, si perfora la placa base donde las líneas no son visibles, puede estropearla dañando los contactos invisibles dentro de la placa. Ahora puede echar un vistazo más de cerca al proceso de distribución de datos desde la PS2 a la CPU.

El camino de la PS2 al procesador


Como regla general, la arquitectura de la computadora se considera en el procesador 8086. Por un lado, esto es correcto, porque es bastante simple en comparación con las CPU modernas, por otro lado, es incorrecto, porque es antiguo y no refleja la arquitectura de una máquina moderna. Intel 8086 no necesitaba ningún puente, porque era tan lento que podía funcionar con periféricos en un bus, es decir a una frecuencia No conozco los conjuntos modernos de CPU y chips, así que lo explicaré en los ficticios que se parecen a los reales. En mi ejemplo, habrá una CPU ficticia muy similar a Intel 8086. El chip Super IO tiene más de cien contactos y hay documentación en Internet, pero no veo el punto de resolver qué pines el teclado y el bus LPC realmente usan para comunicarse con South Bridge. Lo principal es el principio, que se puede implementar de diferentes maneras.

Echemos un vistazo rápido a la imagen para recordar que ya hemos pasado. Las flechas verdes indican el camino que tomaremos.


Entonces, los datos del teclado ya llegaron al controlador de puerto PS2, que alguna vez fue un chip Intel 8042, y ahora es emulado por un chip Super IO. Y ahora analicemos el curso posterior de las acciones en mi placa base ficticia con una CPU ficticia. El controlador PS2 recibió un código de escaneo de la tecla Y presionada y ahora suministra voltaje a la señal de contacto (línea púrpura, vea la imagen a continuación) en la cual el controlador de interrupción programable debe notificar sobre los datos del teclado. Esta señal se transmite de un chip a otro hasta que North Bridge la pasa al administrador de interrupciones.


Controlador de interrupción programable es un Intel 8259 de chip en la que 8 patas (sus nombres IRQ0-IRQ7) están reservados para la recepción de las notificaciones de ciertos puertos ( I nterrupt R e Q uest). Un teclado está conectado al pin IRQ1, IRQ7 a una impresora, disquete a algún pin, tarjeta de sonido, puertos paralelos y otros . Por supuesto, puede haber mucho más de ocho dispositivos, por lo que se utilizó una técnica como la conexión en cascada cuando se conectó otro PIC similar a una pata con el nombre IRQ2, en el que el recuento no comenzó desde 0, sino 7. El mouse está conectado a IRQ12, es decir. pie IRQ5 en el segundo PIC.

El controlador de interrupción ahora debe notificar a la CPU del evento en el teclado. Esto sucede de la siguiente manera:
  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).

El controlador de interrupción de teclado en el código más simple se verá así. Llama a un comando que señala la finalización del procesamiento de interrupción, es decir. envía una señal al pie INTA.

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

Puede obtener más información sobre cómo se configura la tabla de vectores de interrupción en osdev .

Ahora sabemos cómo ocurrió la interrupción, pero no sabemos cómo el manejador de interrupciones lee información sobre la tecla presionada. Desde el punto de vista del software, el puerto PS2 consta de dos registros, solo que el número de puerto de E / S no accede a ellos por nombres o direcciones en la memoria . Estos dos registros de un solo byte se asignan a los puertos 0x60 y 0x64, el primero (0x60) contendrá el código de escaneo de la clave. El segundo puerto se usa para transferir el estado y los comandos al puerto PS2 (¡no al teclado!). El conjunto de instrucciones de arquitectura x86 tiene el comando IN storeTo , fromPortNumque lee el valor del puerto de E / S especificado en el registro especificado. Por ejemplo, IN AL, 0x60 guardará los datos del teclado en el registro AL. Podría funcionar algo como esto:

  1. En el procesador que estamos considerando hay patas AD0-AD20, se pueden usar para indicar la dirección y los datos. Esto es tanto un bus de datos como un bus de direcciones. Además de ellos, hay una serie de patas de control, por ejemplo, el pin No. 28 (S2), cuyo valor indicará al puente norte donde se realizará la lectura, desde la memoria o un dispositivo de entrada / salida. El comando IN establece el valor aquí hablando del 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 este algoritmo funciona en una escala de nanosegundos y, por lo tanto, se ejecuta casi instantáneamente, a pesar de que el procesador pasó algún tiempo esperando la operación de E / S.

Como ahora comprende la lectura desde dispositivos externos, incluso, por ejemplo, memoria RAM, etc. La CPU es bastante lenta. Esta lentitud se puede notar escribiendo un programa que imprima 10,000 líneas en un archivo línea por línea, en lugar de copiarlas en el búfer y guardarlas inmediatamente. El disco duro está conectado al Puente Sur y dentro de él también hay un controlador que controla la ubicación directa de los datos.

La RAM está conectada a la CPU a través del bus y la lectura de la misma lleva algún tiempo. Para acelerar la CPU, tiene un caché, es decir El área en la que se ubican los transistores que representan datos que pronto se necesitarán o se usarán con frecuencia, su lectura es mucho más rápida que la de la placa RAM, que se comunica con la CPU a través del Puente Norte. La RAM se llama memoria dinámica de acceso aleatorio , porque los condensadores se utilizan para representar datos en ella. Un condensador es un elemento de radio que, como una batería, mantiene una carga durante un tiempo hasta que se descarga por completo. Solo aquí la descarga ocurre muy rápidamente. Por lo tanto, los condensadores deben recargarse, esto sucede instantáneamente, es suficiente para aplicar voltaje. Condensador cargado - lógico 1, de lo contrario 0. Para la memoria caché se utilizaRAM estática, es decir no necesita recargarse y, por lo tanto, funciona más rápido, pero cuesta más. El caché se divide en 3 niveles, que se verifican secuencialmente durante la búsqueda de los datos solicitados antes de que el procesador acceda a la RAM. En procesadores más antiguos, el caché de primer nivel (L1) era parte de la CPU y funcionaba con él a la misma frecuencia, cuando los cachés L2 y L3 eran chips externos. Ahora están todos en el mismo chip con el procesador. El caché L1 es el más rápido y el más pequeño en tamaño de memoria, L2 tiene más memoria pero más lento. L3 es el caché más grande y el más lento, a menudo llamado caché compartido , porque almacena datos para todos los núcleos de CPU, mientras que L1 y L2 se crean para cada núcleo individual.

En la siguiente parte, hablaremos sobre cómo Windows recibe y procesa los datos recibidos.

All Articles