Início do sistema
O computador é totalmente desligado quando é desconectado da alimentação e os capacitores da placa-mãe são descarregados. Antes da era dos smartphones, os telefones celulares costumavam apresentar falhas e se uma reinicialização não resolvesse o problema, era necessário retirar a bateria e esperar 10 segundos, porque o estado do software do SO era reiniciado, enquanto os chips da placa-mãe e controladores do dispositivo permaneciam ativos, mantendo o estado, os drivers do SO para eles apenas reconectado. 10 segundos - o tempo para os capacitores descarregarem, o estado dos chips é reiniciado somente após um desligamento completo.
Se o PC estiver conectado a uma tomada ou bateria, ele estará no modo Stand-By, o que significa que uma pequena tensão (5 V) é fornecida pelo barramento de força a partir do qual alguns chips da placa-mãe são alimentados. Pelo menos este é um controlador de sistemaé essencialmente um minicomputador executando um grande computador. Tendo recebido uma notificação sobre o pressionamento do botão Liga / Desliga, ele solicita que a fonte de alimentação / bateria forneça mais voltagem e, em seguida, inicializa todo o conjunto de chips, incluindo o processador. A inicialização inclui a transferência do código e dos dados do firmware da placa-mãe ( BIOS / UEFI ) para a RAM e a configuração da CPU para sua execução.
Pensar que o botão Liga / Desliga é uma chave que fornece eletricidade para a CPU e que inicia a execução do firmware do BIOS a partir de um endereço previamente conhecido está incorreto. Talvez os computadores antigos funcionassem assim. O botão liga / desliga está localizado em sua placa, junto com os LEDs de status, e é conectado à placa-mãe através de um conector especial. A imagem abaixo mostra os contatos do botão Liga / Desliga, botão Reiniciar, bem como os LEDs com o status de Energia e leitura do disco rígido. Pressionar o botão liga / desliga é traduzido em um sinal para os contatos da placa-mãe, de onde chega ao controlador do sistema.

Pinos da placa-mãe para botão liga / desliga, LEDs de status de energia, disco rígido e alto-falantes.

Placa-mãe do laptop com botão
liga / desliga e LED de status O controlador do sistema tem poderes tremendos - para ligar e desligar o computador, execute o código no modo kernel. Além dele, podem existir outros chips com capacidades comparáveis, como Intel Management Engine ou AMD Secure Technology (parte da CPU), que também funcionam quando o computador está "desligado". O chip Intel ME possui uma CPU x86 executando o sistema operacional MINIX 3 . O que ele pode fazer:
- Ligue e desligue o computador, ou seja, execute programas com acesso a todo o poder de computação, periféricos de máquinas e redes.
- Ignore as restrições do firewall.
- Veja todos os dados na CPU e RAM, o que dá acesso a arquivos protegidos por senha.
- Roube chaves de criptografia e obtenha acesso a senhas
- Registrar teclas e movimentos do mouse
- Veja o que é mostrado na tela
- O código malicioso no Intel ME não pode ser detectado pelo antivírus, porque não pode chegar a um nível tão baixo
- E, claro, envie dados secretamente pela rede usando sua pilha para trabalhar com a rede.
Isso levanta sérios problemas de segurança, pois pode ser hackeado ou usado para fins de espionagem.
. (Nvidia 2070 S) , , 600W, ~500W. – 650W . , , – . , . – , ~$300. , . , (PS_ON) (COM). .

Encontre o bootloader do SO
Existem dois tipos de firmware de placa-mãe - BIOS (Basic Input Output System) em máquinas mais antigas e UEFI (Unified Extensible Firmware Interface) em máquinas mais novas. O Windows 10 oferece suporte a ambos e abstrai as diferenças entre eles. É mais correto chamar UEFI de SO do que firmware, porque oferece mais recursos, por exemplo, uma rica interface gráfica em vez de textual, a presença de um mouse, mais memória disponível, um modelo de segurança aprimorado e validação de arquivos de SO, interação com hardware via API, em vez de interrupções como no BIOS.

Exemplo de tela do monitor do BIOS.
O programa BIOS é armazenado em um chip separado conectado à South Bridge. Este chip pode ser obtido e reflashed com um novo programa, na verdade ele é apenas um portador de memória, e não um microcomputador independente.

As configurações do BIOS (hora do sistema, por exemplo) são armazenadas em outro chip, que geralmente está localizado próximo a uma bateria redonda, que na verdade é uma bateria de lítio que recarrega enquanto o PC está funcionando. É chamado de CMOS , que significa Complementary Metal Oxide Semiconductor , e em russo simplesmente - CMOS, que é uma estrutura complementar de metal-óxido-semicondutor .

Em primeiro lugar, o programa BIOS verifica os subsistemas, este procedimento é denominado POST - Power On Self Test. O teste pode ser abreviado ou completo, ele é definido nas configurações do BIOS. Para citar a Wikipedia , o que esses testes incluem: Um
teste abreviado inclui:
- Verificando a integridade dos programas BIOS na ROM usando uma soma de verificação.
- Detecção e inicialização dos principais controladores, barramentos do sistema e dispositivos conectados (placa gráfica, controladores de disco, etc.), bem como a execução dos programas incluídos na BIOS dos dispositivos e garantindo sua auto-inicialização.
- Determinar o tamanho da RAM e testar o primeiro segmento (64 kilobytes).
Regulamentos completos para POST:
- Verificar todos os registros do processador;
- Verificando a soma de verificação da ROM;
- Verificar o temporizador do sistema e a porta de sinalização de som (para IBM PC - IC i8253 ou equivalente);
- Teste de controlador de acesso direto à memória;
- Teste do regenerador de RAM;
- Teste da área de RAM inferior para projetar programas residentes na BIOS;
- Carregando programas residentes;
- Teste de adaptador gráfico padrão (VGA ou PCI-E);
- Teste de RAM;
- Teste dos principais dispositivos de entrada (NÃO manipuladores);
- Teste CMOS
- Teste das principais portas LPT / COM;
- Teste de unidades de disquete (unidades de disquete);
- Teste de unidades de disco rígido (HDD);
- Auto-diagnóstico de subsistemas funcionais do BIOS;
- Transferindo o controle para o bootloader.
Os resultados deste teste podem revelar um mau funcionamento, por exemplo, uma placa de vídeo ou teclado não funcionando. Como a tela do monitor pode não funcionar, os resultados dos testes são relatados como uma série de bipes de diferentes alturas. O que exatamente eles significam deve ser visto na documentação da placa-mãe. Computadores mais antigos costumam emitir um bipe durante a inicialização - este é o programa BIOS relatando os resultados do teste. Às vezes, um indicador adicional pode ser usado para mostrar o número do erro.

Se tudo correr bem, o BIOS inicia o processo de localização do carregador de inicialização do sistema operacional. Para fazer isso, ele começa a escanear todos os discos rígidos conectados à placa-mãe. Os dados em discos físicos são endereçados em unidades chamadas de setor , geralmente 512 bytes, mas o padrão atual é 4096 bytes. O instalador do Windows grava o código do programa especial e os dados da partição no primeiro setor do disco. Este setor é denominado Master Boot Record . O disco é dividido em partições, formatadas com seu próprio sistema de arquivos. Máximo de 4 partições, cada uma das quais pode ser estendida (partição estendida), isso pode ser dividido recursivamente em 4 seções e, teoricamente, seu número não é limitado. Assim que o BIOS encontra o Master Boot Record, ele lê o código de lá e transfere o controle para ele. Este código procura alternadamente os dados nas partições e encontra aquele que está marcado como ativo, ele contém o código do carregador de inicialização do Windows (esta não é a partição com C: \ Windows \ System32!). Esta partição é chamada de partição do sistema . Via de regra, ele ocupa 100 MB e fica oculto para o usuário. O primeiro setor desta seção armazena o código de inicialização para o qual o controle é transferido. Este é o setor de inicialização do volume , o código nele procura o arquivo Bootmgr , a partir do qual o processo de inicialização do Windows começa. O arquivo Bootmgr é criado por meio de um único link entre os arquivos Startup.com eBootmgr.exe .
O processador inicia seu trabalho no modo denominado "Real" . Trata-se de um modo de compatibilidade, no qual a CPU funciona da mesma forma que os antigos processadores de 16 bits que não tinham suporte para memória virtual e funcionavam diretamente com a memória física por meio de um barramento de endereço de 20 bits que permitia o endereçamento de 1 MB de memória. Programas simples do MS-DOS eram executados neste modo e tinham a extensão .COM. A primeira coisa que o Startup.com (Bootmgr) faz é mudar o processador para o modo "Protegido", onde proteção significa a proteção dos processos uns dos outros. Neste modo, memória virtual e endereços de 32 bits são suportados, que podem ser usados para endereçar 4 GB de RAM. A próxima etapa, Bootmgr preenche a tabela de endereços virtuais para os primeiros 16 MB de RAM e ativa a tradução de endereços virtuais para endereços físicos. Neste modo o Windows funciona. Como nesta fase os subsistemas do sistema operacional ainda não foram criados, o Bootmgr tem sua própria implementação simples e incompleta do sistema de arquivos NTFS, graças ao qual encontra um arquivo BCD (Boot Configuration Data) , que armazena as configurações para os parâmetros de boot do sistema operacional. Você pode editá-lo usando o utilitário BcdEdit.exe . Essas configurações de BCD podem indicar que o Windows estava em estado de hibernação e então o Bootmgr iniciará o programaWinResume.exe , que lê o estado do arquivo Hyberfil.sys na memória e reinicia os drivers. Se o BCD informar que há vários sistemas operacionais, o Bootmgr exibirá uma lista deles e solicitará que o usuário selecione. Se houver um sistema operacional, o Bootmgr iniciará o WinLoad.exe, este processo fará o trabalho principal de inicialização do Windows:
- Seleciona a versão apropriada do kernel do Windows. Você pode pensar nele como Windows10.exe, embora na verdade seja chamado de NtOsKrnl.exe. Que versões existem? De acordo com a wikipedia:
- ntoskrnl.exe é um kernel do Windows de processador único. sem suporte PAE
- ntkrnlmp.exe (Inglês NT Kernel, versão Multi-Processor) - Kernel do Windows multiprocessador. sem suporte PAE
- ntkrnlpa.exe — Windows PAE.
- ntkrpamp.exe — Windows PAE.
- HAL.dll (Hardware Abstraction Layer), CPU.
- vgaoem.fon
- , . National Language System.
- Carrega o registro SYSTEM na memória, ele contém informações sobre os drivers a serem carregados. As informações sobre todos os drivers estão localizadas em HKLM \ SYSTEM \ CurrentControlSet \ Services \ . Os drivers que precisam ser carregados têm a chave start = SERVICE_BOOT_START (0). Falaremos sobre o dispositivo de registro em outro artigo.
- Carrega o driver do sistema de arquivos para a partição na qual os arquivos do driver estão localizados.
- Carrega os drivers na memória, mas ainda não os inicializa devido a dependências circulares.
- Prepara os registros da CPU para a execução do kernel do Windows selecionado na primeira etapa - NtOsKrnl.exe.
Quando os drivers são carregados, o WinLoad verifica suas assinaturas digitais e se elas não corresponderem, haverá uma "tela da morte" azul ( BSOD ) ou verde ( GSOD , para montagens de visualização interna ).

Executar em UEFI

Um exemplo de tela de inicialização UEFI
BIOS já existe há mais de 30 anos e, em um esforço para corrigir suas falhas, a Intel criou a Intel Boot Initiative em 1998, posteriormente renomeada para EFI e doada ao Fórum EFI em 2005. Desvantagens do BIOS:
• Funciona apenas no modo de 16 bits
• Pode endereçar apenas 1 MB de RAM
• Freqüentemente tem problemas de compatibilidade
• MBR é limitado a apenas quatro partições do disco principal
• Um disco do sistema operacional não pode ter mais de 2,2 TB.
• Possui recursos muito limitados para validar o carregador de inicialização do sistema operacional.
O BIOS foi substituído por UEFI, na verdade é um sistema operacional em miniatura que pode ser executado em 32 bits e 64 bits. Para compatibilidade, existe uma opção Módulo de Suporte de Compatibilidade, que está incluído nas configurações e emula o BIOS.

Na UEFI, a inicialização ocorre no bitness nativo do processador - 32 ou 64, há acesso a toda a memória, a memória virtual é suportada, a inicialização segura está habilitada e é possível executar o antimalware antes que o sistema operacional comece a carregar. Ordem de inicialização do sistema operacional em UEFI:
- Inicialização e lançamento de firmware, lançamento de chipset.
- Teste POST, semelhante ao BIOS
- Carregando drivers EFI e encontrando um disco de inicialização elegível para EFI
- Procure uma pasta chamada EFI. A especificação UEFI requer que haja uma partição para a partição do sistema EFI , formatada para o sistema de arquivos FAT, com um tamanho de 100 MB - 1 GB, ou não mais que 1% do tamanho do disco. Cada Windows instalado tem seu próprio diretório nesta partição - EFI \ Microsoft .
- UEFI NVRAM ( ) .
- EFI/Microsoft/Boot/BootMgrFw.efi.
- BootMgrFw.efi BCD, BCD. WinLoad.efi, C:\Windows\System32\winload.efi.
Para visualizar o conteúdo da partição do sistema EFI, abra um console com direitos de administrador (WinKey + X => Windows PowerShell (Admin)) e execute os comandos mountvol Z: / s, Z :, dir . CD - muda o diretório.
A principal diferença entre os componentes BootMgr e WinLoad para UEFI de suas contrapartes do BIOS é que eles usam a API EFI em vez de interrupções do BIOS, e os formatos das partições de inicialização do BIOS MBR e partição do sistema EFI são muito diferentes.
Inicialização do kernel
Deixe-me lembrá-lo de que estamos considerando carregar o PC no contexto do teclado, então você não deve se concentrar em todos os estágios. É necessário entender onde está o teclado neste processo, as etapas importantes para o entendimento são destacadas .
No estágio anterior, o componente WinLoad.exe / WinLoad.efi foi lançado , o qual inicia NtOsKrnl.exe especificando parâmetros de inicialização na variável global nt! KeLoaderBlock (a memória do modo kernel está disponível para todos os processos) que o WinLoad coletou durante seu trabalho. Esses incluem:
- Caminhos para os diretórios Sistema (carregador de inicialização do Windows) e Inicialização ( C: \ Windows \ System32 ).
- Ponteiro para tabelas de memória virtual criadas por WinLoad
- Uma árvore com uma descrição do hardware conectado, é usada para criar a chave de registro HKLM \ HARDWARE.
- Uma cópia do registro baixado HKLM \ System
- Ponteiro para a lista de drivers carregados (mas não inicializados) que participam da inicialização do Windows.
- Outras informações necessárias para fazer o download.
O kernel do Windows é inicializado em dois estágios. Antes disso, é inicializada a Camada de Abstração de Hardware , que, entre outras coisas, configura os controladores de interrupção para cada CPU.
No mesmo estágio, strings com mensagens para BSOD são carregadas na memória, pois no momento da queda podem estar inacessíveis ou danificadas.
- Primeira fase de inicialização do kernel:
- Executive – , , . Windows SKU (Stock Keeping Unit), Windows 10 SKU — Home, Pro, Mobile, Enterprise, Education.
- Driver Verifier, .
- , API (memory services), .
- (kernel debugger) .
- Windows.
- Object Manager – . – . handle table, HWND .
- Security Reference Monitor .
- Process Manager . Idle System ( “Windows10.exe” NtOsKrnl.exe), , .
- User-Mode Debugging Framework.
- Plug and Play Manager. PnP – , . .
- . 51 , :
- System (NtOsKrnl.exe) . . – 31.
- HAL .
- Windows Startup Screen, progress bar.
- Executive Semaphore, Mutex, Event, Timer.
- User-Mode Debugger .
- symbolic link \SystemRoot.
- NtDll.dll . Windows APIs.
- .
- Windows ALPC . named pipes Windows Communication Foundation .
- I/O Manager, . .
Windows Management Instrumentation Event Tracing for Windows ( Windows Performance Analyzer). . - SMSS.exe (Session Manager Sub System). , Windows.
– SMSS, CSRSS, WinInit
SMSS.exe é diferente dos processos do usuário, é um processo nativo e isso lhe dá permissões adicionais. SMSS.exe funciona com o kernel ignorando a API do Windows, ele usa o que é chamado de API nativa . A API do Windows é um invólucro da API nativa. SMSS.exe primeiro inicia o subsistema Windows ( CSRSS.exe - Client Server Runtime Sub System ) e conclui a inicialização do registro.
O processo SMSS.exe e os threads são marcados como críticos, o que significa que, se encerrarem inesperadamente, por exemplo, devido a um erro, isso levará a uma falha do sistema. Para se comunicar com subsistemas, por exemplo, uma chamada de API criando uma nova sessão, o SMSS cria uma porta ALPC chamada SmApiPort... Variáveis de ambiente são carregadas do registro, programas como Check Disk (autochk.exe, esses programas são escritos no registro HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ BootExecute ) são iniciados . SMSS.exe é iniciado para cada sessão de usuário. Variáveis globais (fila de mensagens, por exemplo) cada sessão possui a sua devido ao mecanismo da memória virtual. O Windows tem contextos de thread, processo e sessão. Cada SMSS.exe inicia sua própria instância do subsistema, no momento é apenas CSRSS.exe (Windows), no passado, os sistemas operacionais OS / 2 (os2ss.exe) e POSIX (psxss.exe) eram suportados, mas a ideia não deu certo. O primeiro SMSS.exe entra em suspensão aguardando o processo WinInit.exe. Em vez disso, o restante das instâncias cria um processo WinLogon que exibe a IU de login.
WinInit.exe inicializa subsistemas para a criação de um shell gráfico - Windows Station e desktops , este não é o desktop que você vê, este é um conceito diferente do Windows. Em seguida, ele inicia os processos:
- Services.exe - O Gerenciador de Controle de Serviços (SCM) inicia serviços e drivers marcados como AutoStart. Os serviços são iniciados em processos svchost.exe . Existe um utilitário chamado tlist.exe que, quando executado com o parâmetro tlist.exe -s , imprime no console os nomes dos serviços em cada um dos svchost.exe.
- LSASS.exe - autoridade do sistema local.
- LSM.exe - Gerenciador de sessão local.
WinLogon.exe - carrega provedores de credenciais , que podem ser senha, cartão inteligente, PIN, Hello Face. Ele gera o processo LogonUI.exe, que mostra ao usuário uma interface para autenticação e, em seguida, valida os dados inseridos (login e senha, PIN).
Se tudo correr bem, o WinLogon iniciará o processo especificado na chave do Registro HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit . Por padrão, este é o processo UserInit.exe , que:
- Executa scripts especificados nos registros:
- HKCU \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts
- HKLM \ SOFTWARE \ Policies \ Microsoft \ Windows \ System \ Scripts
- User Profile Quota, %SystemRoot%\System32\Proquota.exe
- Windows, Explorer.exe. :
- HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
- HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
O WinLogon notifica o Provedor de Rede sobre o usuário conectado, ao qual ele restaura e conecta os discos do sistema e as impressoras armazenadas no registro. O provedor de rede é o arquivo mpr.dll da pasta do sistema, que é hospedado pelo processo svchost.exe , ou seja, Serviço Windows.
A árvore de processos é semelhante a esta, nela você pode ver quem criou quem (nem todos os processos são mostrados, pode ser um pouco diferente das versões mais recentes do Windows).

Onde está o teclado aqui?
Durante a inicialização, o kernel do Windows lê informações sobre o controlador de barramento do sistema do registro, como regra, este é o barramento PCI (menos frequentemente MSI), controladores de porta de E / S, incluindo USB, PS / 2, estão conectados a ele. As informações sobre ele são registradas durante a instalação do Windows. O sistema carrega um driver para ele e ignora recursivamente todas as portas, também carregando seu próprio driver para cada uma delas. Os drivers podem ser combinados em nós de driver , por exemplo, um driver de teclado será conectado a um driver de porta PS2. Mas a porta USB é mais complicada - primeiro o driver da porta, depois o driver para trabalhar com o protocolo HID e só então o teclado.
Cada porta é controlada por seu próprio chip, que monitora a conexão, recebe / envia sinais entre a CPU e o dispositivo. Se o chipset South Bridge não estiver embutido na CPU, como costuma ser feito em laptops, mas existir como um chip separado na placa-mãe, seria mais correto dizer: o sinal entre a South Bridge e o controlador de porta. O chip da porta de controle possui uma linha dedicada com um controlador de interrupção (PIC ou APIC), por meio do qual pode solicitar que a CPU preste atenção a si mesma, por exemplo, ler dados do teclado (porta PS / 2, com USB, outra história). Como o sistema operacional carregou um driver para a porta, ele pode emitir comandos para ela, ler e enviar dados. Em nosso exemplo, o driver foi carregado de C: \ Windows \ System32 \ i8042prt.sys . Vamos nos lembrar do artigo anterior . Em computadores mais antigos com PIC em um chipIntel 8259 tinha 15 linhas de interrupção, onde o teclado era conectado ao pino IRQ1, o temporizador IRQ0 e o mouse ao IRQ12, que era na verdade a quinta perna do segundo chip 8259, que multiplexava suas interrupções por meio do pino IRQ2 do primeiro controlador. Os PICs modernos podem ter 255 pinos para sinais de interrupção. Durante a inicialização, o sistema operacional programa o APIC / PIC para retornar um certo número quando, digamos, uma interrupção chegar do teclado ou da porta USB, e por meio desse número a CPU encontra a função a ser executada na tabela de vetor de interrupção . O número de interrupção é determinado por HAL e Gerenciador de Plug'n'Play... O controlador de interrupção procura um sinal em seus pinos em uma determinada ordem, por exemplo, em um loop infinito, ele verifica a tensão nos pinos de 1 a MAX_PIN. Essa ordem determina a prioridade, por exemplo, o teclado será visto antes do mouse, e o cronômetro antes do teclado. Para não depender das peculiaridades do trabalho dos controladores de interrupção, o Windows abstrai o conceito de IRQ (Interrupt Request) em IRQL (Interrupt Request Level) . Se o controlador de interrupção tiver pelo menos 15 ou 255 linhas, todas elas serão mapeadas para 32 IRQL para x86 e 15 IRQL para x64 e IA64.
![]() |
![]() |
- Alto - Quando o sistema trava, geralmente é uma chamada para a função KeBugCheckEx.
- Falha de energia - não usado. Ele foi originalmente projetado para Windows NT.
- Interprocessor Interrupt – CPU , TLB cache, system shutdown, system crash (BSOD).
- Clock – , .
- Profile – real-time clock (local APIC-timer) kernel-profiling .
- Device 1 … Device N – I/O. , DPC (Deferred Procedure Call), . Dispatch DPC
- Dispatch DPC — .
- APC — Asynchronous Procedure Call. WaitForSingleObject, Sleep .
- Passive/Low — User Mode.
Se você sempre programou em modo de usuário, nunca ouviu falar de IRQL, porque todos os programas de usuário são executados com uma prioridade Passiva / Baixa (0). Assim que ocorre um evento com b sobre o nível de prioridade lshim (eventos de teclado, o cronômetro do agendador de thread), o processador salva o estado do thread interrompido, que é um valor de registro da CPU, e chama a interrupção do dispatcher ( o dispatcher de interrupção , apenas uma função), que aumenta a prioridade IRQL por meio da API KeRaiseIrql no HAL e chama diretamente a própria rotina de serviço da interrupção . Depois disso, o IRQL da CPU é reduzido ao nível anterior por meio da função KeLowerIrqle o thread interrompido começa a processar a partir do mesmo lugar onde foi interrompido. O planejador de thread é baseado neste mecanismo . Define um temporizador que, em um determinado intervalo (fração de tempo), gera uma interrupção com prioridade DPC / Dispatch (2) e, na rotina de serviço de sua interrupção, segundo um determinado algoritmo, atribui uma nova thread para execução.
O mecanismo IRQL é implementado no nível do software na Camada de Abstração de Hardware ( HAL.dll ), não no hardware. Os sistemas Windows têm um motorista de ônibus), que determina a presença de dispositivos conectados aos barramentos - PCI, USB, etc. e os números de interrupção que podem ser atribuídos a cada dispositivo. O motorista do barramento comunica essas informações ao gerenciador Plug and play, que já decide quais números de interrupção atribuir a cada dispositivo. Além disso, o árbitro de interrupção dentro do PnP Mgr ( árbitro de interrupção PnP ) estabelece ligações entre IRQ e IRQL.
Quando chega uma interrupção de teclado, qualquer thread atualmente em execução (pode ser o seu programa) é designado para controlá-la. O distribuidor de interrupção aumenta a prioridade de IRQL da CPU para um dos níveis Device1-DeviceN . Depois disso, o gerenciador de memória virtual não será capaz de encontrar a página se ela não estiver carregada na RAM (não será capaz de processar a falha de página), o planejador de thread não será capaz de interromper a execução porque todos eles são executados em um IRQL inferior. A principal tarefa do driver do teclado neste momento é ler os dados recebidos e salvá-los para processamento posterior. Os dados são gravados em um objeto do tipo _DPC ( Deferred Procedure Call ), que é salvo na lista de fluxo DPC (algo como std :: list <DPC> , no kernel do SO, em vez de arrays, listas vinculadas são usadas). Assim que as interrupções de todos os dispositivos externos são processadas, o IRQL da thread é reduzido ao nível DPC no qual os procedimentos adiados (DPC) são processados. O código do manipulador DPC para o teclado chama uma função do driver de teclado Kbdclass.sys :
VOID KeyboardClassServiceCallback(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PKEYBOARD_INPUT_DATA InputDataStart,
_In_ PKEYBOARD_INPUT_DATA InputDataEnd,
_Inout_ PULONG InputDataConsumed
);
Assim, o driver do teclado (kbdclass.sys) recebe os dados da porta (USB, PS2) através de uma interrupção e os grava através do WriteFile , um componente dentro do kernel do Windows desperta, lê usando a API ReadFile e adiciona mensagens do teclado à fila. APIs de arquivo podem ser usadas para ler dados de drivers. A partir deste momento, começa o processamento dos dados pela pilha de entrada do Windows, mais sobre isso no próximo artigo.
Se você tem um PC com uma porta PS2 e sabe como usar o WinDbg no modo kernel, pode facilmente encontrar um manipulador de interrupção de teclado digitando ! Idt , que exibirá toda a tabela de vetores de interrupção.... A interrupção se insere no curso do programa, a palavra vetor aqui significa a direção, a direção da execução do programa. WinDbg foi feito especificamente para depuração do Windows, a versão mais recente é chamada WinDbgX. Possui uma interface baseada em texto que assusta as pessoas acostumadas ao Visual Studio, mas oferece muito mais opções, em particular, a execução de scripts. A interrupção da porta PS2 roxa é destacada em vermelho. A função que o controla é chamada I8042KeyboardInterruptService , que está localizada no arquivo 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.

Agora surge a pergunta: de onde o manipulador de interrupções obtém seu argumento? Quem o está transmitindo? Afinal, a CPU não sabe nada sobre isso. Se você colocar em seu ponto de interrupção, foi ainda mais surpreso ao ver algumas características mais elevada na pilha:
0: kd> kC
# de Call site
! 00 i8042prt I8042KeyboardInterruptService
! 01 nt KiCallInterruptServiceRoutine
! 02 nt KiInterruptSubDispatch
! 03 nt KiInterruptDispatch
! 04 nt KiIdleLoop
A explicação é simples - é não a função armazenada no registro IDT do processador. O que você vê na imagem acima são na verdade objetos do tipo _KINTERRUPT... A tabela de interrupção contém um código de montagem especial (nt! KiIdleLoop) que sabe como encontrar o objeto que descreve a interrupção na memória. O que há de interessante nisso?
- .
- i8042prt!I8042KeyboardInterruptService, PS2 IN AL, 0x60 – 0x60 AL.
- dispatcher – №2 .
- CPU. CPU , .
- . , Windows . IRQL (Interrupt Request Level) – IRQ.
Assim que o manipulador de interrupção do teclado for chamado, ele notificará o driver do teclado dos dados recebidos, após o que o kernel do sistema operacional será notificado, que, tendo processado os dados, os enviará mais adiante na pilha de entrada, onde poderão ser entregues ao aplicativo que irá responder a eles, ou antes disso ao manipulador idiomas (caracteres asiáticos, correção automática, preenchimento automático).
O kernel do sistema operacional não interage diretamente com o driver do teclado; o Plug'n'Play Manager é usado para essa finalidade. Este componente fornece a API IoRegisterPlugPlayNotification que chamará a função de retorno de chamada fornecida quando um dispositivo for adicionado ou removido.
Algumas palavras sobre USB
A familiarização com a operação da porta USB exigiria um artigo separado descrevendo sua operação, além de uma descrição do processamento de dados HID no Windows. Isso complicaria muito o material, e já existem bons artigos sobre o assunto, então o PS2 é um exemplo perfeito pela sua simplicidade.
USB foi criado como uma porta universal para todos os dispositivos, seja um teclado, uma câmera, um scanner, uma roda de jogo com pedais, uma impressora, etc. Além disso, ele suporta aninhamento de portas - placa-mãe USB => monitor com USB => teclado com USB ao qual um mouse está conectado, unidade flash e hub USB ao qual o disco rígido está conectado. Observando os pinos USB 2.0, você verá que eles não foram projetados para a transferência de nenhum dado específico, como o PS2. Existem apenas quatro deles - um par trançado para transmissão de bits de dados, mais e menos potência.

O
cabo USB 2.0 leva ao USB 3.0 mais rápido com cinco pinos adicionais. Como você pode ver, não há linha CLOCK para sincronização, então a lógica de transferência de dados é mais complicada. USB 2.0 esquerdo e USB 3.0 direito para comparação.
![]() |
![]() |
Em primeiro lugar, o dispositivo conectado deve falar sobre si mesmo, para isso envia várias estruturas de dados, que indicam o ID do dispositivo e o ID do fabricante, pelo qual o gerenciador Plug'n'Play pode encontrar informações no registro, carregar e conectar os drivers. Os dispositivos USB são passivos, ou seja, o host deve verificar a presença de dados em um determinado intervalo. A taxa de polling e o tamanho do pacote de dados são especificados em um dos descritores do dispositivo USB. O tamanho máximo do pacote é de 64 bytes, que é mais do que informações suficientes sobre as teclas pressionadas.
O Windows tem suporte HID embutido, não é tão simples quanto vincular um driver de porta PS2 a um driver de teclado porque o driver HID deve ser capaz de lidar com todos os scripts suportados pelo protocolo. Independentemente do provedor de dados - portas PS2, USB ou Remote Desktop ou uma máquina virtual - bem no topo do nó do driver estará Kbdclass, do qual o kernel do sistema operacional receberá informações. A notificação de anexo do teclado será processada por meio do Plug'n'Play Manager , portanto, não importa para o kernel do Windows qual porta ou fonte de dados do dispositivo é usada.
Parte 1 - Sistema operacional e conceitos básicos sobre computador
Parte 2 - Como a placa-mãe e o teclado funcionam através da porta PS2