En el trabajo con PC, parte 3: desde el encendido hasta la carga completa de Windows 10

Seguimos entendiendo cómo funciona una PC en el ejemplo de un teclado y Windows 10. En este artículo, hablaremos sobre cómo se combinan el software y el hardware.



Inicio del sistema



La computadora está completamente apagada cuando se desconecta de la alimentación y los condensadores de la placa base se descargan. Antes de la era de los teléfonos inteligentes, los teléfonos móviles a menudo fallaban y si un reinicio no solucionaba el problema, entonces tenía que sacar la batería y esperar 10 segundos, porque el estado del software del sistema operativo se restablecía, mientras que los chips en la placa base y los controladores de dispositivo permanecían activos, manteniendo el estado, los controladores del sistema operativo para ellos. reconectado. 10 segundos: el tiempo que tardan los condensadores en descargarse, el estado de los chips se restablece solo después de un apagado completo.

Si la PC está conectada a una toma de corriente o una batería, entonces está en modo Stand-By, lo que significa que se suministra un pequeño voltaje (5V) a través del bus de energía desde el cual se alimentan algunos chips en la placa base. Al menos este es un controlador de sistemaes esencialmente una mini computadora que ejecuta una computadora grande. Después de recibir una notificación sobre presionar el botón de encendido, le pide a la fuente de alimentación / batería que suministre más voltaje y luego inicializa todo el conjunto de chips, incluido el procesador. La inicialización incluye transferir el código y los datos del firmware de la placa base ( BIOS / UEFI ) a la RAM y configurar la CPU para ejecutarlo.

Es incorrecto pensar que el botón de encendido es un interruptor que suministra electricidad a la CPU y que comienza a ejecutar el firmware del BIOS desde una dirección previamente conocida. Quizás las viejas computadoras funcionaban así. El botón de encendido se encuentra en su placa, junto con los LED de estado y está conectado a la placa base a través de un conector especial. La siguiente imagen muestra los contactos para el botón de encendido, el botón de reinicio, así como los LED con el estado de encendido y la lectura del disco duro. Presionar el botón de encendido se traduce en una señal a los contactos de la placa base, desde donde llega al controlador del sistema.





Pines en la placa base para conectar el botón de encendido, los LED de estado de energía, el disco duro y los altavoces.





Placa base para computadora portátil con botón de encendido y LED de estado El



controlador del sistema tiene enormes poderes: para encender y apagar la computadora, ejecutar código en modo kernel. Además de esto, puede haber otros chips con capacidades comparables, como Intel Management Engine o AMD Secure Technology (parte de la CPU), que también funcionan cuando la computadora está "apagada". El chip Intel ME tiene una CPU x86 que ejecuta el sistema operativo MINIX 3 . Qué puede hacer él:

  1. Enciende y apaga la computadora, es decir ejecutar programas con acceso a toda la potencia informática, periféricos de la máquina y redes.
  2. Omita las restricciones del firewall.
  3. Vea todos los datos en la CPU y la RAM, lo que le da acceso a archivos protegidos con contraseña.
  4. Robar claves de cifrado y acceder a contraseñas
  5. Registrar pulsaciones de teclas y movimientos del mouse
  6. Ver lo que se muestra en la pantalla
  7. El código malicioso en Intel ME no puede ser detectado por antivirus, porque no puede llegar a un nivel tan bajo
  8. Y, por supuesto, envíe datos en secreto a través de la red utilizando su pila para trabajar con la red.


Esto plantea serios problemas de seguridad, ya que puede ser pirateado o utilizado con fines de espionaje.



. (Nvidia 2070 S) , , 600W, ~500W. – 650W . , , – . , . – , ~$300. , . , (PS_ON) (COM). .



Encuentra el cargador de arranque del sistema operativo



Hay dos tipos de firmware de placa base: BIOS (sistema básico de entrada y salida) en máquinas más antiguas y UEFI (interfaz de firmware extensible unificada) en las más nuevas. Windows 10 admite ambos y abstrae las diferencias entre ellos. Es más correcto llamar a UEFI un SO que un firmware, porque ofrece más funciones, por ejemplo, una interfaz gráfica rica en lugar de textual, la presencia de un mouse, más memoria disponible, un modelo de seguridad mejorado y validación de archivos del SO, interacción con hardware a través de API, en lugar de interrupciones como en BIOS.





Ejemplo de pantalla de monitor de BIOS.



El programa BIOS se almacena en un chip separado conectado al South Bridge. Este chip puede obtenerse y actualizarse con un nuevo programa, de hecho, es solo un portador de memoria y no una microcomputadora independiente.





La configuración del BIOS (la hora del sistema, por ejemplo) se almacena en otro chip, que generalmente se encuentra cerca de una batería redonda, que en realidad es una batería de litio que se recarga mientras la PC está funcionando. Se llama CMOS , que significa semiconductor de óxido metálico complementario , y en ruso simplemente CMOS, que es una estructura semiconductora de óxido metálico complementario .





En primer lugar, el programa BIOS verifica los subsistemas, este procedimiento se llama POST - Autoprueba de encendido. La prueba puede ser abreviada o completa, se establece en la configuración del BIOS. Para citar a Wikipedia , qué incluyen estas pruebas: Una

prueba abreviada incluye:

  1. Comprobación de la integridad de los programas de BIOS en la ROM mediante una suma de comprobación.
  2. Detección e inicialización de controladores principales, buses del sistema y dispositivos conectados (adaptador gráfico, controladores de drive, etc.), así como ejecución de programas incluidos en la BIOS de los dispositivos y asegurando su autoinicialización.
  3. Determinando el tamaño de la RAM y probando el primer segmento (64 kilobytes).


Regulaciones completas para POST:

  1. Comprobación de todos los registros del procesador;
  2. Comprobación de la suma de comprobación de la ROM;
  3. Comprobación del temporizador del sistema y el puerto de señalización de sonido (para IBM PC - IC i8253 o equivalente);
  4. Prueba de controlador de acceso directo a memoria;
  5. Prueba de regenerador de RAM;
  6. Prueba del área de RAM inferior para proyectar programas residentes en el BIOS;
  7. Cargando programas para residentes;
  8. Prueba de adaptador de gráficos estándar (VGA o PCI-E);
  9. Prueba de RAM;
  10. Prueba de dispositivos de entrada principales (NO teclados);
  11. Prueba CMOS
  12. Prueba de los principales puertos LPT / COM;
  13. Prueba de unidades de disquete (unidades de disquete);
  14. Prueba de unidades de disco duro (HDD);
  15. Autodiagnóstico de subsistemas funcionales BIOS;
  16. Transfiriendo el control al gestor de arranque.


Los resultados de esta prueba pueden revelar un mal funcionamiento, por ejemplo, una tarjeta de video o un teclado que no funcionan. Dado que es posible que la pantalla del monitor no funcione, los resultados de las pruebas se informan como una serie de pitidos de diferentes alturas. Lo que significan exactamente debe verse en la documentación de la placa base. Las computadoras más antiguas suelen emitir un pitido durante el inicio: este es el programa BIOS que informa los resultados de la prueba. A veces, se puede utilizar un indicador adicional para mostrar el número de error.





Si todo salió bien, el BIOS inicia el proceso de búsqueda del cargador de arranque del sistema operativo. Para hacer esto, comienza a escanear todos los discos duros conectados a la placa base. Los datos de los discos físicos se direccionan en unidades denominadas sector , generalmente de 512 bytes, pero el estándar actual es de 4096 bytes. El instalador de Windows escribe código de programa especial y datos de partición en el primer sector del disco. Este sector se llama Master Boot Record . El disco está dividido en particiones, formateadas con su propio sistema de archivos. Máximo 4 particiones, cada una de las cuales se puede extender (partición extendida), esto se puede dividir de forma recursiva en 4 secciones y, en teoría, su número no está limitado. Tan pronto como el BIOS encuentra el Registro de arranque maestro, lee el código desde allí y le transfiere el control. Este código busca alternativamente los datos en las particiones y encuentra el que está marcado como activo, contiene el código del cargador de arranque de Windows (¡Esta no es la partición con C: \ Windows \ System32!). Esta partición se llama partición del sistema . Por regla general, ocupa 100 MB y está oculto para el usuario. El primer sector de esta sección almacena el código de arranque al que se transfiere el control. Este es el sector de inicio de volumen , el código que contiene busca el archivo Bootmgr , desde el cual comienza el proceso de inicio de Windows. El archivo Bootmgr se crea a través de un enlace único entre los archivos Startup.com yBootmgr.exe .



El procesador comienza su trabajo en el modo llamado "Real" . Se trata de un modo de compatibilidad, en el que la CPU funciona de la misma forma que los antiguos procesadores de 16 bits que no tenían soporte de memoria virtual y trabajaban directamente con memoria física a través de un bus de direcciones de 20 bits que permitía direccionar 1 MB de memoria. Los programas simples de MS-DOS se ejecutaban en este modo y tenían la extensión .COM. Lo primero que hace Startup.com (Bootmgr) es cambiar el procesador al modo "Protegido", donde protección significa la protección de procesos entre sí. Este modo admite memoria virtual y direcciones de 32 bits, que se pueden utilizar para direccionar 4 GB de RAM. El siguiente paso, Bootmgr llena la tabla de direcciones virtuales para los primeros 16 MB de RAM y activa la traducción de direcciones virtuales a físicas. En este modo funciona Windows. Dado que en esta etapa aún no se han creado los subsistemas del SO, Bootmgr tiene su propia implementación simple e incompleta del sistema de archivos NTFS, gracias a la cual encuentra un archivo BCD (Boot Configuration Data) , que almacena la configuración de los parámetros de arranque del SO. Puede editarlo con la utilidad BcdEdit.exe . Esta configuración de BCD puede indicar que Windows estaba en estado de hibernación y luego Bootmgr iniciará el programaWinResume.exe , que lee el estado del archivo Hyberfil.sys en la memoria y reinicia los controladores. Si el BCD dice que hay varios sistemas operativos, Bootmgr mostrará una lista de ellos y le pedirá al usuario que seleccione. Si hay un sistema operativo, entonces Bootmgr lanza WinLoad.exe, este proceso hace el trabajo principal de inicializar Windows:

  1. Selecciona la versión apropiada del kernel de Windows. Puede pensar en él como Windows10.exe aunque en realidad se llame NtOsKrnl.exe. ¿Qué versiones existen? Según wikipedia:

    • ntoskrnl.exe es un kernel de Windows de un solo procesador. sin soporte PAE
    • ntkrnlmp.exe (kernel NT en inglés, versión multiprocesador): kernel multiprocesador de Windows. sin soporte PAE
    • ntkrnlpa.exe — Windows PAE.
    • ntkrpamp.exe — Windows PAE.


  2. HAL.dll (Hardware Abstraction Layer), CPU.
  3. vgaoem.fon
  4. , . National Language System.
  5. Carga el registro del SISTEMA en la memoria, contiene información sobre los controladores que se van a cargar. La información sobre todos los controladores se encuentra en HKLM \ SYSTEM \ CurrentControlSet \ Services \ . Los controladores que deben cargarse tienen la clave start = SERVICE_BOOT_START (0). Hablaremos del dispositivo de registro en otro artículo.
  6. Carga el controlador del sistema de archivos para la partición en la que se encuentran los archivos del controlador.
  7. Carga los controladores en la memoria, pero aún no los inicializa debido a las dependencias circulares.
  8. Prepara los registros de la CPU para la ejecución del kernel de Windows seleccionado en el primer paso: NtOsKrnl.exe.


Cuando se cargan los controladores, WinLoad verifica sus firmas digitales y si no coinciden, habrá una "pantalla de muerte" azul ( BSOD ) o verde ( GSOD , para ensamblajes de vista previa interna).





Ejecutar en UEFI





Un ejemplo de una pantalla de arranque UEFI



BIOS ha existido durante más de 30 años y, en un esfuerzo por corregir sus fallas, Intel creó la Iniciativa de arranque Intel en 1998, luego renombrada como EFI y donada al Foro EFI en 2005. Desventajas del BIOS:

• Funciona solo en modo de 16 bits

• Solo puede direccionar 1 Mb de RAM

• A menudo tiene problemas de compatibilidad

• El MBR está limitado a solo cuatro particiones del disco principal

• Un disco del sistema operativo no puede tener más de 2.2Tb.

• Tiene capacidades muy limitadas para validar el cargador de arranque del sistema operativo.

El BIOS fue reemplazado por UEFI, de hecho, es un sistema operativo en miniatura que puede ejecutarse tanto en 32 bits como en 64 bits. Para compatibilidad, hay una opción Módulo de soporte de compatibilidad, que se incluye en la configuración y emula el BIOS.





En UEFI, el arranque ocurre en el bitness nativo para el procesador - 32 o 64, hay acceso a toda la memoria, la memoria virtual es compatible, el arranque seguro está habilitado y es posible ejecutar antimalware antes de que el sistema operativo comience a cargarse. Orden de arranque del sistema operativo en UEFI:

  1. Inicialización y lanzamiento de firmware, lanzamiento del chipset.
  2. Prueba POST, similar a BIOS
  3. Carga de controladores EFI y búsqueda de un disco de arranque apto para EFI
  4. Busque una carpeta llamada EFI. La especificación UEFI requiere que haya una partición para la partición del sistema EFI , formateada para el sistema de archivos FAT, con un tamaño de 100 MB a 1 GB o no más del 1% del tamaño del disco. Cada Windows instalado tiene su propio directorio en esta partición: EFI \ Microsoft .

  5. UEFI NVRAM ( ) .
  6. EFI/Microsoft/Boot/BootMgrFw.efi.
  7. BootMgrFw.efi BCD, BCD. WinLoad.efi, C:\Windows\System32\winload.efi.


Para ver el contenido de la partición del sistema EFI, abra una consola con derechos de administrador (WinKey + X => Windows PowerShell (Admin)) y ejecute los comandos mountvol Z: / s, Z:, dir . CD - directorio de cambios.

La principal diferencia entre los componentes BootMgr y WinLoad para UEFI de sus contrapartes de BIOS es que usan la API de EFI , en lugar de interrupciones de BIOS, y los formatos de las particiones de arranque de BIOS MBR y Partición del sistema EFI son muy diferentes.



Inicialización del kernel



Permítame recordarle que estamos considerando cargar la PC en el contexto del teclado, por lo que no debe concentrarse en todas las etapas. Es necesario entender dónde está el teclado en este proceso, se resaltan las etapas importantes para la comprensión .

En la etapa anterior, se lanzó el componente WinLoad.exe / WinLoad.efi , que lanza NtOsKrnl.exe especificando los parámetros de arranque en la variable global nt! KeLoaderBlock (la memoria en modo kernel está disponible para todos los procesos), que WinLoad recopiló durante su trabajo. Éstos incluyen:

  1. Rutas a los directorios del sistema (cargador de arranque de Windows) y de arranque ( C: \ Windows \ System32 ).
  2. Puntero a tablas de memoria virtual creadas por WinLoad
  3. Un árbol con una descripción del hardware conectado, se utiliza para crear la clave de registro HKLM \ HARDWARE.
  4. Una copia del registro descargado HKLM \ System
  5. Puntero a la lista de controladores cargados (pero no inicializados) que participan en el inicio de Windows.
  6. Otra información necesaria para descargar.


El kernel de Windows se inicializa en dos etapas. Previo a esto, se inicializa la capa de abstracción de hardware , que, entre otras cosas, configura los controladores de interrupciones para cada CPU.

En la misma etapa, las cadenas con mensajes para BSOD se cargan en la memoria, porque en el momento de una caída pueden ser inaccesibles o dañadas.

  • La primera fase de inicialización del kernel:

    1. Executive – , , . Windows SKU (Stock Keeping Unit), Windows 10 SKU — Home, Pro, Mobile, Enterprise, Education.
    2. Driver Verifier, .
    3. , API (memory services), .
    4. (kernel debugger) .
    5. Windows.
    6. Object Manager – . – . handle table, HWND .
    7. Security Reference Monitor .
    8. Process Manager . Idle System ( “Windows10.exe” NtOsKrnl.exe), , .
    9. User-Mode Debugging Framework.
    10. Plug and Play Manager. PnP – , . .


  • . 51 , :

    1. System (NtOsKrnl.exe) . . – 31.
    2. HAL .
    3. Windows Startup Screen, progress bar.
    4. Executive Semaphore, Mutex, Event, Timer.
    5. User-Mode Debugger .
    6. symbolic link \SystemRoot.
    7. NtDll.dll . Windows APIs.
    8. .
    9. Windows ALPC . named pipes Windows Communication Foundation .
    10. I/O Manager, . .

      Windows Management Instrumentation Event Tracing for Windows ( Windows Performance Analyzer). .
    11. SMSS.exe (Session Manager Sub System). , Windows.




– SMSS, CSRSS, WinInit



SMSS.exe es diferente de los procesos de usuario, es un proceso nativo y esto le otorga permisos adicionales. SMSS.exe trabaja con el kernel sin pasar por la API de Windows, utiliza lo que se llama la API nativa . La API de Windows es un envoltorio de la API nativa. SMSS.exe primero inicia el subsistema de Windows ( CSRSS.exe - Subsistema de tiempo de ejecución del servidor del cliente ) y termina de inicializar el registro.



El proceso y los subprocesos de SMSS.exe se marcan como críticos, lo que significa que si terminan inesperadamente, por ejemplo, debido a un error, esto provocará un bloqueo del sistema. Para comunicarse con subsistemas, por ejemplo, una llamada API que crea una nueva sesión, SMSS crea un puerto ALPC llamado SmApiPort... Las variables de entorno se cargan desde el registro, se inician programas como Check Disk (autochk.exe, estos programas están escritos en el registro HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ BootExecute ). SMSS.exe se inicia para cada sesión de usuario. Cada sesión tiene sus propias variables globales (cola de mensajes, por ejemplo) debido al mecanismo de memoria virtual. Windows tiene contextos de hilo, proceso y sesión. Cada SMSS.exe inicia su propia instancia del subsistema, en este momento solo es CSRSS.exe (Windows), en el pasado, los sistemas operativos OS / 2 (os2ss.exe) y POSIX (psxss.exe) eran compatibles, pero esta idea no tuvo éxito. El primer SMSS.exe entra en suspensión esperando el proceso WinInit.exe. El resto de las instancias, en cambio, crean un proceso WinLogon que muestra la IU de inicio de sesión.



WinInit.exe inicializa los subsistemas para crear un shell gráfico: Windows Station y escritorios , este no es el escritorio que ve, este es un concepto diferente de Windows. Luego comienza los procesos:

  1. Services.exe : el Administrador de control de servicios (SCM) inicia los servicios y controladores marcados como AutoStart. Los servicios se inician en los procesos svchost.exe . Existe una utilidad llamada tlist.exe , que, ejecutada con el parámetro tlist.exe -s , imprimirá en la consola los nombres de los servicios en cada uno de los svchost.exe.
  2. LSASS.exe : autoridad del sistema local.
  3. LSM.exe : administrador de sesiones local.


WinLogon.exe : carga proveedores de credenciales , que pueden ser contraseña, tarjeta inteligente, PIN, Hello Face. Genera el proceso LogonUI.exe, que muestra al usuario una interfaz para la autenticación y luego valida los datos ingresados ​​(inicio de sesión y contraseña, PIN).



Si todo salió bien, WinLogon inicia el proceso especificado en la clave de registro HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit . De forma predeterminada, este es el proceso UserInit.exe , que:

  1. Ejecuta los scripts especificados en los registros:
    • HKCU \ Software \ Políticas \ Microsoft \ Windows \ System \ Scripts
    • HKLM \ SOFTWARE \ Políticas \ Microsoft \ Windows \ System \ Scripts
  2. User Profile Quota, %SystemRoot%\System32\Proquota.exe
  3. Windows, Explorer.exe. :
    • HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
    • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell


WinLogon notifica al proveedor de red sobre el usuario que inició sesión, al cual restaura y conecta los discos del sistema y las impresoras almacenadas en el registro. El proveedor de red es el archivo mpr.dll de la carpeta del sistema, que está alojado en el proceso svchost.exe , es decir, Servicio de Windows.



El árbol de procesos se ve así, en él puede ver quién creó a quién (no se muestran todos los procesos, puede diferir ligeramente de las últimas versiones de Windows).





¿Dónde está el teclado aquí?



Durante el inicio, el kernel de Windows lee información sobre el controlador del bus del sistema del registro, como regla, este es el bus PCI (con menos frecuencia MSI), los controladores de puerto de E / S, incluidos USB, PS / 2, están conectados a él. La información al respecto se registra durante la instalación de Windows. El sistema carga un controlador para él y omite de forma recursiva todos los puertos, y también carga su propio controlador para cada uno de ellos. Los controladores se pueden combinar en nodos de controladores , por ejemplo, un controlador de teclado se conectará a un controlador de puerto PS2. Pero el puerto USB es más complicado: primero el controlador del puerto, luego el controlador para trabajar con el protocolo HID y solo luego el teclado.



Cada puerto está controlado por su propio chip, que monitorea la conexión, recibe / envía señales entre la CPU y el dispositivo. Si el conjunto de chips South Bridge no está integrado en la CPU, como se hace a menudo en las computadoras portátiles, pero existe como un chip separado en la placa base, entonces sería más correcto decir: la señal entre South Bridge y el controlador de puerto. El chip del puerto de control tiene una línea dedicada con un controlador de interrupción (PIC o APIC), a través del cual puede pedirle a la CPU que se preste atención, por ejemplo, leer datos del teclado (puerto PS / 2, con USB, otra historia). Dado que el sistema operativo ha cargado un controlador para el puerto, puede emitir comandos, leer y enviar datos. En nuestro ejemplo, el controlador se cargó desde C: \ Windows \ System32 \ i8042prt.sys . Recordemos el artículo anterior . En computadoras más antiguas con PIC en un chipIntel 8259 tenía 15 líneas de interrupción, donde el teclado estaba conectado al pin IRQ1, el temporizador IRQ0 y el mouse al IRQ12, que en realidad era la quinta pata del segundo chip 8259, que multiplexaba sus interrupciones a través del pin IRQ2 del primer controlador. Los PIC modernos pueden tener 255 pines para señales de interrupción. Durante el arranque, el sistema operativo programa el APIC / PIC para devolver un cierto número cuando, digamos, llega una interrupción desde el teclado o el puerto USB, y por este número la CPU encuentra la función a ejecutar en la tabla de vectores de interrupciones . El número de interrupción lo determina HAL y Plug'n'Play Manager... El controlador de interrupción busca una señal en sus pines en un orden determinado, por ejemplo, en un bucle infinito, verifica el voltaje en los pines de 1 a MAX_PIN. Este orden determina la prioridad, por ejemplo, el teclado se verá antes que el mouse y el temporizador antes que el teclado. Para no depender de las peculiaridades del trabajo de los controladores de interrupciones, Windows abstrae el concepto de IRQ (Interrupt Request) en IRQL (Interrupt Request Level) . Si el controlador de interrupciones tiene al menos 15 al menos 255 líneas, todas se mostrarán en 32 IRQL para x86 y 15 IRQL para x64 e IA64.
¿Qué significan las prioridades de IRQL?

  1. Alto: cuando el sistema falla, generalmente es una llamada a la función KeBugCheckEx.
  2. Fallo de energía: no se usa. Fue diseñado originalmente para Windows NT.
  3. Interprocessor Interrupt – CPU , TLB cache, system shutdown, system crash (BSOD).
  4. Clock – , .
  5. Profile – real-time clock (local APIC-timer) kernel-profiling .
  6. Device 1 … Device N – I/O. , DPC (Deferred Procedure Call), . Dispatch DPC
  7. Dispatch DPC — .
  8. APC — Asynchronous Procedure Call. WaitForSingleObject, Sleep .
  9. Passive/Low — User Mode.


Si siempre ha programado en modo de usuario, nunca ha oído hablar de IRQL, porque todos los programas de usuario se ejecutan con una prioridad Pasiva / Baja (0). Tan pronto como ocurre un evento con b sobre el nivel de prioridad de lshim (eventos de teclado, el temporizador del programador de subprocesos), el procesador guarda el estado del subproceso interrumpido, que es un valor de registro de CPU, y llama a la interrupción del despachador ( el despachador de interrupciones , solo una función), lo que aumenta la prioridad de IRQL a través de la API KeRaiseIrql en la HAL y llama directamente a la rutina de servicio de la interrupción . Después de eso, la CPU IRQL se reduce al nivel anterior a través de la función KeLowerIrqly el hilo interrumpido comienza a procesarse desde el mismo lugar donde fue interrumpido. El programador de subprocesos se basa en este mecanismo . Establece un temporizador que, en un determinado intervalo (intervalo de tiempo), genera una interrupción con la prioridad DPC / Dispatch (2) y, en su rutina de servicio de interrupciones, de acuerdo con un determinado algoritmo, asigna un nuevo hilo para su ejecución.



El mecanismo IRQL se implementa a nivel de software en la capa de abstracción de hardware ( HAL.dll ), no en el hardware. Los sistemas Windows tienen un conductor de autobús), que determina la presencia de dispositivos conectados a los buses: PCI, USB, etc. y los números de interrupción que se pueden asignar a cada dispositivo. El conductor del autobús comunica esta información al administrador Plug and play, que ya decide qué números de interrupción asignar a cada dispositivo. Además, el árbitro de interrupciones dentro de PnP Mgr ( árbitro de interrupciones PnP ) establece vínculos entre IRQ e IRQL.



Cuando llega una interrupción del teclado, cualquier hilo que se esté ejecutando actualmente (este podría ser su programa) se asigna para manejarlo. El despachador de interrupciones eleva la prioridad de la CPU IRQL a uno de los niveles Device1-DeviceN . Después de eso, el administrador de memoria virtual no podrá encontrar la página si no está cargada en la RAM (no podrá procesar Page Fault), el programador de subprocesos no podrá interrumpir la ejecución porque todos se ejecutan en un IRQL inferior. La tarea principal del controlador del teclado en este momento es leer los datos recibidos y guardarlos para su posterior procesamiento. Los datos se escriben en un objeto de tipo _DPC ( Llamada a procedimiento diferido ), que se guarda en la lista de secuencias DPC (algo como std :: list <DPC> , en el kernel del sistema operativo, en lugar de matrices, se utilizan listas vinculadas). Tan pronto como se procesan las interrupciones de todos los dispositivos externos, el IRQL del subproceso se reduce al nivel de DPC en el que se procesan los procedimientos diferidos (DPC). El código del controlador DPC para el teclado llama a una función del controlador de teclado Kbdclass.sys :



VOID KeyboardClassServiceCallback(
  _In_    PDEVICE_OBJECT       DeviceObject,
  _In_    PKEYBOARD_INPUT_DATA InputDataStart,
  _In_    PKEYBOARD_INPUT_DATA InputDataEnd,
  _Inout_ PULONG               InputDataConsumed
);


Entonces, el controlador del teclado (kbdclass.sys) recibe datos del puerto (USB, PS2) a través de una interrupción y los escribe a través de WriteFile , un componente dentro del kernel de Windows se activa , los lee usando la API ReadFile y agrega mensajes desde el teclado a la cola. Las API de archivo se pueden utilizar para leer datos de los controladores. A partir de este momento, comienza el procesamiento de datos por la pila de entrada de Windows, más sobre esto en el próximo artículo.



Si tiene una PC con un puerto PS2 y sabe cómo usar WinDbg en modo kernel, puede encontrar fácilmente un controlador de interrupciones de teclado escribiendo ! Idt , que mostrará toda la tabla de vectores de interrupciones.... La interrupción se inserta en el curso del programa, la palabra vector aquí significa la dirección, la dirección de ejecución del programa. WinDbg se creó específicamente para la depuración de Windows, la versión más reciente se llama WinDbgX. Tiene una interfaz basada en texto que asusta a las personas acostumbradas a Visual Studio, pero ofrece muchas más opciones, en particular, la ejecución de scripts. La interrupción del puerto de PS2 violeta está resaltada en rojo. La función que lo maneja se llama I8042KeyboardInterruptService , que se encuentra en el archivo i8042prt.sys.



BOOLEAN
I8042KeyboardInterruptService(
  IN  PKINTERRUPT Interrupt,
  IN  PVOID Context
  );

Routine Description:

    This is the interrupt service routine for the keyboard device when
    scan code set 1 is in use.

Arguments:

    Interrupt - A pointer to the interrupt object for this interrupt.

    Context - A pointer to the device object.

Return Value:

    Returns TRUE if the interrupt was expected (and therefore processed);
    otherwise, FALSE is returned.




Ahora surge la pregunta, ¿de dónde obtiene su argumento el manejador de interrupciones? ¿Quién lo transmite? Después de todo, la CPU no sabe nada al respecto. Si coloca su punto de interrupción, se sorprendió aún más al ver algunas características más arriba en la pila:



0: kd> kC

# de sitio de llamada

00 i8042prt I8042KeyboardInterruptService!

01 nt KiCallInterruptServiceRoutine!

02 nt KiInterruptSubDispatch!

03 nt KiInterruptSubDispatch! 03 nt KiInterruptDispatch!

04 nt ¡




La explicación de KiIdle es simple! no la función almacenada en el registro IDT del procesador. Lo que ves en la imagen de arriba son en realidad objetos de tipo _KINTERRUPT... La tabla de interrupciones contiene un código ensamblador especial (nt! KiIdleLoop) que sabe cómo encontrar el objeto que describe la interrupción en la memoria. ¿Qué tiene de interesante?

  1. .
  2. i8042prt!I8042KeyboardInterruptService, PS2 IN AL, 0x60 – 0x60 AL.
  3. dispatcher – №2 .
  4. CPU. CPU , .
  5. . , Windows . IRQL (Interrupt Request Level) – IRQ.


Tan pronto como se llame al controlador de interrupciones del teclado, notificará al controlador del teclado de los datos recibidos, después de lo cual se notificará al kernel del sistema operativo, que, después de procesar los datos, los enviará a lo largo de la pila de entrada, donde se pueden entregar a la aplicación que les responderá, o antes de eso, al controlador idiomas (caracteres asiáticos, autocorrección, autocompletar).

El kernel del sistema operativo no interactúa directamente con el controlador del teclado; Plug'n'Play Manager se utiliza para este propósito. Este componente proporciona una API IoRegisterPlugPlayNotification que llamará a la función de devolución de llamada proporcionada cuando se agrega o elimina un dispositivo.



Algunas palabras sobre USB



La familiarización con el funcionamiento del puerto USB requeriría un artículo separado que describa su funcionamiento, además de una descripción del procesamiento de datos HID en Windows. Esto complicaría mucho las cosas, y ya hay buenos artículos sobre el tema, por lo que la PS2 es un ejemplo perfecto por su sencillez.



USB fue creado como un puerto universal para todos los dispositivos, ya sea un teclado, una cámara, un escáner, una rueda de juegos con pedales, una impresora, etc. Además, admite el anidamiento de puertos - placa base USB => monitor con USB => teclado con USB al que se conecta un mouse, unidad flash y concentrador USB al que está conectado el disco duro. Echando un vistazo a los pines USB 2.0, verá que no están diseñados para la transferencia de ningún dato específico, como la PS2. Solo hay cuatro de ellos: un par trenzado para transmitir bits de datos, más y menos potencia.





El cable USB 2.0



conduce a USB 3.0 más rápido con cinco pines adicionales. Como puede ver, no hay una línea CLOCK para la sincronización, por lo que la lógica de transferencia de datos es más complicada. USB 2.0 izquierdo y USB 3.0 derecho para comparar.

Todos los datos se transmiten a través del protocolo HID (Human Interface Device) , que describe los formatos, el orden de interacción y transferencia de datos, y todo lo demás. El estándar USB 2.0 ocupa 650 páginas, el documento de especificación de clase HID que describe el funcionamiento de los dispositivos (mouse, teclado, etc.) - 97 páginas, se recomienda estudiarlos si trabaja con USB.



En primer lugar, el dispositivo conectado debe informar sobre sí mismo, para ello envía varias estructuras de datos, que indican el ID del dispositivo y el ID del fabricante mediante el cual el administrador de Plug'n'Play puede encontrar información en el registro, cargar y conectar controladores. Los dispositivos USB son pasivos, es decir el anfitrión debe verificar la presencia de datos en sí mismo en un cierto intervalo. La velocidad de sondeo y el tamaño del paquete de datos se especifican en uno de los descriptores de dispositivo USB. El tamaño máximo de paquete es de 64 bytes, que es información más que suficiente sobre las pulsaciones de teclas.



Windows tiene soporte HID incorporado, que no es tan simple como vincular un controlador de puerto PS2 a un controlador de teclado porque el controlador HID debe poder manejar todos los scripts admitidos por el protocolo. Independientemente del proveedor de datos (puertos PS2, USB o de escritorio remoto o una máquina virtual), en la parte superior del nodo del controlador habrá Kbdclass, desde el cual el kernel del sistema operativo recibirá información. La notificación de adjunto del teclado se procesará a través de Plug'n'Play Manager , por lo que no le importa al kernel de Windows qué puerto o fuente de datos del dispositivo se utilice.



Parte 1 - Conceptos básicos del sistema operativo y la computadora

Parte 2 - Cómo funcionan la placa base y el teclado a través del puerto PS2



All Articles