Acerca del funcionamiento de una PC con el ejemplo de Windows 10 y el teclado, parte 1

imagen

Mi nombre es Andrey Artemyev, trabajo en Microsoft en el núcleo de Windows 10, anteriormente trabajé en Windows 10x (WCOS), XBox, Windows Phone y Microsoft Edge. Quiero popularmente, con fines educativos, contar cómo funciona la computadora en el ejemplo de entrada de teclado y Windows 10. Esta serie de artículos está diseñada principalmente para estudiantes de especialidades técnicas. Consideraremos qué ruta va a mostrar la información sobre la tecla presionada desde el teclado en Notepad.exe. Debido a la inmensidad e interdisciplinariedad del tema, puede haber imprecisiones en los artículos, que se informan en los comentarios. Parte de la información puede estar desactualizada debido a la velocidad con la que se está desarrollando Windows.

¿Cuán profundo nos sumergimos en el tema?


Primero hablemos sobre los niveles en los que se puede considerar una computadora. Cada nivel se basa en el anterior. Comencemos desde arriba.

Nivel de aplicación Todas las aplicaciones de usuario se encuentran aquí, este es un navegador, Microsoft Office, bloc de notas, así como el servidor web IIS, SQL Server, varios middleware como Java y .Net y todos los lenguajes de secuencias de comandos, ya sea Ruby, PHP o Bat-files.

Nivel del sistema operativo . El SO se puede considerar como:

  • Administrador de recursos: memoria, discos duros, impresoras, pantalla, teclado, recursos limitados que comparten los programas que se ejecutan en la computadora.
  • Máquina virtual: un archivo es un buen ejemplo de un objeto virtual. Representa una abstracción de datos en el disco, una API para trabajar con él, y también agrega el concepto de derechos de acceso. En lugar de un archivo, podría existir el concepto de un contenedor de datos y una API completamente diferente. Hay muchos de estos objetos virtuales en el sistema operativo.
  • Plataforma: el sistema operativo proporciona modelos de software y primitivas para crear programas. Por ejemplo, el Marco de controladores de Windows le permite desarrollar controladores rápidamente, las ventanas en Windows se utilizan para construir interfaces de usuario complejas. Dll: proporciona un modelo para expandir la funcionalidad del programa a través de complementos, así como un mecanismo para implementar el lector de pantalla a través de trampas de teclado (consulte el gancho LowLevelKeyboard).
El sistema operativo se divide en capas y componentes. En general, la arquitectura de Windows 10 se ve así. Hablaremos en detalle un poco más adelante.

imagen

Nivel de arquitectura informática . Está representado por una placa base que tiene un factor de forma específico, funciones integradas codificadas en microcircuitos llamadas un conjunto de chips y puertos a través de los cuales puede ampliar la funcionalidad de su computadora conectando una tarjeta gráfica, tarjeta de red, memoria adicional de acceso aleatorio (RAM), discos duros, teclado, etc. Los puertos afectan la velocidad y las capacidades de la computadora, lo que determinará su propósito, ya sea un servidor para procesar miles de solicitudes por segundo, una tableta para usar Internet o una PC para juegos con varios videos arty. El sistema operativo resume las características de la placa base.

Los microcircuitos se ven como en la imagen a continuación y son una mini computadora que realiza programas simples para tareas de bajo nivel, por ejemplo, lee datos del teclado y los transfiere aún más para que finalmente lleguen al procesador. Como regla, se implementan como un microcircuito o microcontrolador analógico no programable programable en C.

imagen


La placa base puede considerarse como una colonia de microcircuitos que se comunican entre sí a través de buses y, a través de ellos, los datos de los dispositivos conectados al procesador y viceversa circulan. El conjunto de chips es una especie de sistema nervioso informático. Todos los chips en la placa base fueron creados originalmente para trabajar entre sí. Algunos de ellos pueden tener funciones especiales, por ejemplo, un temporizador o almacenamiento de la configuración del BIOS. Quizás el más importante de ellos es el que tiene un programa incorporado (firmware, BIOS, UEFI) que comienza a funcionar tan pronto como aparece la electricidad. Encuentra el disco duro con el cargador de arranque de Windows y le transfiere el control, que a su vez lanza el archivo ejecutable del sistema operativo, que puede llamarse Windows10.exe, en realidad NtOsKrnl.exe. El BIOS sabe qué buscar gracias a un acuerdo entre fabricantes de hardware y sistemas operativos.

Alrededor de la placa base, puede ensamblar un teléfono móvil, consola de juegos, estación de servidor o dispositivo inteligente. En la siguiente imagen, los factores de forma comunes de las placas base.

imagen

El nivel de microarquitectura está representado por el procesador (CPU), este es el corazón de la placa base y se necesita todo el conjunto de chips para dar servicio a la CPU. Un procesador es una computadora en una computadora, un microcontrolador más potente y avanzado que no necesita firmware, porque el flujo de comandos se produce sobre la marcha cuando el programador de subprocesos cambió el contexto del procesador. El funcional del procesador se divide en subsistemas, por ejemplo, un componente involucrado en operaciones matemáticas y lógicas, un coprocesador matemático y un caché. Algunos de ellos solían ser un chip separado en la placa base, pero ahora se han convertido en parte de la CPU, por ejemplo, un controlador de interrupción y un chip llamado North Bridge, lo que aumentó la velocidad del trabajo.

La microarquitectura no es lo mismo que la arquitectura . Toda la funcionalidad de la CPU se divide en componentes que funcionan juntos. Estos componentes y su interacción es la microarquitectura. En el diagrama de flujo a continuación, están representados por rectángulos y cuadrados de colores.

imagenimagen

La arquitectura del procesador es esencialmente un documento que describe qué funcionalidad debería tener para corresponder, por ejemplo, a la arquitectura x86, x64 o ARM utilizada en dispositivos móviles. Este documento describe qué comandos, asignaciones de registros y lógica de operación deberían ser compatibles. Los creadores de los procesadores Intel, AMD, Elbrus pueden implementar esta funcionalidad como quieran y agregarle nuevas funciones en forma de comandos, registros, indicadores, interrupciones, y si el sistema operativo los conoce, puede usarla. En términos de OOP, la arquitectura de la CPU es la interfaz y la microarquitectura es su implementación.

Circuitos lógicos . Los rectángulos coloreados del diagrama de bloques de la CPU consisten en circuitos lógicos que realizan sus operaciones en secuencias de ceros y unos. El procesador ve todos los datos e instrucciones en forma de bits (0 y 1), de acuerdo con la fórmula, cualquier número decimal puede representarse como una secuencia de 0 y 1, pero lo que significa un número particular depende del contexto. Puede ser un código, número, letra. La unidad aritmética y lógica (ALU) puede agregar dos números a través de operaciones bit a bit. Los algoritmos bit a bit de suma, resta, multiplicación y división se conocen desde hace mucho tiempo; los desarrolladores del circuito lógico solo necesitan implementarlos de manera efectiva.

imagen

Los circuitos digitales funcionan con datos a nivel de ceros y unos, mientras que los circuitos analógicos se basan en la explotación de las leyes de la física. Realizan manipulaciones de bits simples, como cambios, AND, OR, XOR. A través de estas primitivas se implementan operaciones más complejas. La siguiente imagen muestra el operador analógico Y implementado a través de transistores. En la salida del circuito, solo existirá un voltaje distinto de cero si está en ambos contactos de entrada (Bx1 y Bx2), de lo contrario, cero voltios. El operador && en C # funciona de la misma manera. Los circuitos digitales se basan en última instancia en analógicos. Los elementos físicamente lógicos en los circuitos lógicos se pueden implementar no solo de forma electrónica, sino también mecánica, hidráulica, óptica y de otro tipo.

imagen

El nivel de radioelementos . Físicamente, los circuitos analógicos dependen de elementos de radio que realmente explotan las leyes de la física. En su mayoría, estos son semiconductores, es decir bajo ciertas condiciones, pueden conducir electricidad, pero no pueden. El diodo conduce la corriente en una sola dirección, si no está soldada, gira 180 y vuelve a soldar, entonces la corriente no la atravesará. El transistor pasa corriente solo si hay voltaje en la pata de control. La humanidad ha aprendido a hacer microscópicos los transistores y, por lo tanto, se pueden colocar en una pequeña placa por millones. En las imágenes a continuación, elementos de radio semiconductores y un transistor convencional junto a un nano transistor bajo un microscopio electrónico.
imagen

imagen
El nivel de las leyes de la física . Y finalmente, el nivel más bajo es el nivel de las leyes de la física que están encerradas en radioelementos semiconductores.

imagen

Hablaremos mucho sobre el nivel del sistema operativo y un poco menos sobre la arquitectura de la computadora, la microarquitectura, los circuitos analógicos y los elementos de radio. Para la última parte, debe comprender cómo funciona todo esto en conjunto.

Conceptos básicos del sistema operativo


Cuando fuimos al lenguaje ensamblador en la universidad, muchos estudiantes tenían un estupor por palabras tan ingeniosas como "kernel y modos de usuario", bajo los cuales el sistema de autenticación de roles realmente conocido está oculto en todos, en todos los sitios hay al menos un "Administrador" con acceso a Todas las páginas y el "Usuario" tienen acceso limitado. Del mismo modo, la función "Core" tiene acceso a todas las capacidades de la CPU, y la función "Usuario" puede no causar todos los comandos del procesador y no con todos los argumentos. Además de este modelo a seguir, el sistema operativo se basa en el principio de la arquitectura cliente-servidor, donde el servidor es el núcleo que implementa la funcionalidad del sistema operativo y el cliente son los programas de usuario. En el mundo de la Web, el cliente y el servidor están físicamente separados: estas son dos computadoras diferentes que se comunican a través de la red. En el sistema operativo, el cliente y el servidor viven en la misma máquina y en el mismo hardware. El servidor tiene una determinada API que permite a los clientes cambiar su estado, por ejemplo, la API de Twitter le permite crear publicaciones, iniciar sesión y cargar un feed de tweets a un cliente móvil. Windows tiene una API Win, que es más engorrosa debido a una gama más amplia de tareas; hoy, Windows tiene aproximadamente 330,000 API más una API para aplicaciones UWP. Si los conceptos de Twitter son más o menos claros para todos (publicación, usuario, feed), entonces los conceptos del sistema operativo pueden requerir cierta profundización en su interior. Por lo tanto, las API de Windows pueden ser difíciles de entender sin comprender la estructura interna del sistema operativo.

En realidad, el núcleo significa tres cosas diferentes. El núcleo es como todo el código del sistema operativo. El kernel como subsistema responsable de los mecanismos del sistema operativo, como el programador de subprocesos, el cambio de contexto, el manejo de interrupciones, el intercambio de memoria virtual a física (Kernel) y el subsistema del kernel para admitir otros sistemas operativos: CSRSS.exe (Windows), PSXSS.exe (POSIX), OS2SS.exe (OS / 2) o WSL (Subsistema de Windows para Linux). En este contexto, se entiende el primer significado: todo el código del sistema operativo.

Cuando aparece una ventana en la pantalla, aparece una estructura de datos en la parte del servidor del sistema operativo (modo kernel) que describe esta ventana: su posición en la pantalla, tamaño, texto del título, función de ventana a través de la cual el sistema operativo permite que la aplicación responda a los eventos. Dado que hay muchos subsistemas en el sistema operativo, puede haber varias estructuras de datos que describen un objeto, por ejemplo, la información sobre el proceso del usuario está en los componentes:

  • Ejecutivo : aquí está la lógica del sistema operativo. Esta capa verifica qué procesos pueden y no pueden hacer. Este archivo contiene información sobre el proceso principal, los parámetros de inicio del proceso (Bloque de entorno del proceso), la cuenta de usuario asociada, el nombre del archivo exe del proceso.
  • Kernel : aquí se implementan mecanismos del sistema operativo, como un programador de subprocesos. Almacena cuánto tiempo pasa el proceso en modo usuario y kernel, a qué procesadores están conectados sus hilos, la prioridad básica de los hilos del proceso.
  • Subsistema de ventanas: información sobre los objetos GDI que se utilizan para dibujar en la ventana. Estos son primitivos como pinceles, bolígrafo, etc.
  • DirectX : todo lo relacionado con DirectX: sombreadores, superficies, objetos DX, contadores de rendimiento de GPU, configuraciones de memoria para memoria gráfica.
  • El subsistema de Windows que está representado por el proceso CSRSS.exe (Client Server Runtime SubsSystem). Windows admitía anteriormente OS POSIX (proceso PSXSS.exe) y OS / 2 (OS2SS.exe). En esos días, surgió la idea de hacer de Windows el mismo subsistema, pero esto fue lento y muy pronto parte de CSRSS.exe se transfirió a win32k.sys, que ahora se divide en varios archivos: win32k.sys, win32kbase.sys y win32kfull.sys. Aquí se almacena información sobre datos de grupo de procesos, nivel de apagado, datos de sesión, etc.

El soporte para POSIX y OS / 2 era más probable formal, porque para transferir el programa desde estos sistemas operativos, tenía que encontrar el código fuente y recompilarlo de una manera especial para obtener un archivo exe en el que todas las llamadas a la API del sistema operativo se redirigieran a PSXdll.dll (NETAPI.DLL y DOSCALLS.DLL para OS / 2 y User32.dll para aplicaciones de Windows), que era una envoltura delgada sobre la API de Windows. El estado de algunas API se almacenó en el proceso del subsistema PSXSS.exe (OS2SS.exe). Como no todas las API se pueden asignar a 1 a 1, dicho programa funcionó de manera inestable. El soporte de Linux se agregó en Windows 10 y funciona de una manera completamente diferente. El subsistema de Linux está alojado en modo kernel y la diferencia entre el subsistema de Windows para Linux y Linux es aproximadamente la misma que entre diferentes compilaciones. Especialmente para WSL, se introdujo un nuevo tipo de proceso: el proceso PICO.

¿Qué es un componente? Esta es una funcionalidad agrupada lógicamente. Un componente se puede llamar una clase OOP, dll, carpeta, conjunto de funciones con un prefijo común, espacio de nombres, capa en la arquitectura.

Más sobre particionamiento cliente-servidor


La separación del cliente y el servidor se implementa utilizando la funcionalidad integrada de la CPU, el intercambio de memoria y las comprobaciones de software.

Los fabricantes de equipos colaboran con los desarrolladores del sistema operativo, por lo tanto, el procesador tiene mecanismos creados teniendo en cuenta las necesidades de los creadores de los sistemas operativos. En todos los procesadores modernos, se implementa el mecanismo de rol de usuario, donde el usuario se entiende como el código ejecutable actualmente. En las aplicaciones web, el rol del usuario conectado se almacena en una variable y, además del nombre claro Administrador o Usuario, tiene un Id de este rol, que a menudo se usa durante la autorización, porque comparar números es más rápido y fácil que las cadenas. En el procesador, la función del usuario actual se almacena en un campo llamado "Anillo de seguridad", no "CurrentUser.Role.Id". En la mayoría de los procesadores, este campo toma cuatro valores de 0 a 3. Windows usa 0 para el rol llamado "Modo Kernel", porque es el modo más privilegiado y el mayor valor para el rol es "Modo de usuario", porque es el rol más limitado. Los roles restantes no se usan porque la diferencia entre 0 y 1, 2 y 3 es insignificante. Estas funciones limitan las páginas de memoria que pueden abordarse, no puede llamar algunas instrucciones o no puede llamarlas con ciertos argumentos. También existen restricciones sobre el uso de la tecnología de puertos de E / S para el intercambio de datos con dispositivos como un teclado, pero no se ha utilizado durante 10 años. El cambio al modo kernel ocurre a través del comando syscall, que por índice encuentra la función que se llamará en la matriz de punteros a las API de Windows. Un puntero a esta matriz se almacena en un registro de procesador especial durante el arranque del sistema operativo.

Específicamente llamé a la CPU registrar un campo. Cuando escribe un programa en C #, puede agregar tantos campos a su clase como desee y darles nombres descriptivos. Para procesadores y microcontroladores, los campos se denominan registros. Cuando diseña una pieza de hierro, debe comprender en esta etapa cuántos registros (campos) necesita, qué tamaño deben tener y qué funcionalidad asignarles, de modo que sea suficiente para todas las ocasiones en todas las situaciones imaginables e inconcebibles. Imagine que necesita escribir un programa en un lenguaje de programación similar a C # que tiene 16 campos predefinidos en la clase y no puede usar variables locales. Es decir el mismo campo se puede usar para almacenar el usuario conectado, la matriz ordenada, los datos temporales o el resultado del método. Los nombres de dichos campos deben ser lo más comunes posible, en lugar de tempData, funcResult, habrá nombres extraños EAX, AH, AL, DX, etc. Si escribió un emulador del procesador en la arquitectura x86 en C #, el código podría verse así (DIV - dividir, comando división entera):

imagen

Para ilustrar, agregué una verificación de modo de núcleo. Si se produce un error de división por cero, el procesador notifica al sistema operativo a través de una interrupción (lanza un evento). En el momento del arranque, el sistema operativo proporciona al procesador una matriz unidimensional de punteros a una función llamada vector de interrupción, donde cada índice corresponde a algún tipo de evento, por ejemplo, división por cero. El sistema operativo conoce la arquitectura del procesador en el que se está ejecutando y, en consecuencia, puede organizar punteros de función en una matriz. La CPU llama a esta función y el sistema operativo tiene su propio código. Por ejemplo, Windows busca en el registro si hay un depurador instalado y muestra un mensaje de que se ha producido un error y es posible ejecutar un depurador para ver el lugar donde se produjo. Una interrupción se llama interrupción porque interviene en el curso normal de ejecución del programa y hace posible que el controlador de interrupciones se ejecute y solo después de su finalización el procesador puede volver a la ejecución del programa.

Las interrupciones pueden ser generadas no solo por el procesador sino también por dispositivos externos (teclado, mouse) o código de programa. El programador de subprocesos establece un temporizador que a intervalos de un cuanto (de forma predeterminada, aproximadamente 15 ms, en Windows Server más) genera una interrupción para asignar otro subproceso para su ejecución de acuerdo con el algoritmo interno. La ejecución paso a paso del programa en Visual Studio también se basa en el mecanismo de interrupción: se establece un indicador en el procesador que, después de cada comando, provoca una interrupción procesada por el motor de depuración de Windows y notificada a través de la API de Visual Studio.

El intercambio de memoria se implementa gracias a la memoria virtual. Dije anteriormente que el sistema operativo es un administrador de recursos y una máquina virtual. 1 RAM 32 Windows 4 , .. 1, 4. ( ). . 4096 (4), :

  • . . CPU , . , , , , . .
  • , . RAM 4. RAM , .
  • , ( new ++) / . Exe- , c . .
  • RAM . / - . RAM , , . Windows 10 , .

Windows 10 , — ( ), .
imagenimagen
64 16 , 18,446,744,073,709,551,616 . RAM 48 , 16 . Win x64 , . , 64 Windows “” 256 Tb . 8TB IA64 7TB x64. Windows 10 — 2TB, . RAM Windows 10 , .

(HEX) , ? , . , — . CPU — CPU . HEX . , 32 ( 64) . — , HEX , .

- ( - ) . / . -, .

Windows?


Windows - . - — , , dll, . *.sys, *.dll , API , C, . C++. :

imagen

:

  • Hyper-V Hypervisor — Windows . , Hyper-V , , .
  • HAL.dll — Hardware Abtraction Layer — — , , — Windows HAL.dll, . , , . , - ACPI.sys.

    Advanced Configuration and Power Interface? 1996 UI, .
    imagen

    1996 ACPI, , .. . ACPI , CD drive, .. .
  • Device Drivers — . *.sys, , . Process Explorer SysInternals .
  • KernelKernel Mode Execution Environment , , , , . .
  • Executive — , - .
  • Windowing & Graphics — DirectX .
  • NtDll.dll — . dll , ( .. dll) . Nt Native, Native American. Es decir API , . dll Nt (NtDestroyMenu). Win API User32.dll. NtDll.dll, Nt* (level of indirection) — subsystem dll User32.dll PSXdll.dll DOSCALLS.DLL Windows. NtDll.dll ( S ession M anagement S ub S ystem .exe , Win dows Init itialize .exe .), .
  • SubSystem dlls — . Windows User32.dll. - API , Nt* NtDll.dll, CreateFile NtCreateFile).
  • Environment Subsystems — CSRSS.exe, Windows. POSIX ( PSXSS.exe) OS/2 (OS2SS.exe). Windows Subsystem for Linux -.
  • System Processes — , LSASS.exe (Local Security Authority SubSystem) .
  • Service Processes — Windows ( Plug and Play Manager) *.exe . SvcHost.exe , *.dll-. SvcHost'.
  • User Processes — . — , , . .

. .

Source: https://habr.com/ru/post/483330/


All Articles