Sur PC, partie 3: de la mise sous tension au chargement complet de Windows 10

Nous continuons à comprendre le fonctionnement d'un PC sur l'exemple d'un clavier et de Windows 10. Dans cet article, nous allons parler de la manière dont le logiciel et le matériel sont combinés.



Démarrage du système



L'ordinateur est complètement éteint lorsqu'il est déconnecté de l'alimentation et les condensateurs de la carte mère sont déchargés. Avant l'ère des smartphones, les téléphones portables avaient souvent des problèmes et si un redémarrage ne résolvait pas le problème, vous deviez retirer la batterie et attendre 10 secondes, car l'état du logiciel du système d'exploitation était réinitialisé, tandis que les puces de la carte mère et des contrôleurs de périphériques restaient actives, en conservant l'état, les pilotes du système d'exploitation pour eux juste reconnecté. 10 secondes - le temps nécessaire aux condensateurs pour se décharger, l'état des puces n'est réinitialisé qu'après un arrêt complet.

Si le PC est connecté à une prise ou à une batterie, alors il est en mode Stand-By, ce qui signifie qu'une petite tension (5V) est fournie via le bus d'alimentation à partir duquel certaines puces de la carte mère sont alimentées. Au moins c'est un contrôleur systèmeest essentiellement un mini-ordinateur exécutant un gros ordinateur. Après avoir reçu une notification concernant le fait d'appuyer sur le bouton d'alimentation, il demande à l'alimentation / à la batterie de fournir plus de tension, puis initialise l'ensemble du jeu de puces, y compris le processeur. L'initialisation comprend le transfert du code et des données du micrologiciel de la carte mère ( BIOS / UEFI ) dans la RAM et la configuration du processeur pour l'exécuter.

Penser que le bouton d'alimentation est un commutateur qui fournit de l'électricité au processeur et qui commence à exécuter le micrologiciel du BIOS à partir d'une adresse connue précédemment est incorrect. Peut-être que les vieux ordinateurs fonctionnaient comme ça. Le bouton d'alimentation est situé sur sa carte, avec les voyants d'état et est connecté à la carte mère via un connecteur spécial. L'image ci-dessous montre les contacts du bouton d'alimentation, du bouton de réinitialisation, ainsi que des voyants avec l'état de l'alimentation et la lecture du disque dur. Le fait d'appuyer sur le bouton d'alimentation est traduit en un signal aux contacts de la carte mère, d'où il atteint le contrôleur système.





Broches de la carte mère pour le bouton d'alimentation, les voyants d'état de l'alimentation, le disque dur et les haut-parleurs.





Carte pour ordinateur portable avec bouton d'alimentation et voyant d'état Le



contrôleur système dispose d'énormes pouvoirs - pour allumer et éteindre l'ordinateur, exécutez du code en mode noyau. En outre, il peut y avoir d'autres puces avec des capacités comparables, telles que Intel Management Engine ou AMD Secure Technology (partie du CPU), qui fonctionnent également lorsque l'ordinateur est "éteint". La puce Intel ME possède un processeur x86 exécutant le système d'exploitation MINIX 3 . Ce qu'il peut faire:

  1. Allumez et éteignez l'ordinateur, c.-à-d. exécuter des programmes avec accès à toute la puissance de calcul, aux périphériques et aux réseaux de la machine.
  2. Contourner les restrictions de pare-feu.
  3. Voir toutes les données du processeur et de la RAM, ce qui donne accès aux fichiers protégés par mot de passe.
  4. Volez les clés de cryptage et accédez aux mots de passe
  5. Enregistrer les frappes et les mouvements de la souris
  6. Voir ce qui est affiché à l'écran
  7. Le code malveillant dans Intel ME ne peut pas être détecté par l'antivirus, car il ne peut pas atteindre un niveau aussi bas
  8. Et bien sûr, envoyez secrètement des données sur le réseau en utilisant votre pile pour travailler avec le réseau.


Cela soulève de graves problèmes de sécurité car il peut être piraté ou utilisé à des fins d'espionnage.



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



Trouver le chargeur de démarrage du système d'exploitation



Il existe deux types de micrologiciels de carte mère - BIOS (Basic Input Output System) sur les anciennes machines et UEFI (Unified Extensible Firmware Interface) sur les plus récentes. Windows 10 prend en charge les deux et résume les différences entre eux. Il est plus correct d'appeler UEFI un OS qu'un firmware, car il offre plus de fonctionnalités, par exemple, une interface graphique riche au lieu d'une interface textuelle, la présence d'une souris, plus de mémoire disponible, un modèle de sécurité amélioré et la validation des fichiers OS, l'interaction avec le matériel via l'API, au lieu d'interruptions comme dans le BIOS.





Exemple d'écran du moniteur BIOS.



Le programme BIOS est stocké sur une puce séparée connectée au South Bridge. Cette puce peut être obtenue et reflashée avec un nouveau programme, en fait il ne s'agit que d'un support de mémoire et non d'un micro-ordinateur indépendant.





Les paramètres du BIOS (heure du système, par exemple) sont stockés sur une autre puce, qui est généralement située à proximité d'une batterie ronde, qui est en fait une batterie au lithium qui se recharge pendant que le PC fonctionne. Il s'appelle CMOS , ce qui signifie semi - conducteur à oxyde métallique complémentaire , et en russe simplement - CMOS, qui est une structure complémentaire métal-oxyde-semi-conducteur .





Tout d'abord, le programme BIOS vérifie les sous-systèmes, cette procédure s'appelle POST - Power On Self Test. Le test peut être abrégé ou complet, il est défini dans les paramètres du BIOS. Pour citer Wikipedia , ce que ces tests incluent: Un

test abrégé comprend:

  1. Vérification de l'intégrité des programmes du BIOS dans la ROM à l'aide d'une somme de contrôle.
  2. Détection et initialisation des principaux contrôleurs, bus système et périphériques connectés (carte graphique, contrôleurs de disque, etc.), ainsi que l'exécution des programmes inclus dans le BIOS des périphériques et assurant leur auto-initialisation.
  3. Détermination de la taille de la RAM et test du premier segment (64 kilo-octets).


Règlement complet pour POST:

  1. Vérification de tous les registres du processeur;
  2. Vérification de la somme de contrôle de la ROM;
  3. Vérification de la minuterie système et du port de signalisation sonore (pour IBM PC - IC i8253 ou équivalent);
  4. Test du contrôleur d'accès direct à la mémoire;
  5. Test du régénérateur RAM;
  6. Test de la zone RAM inférieure pour projeter les programmes résidents dans le BIOS;
  7. Chargement des programmes résidents;
  8. Test d'adaptateur graphique standard (VGA ou PCI-E);
  9. Test de RAM;
  10. Test des principaux périphériques d'entrée (PAS de manipulateurs);
  11. Test CMOS
  12. Test des principaux ports LPT / COM;
  13. Test des lecteurs de disquettes (lecteurs de disquettes);
  14. Test des disques durs (HDD);
  15. Autodiagnostic des sous-systèmes fonctionnels du BIOS;
  16. Transfert du contrôle au bootloader.


Ce test peut révéler un dysfonctionnement, tel qu'une carte vidéo ou un clavier qui ne fonctionne pas. Étant donné que l'écran du moniteur peut ne pas fonctionner, les résultats des tests sont signalés sous la forme d'une série de bips de différentes hauteurs. Ce qu'ils signifient exactement doit être vu dans la documentation de la carte mère. Les ordinateurs plus anciens émettent souvent des bips au démarrage - c'est le programme BIOS qui rapporte les résultats des tests. Parfois, un indicateur supplémentaire peut être utilisé pour afficher le numéro d'erreur.





Si tout s'est bien passé, le BIOS démarre le processus de recherche du chargeur de démarrage du système d'exploitation. Pour ce faire, il commence à scanner tous les disques durs connectés à la carte mère. Les données sur les disques physiques sont adressées dans des unités appelées secteur , généralement 512 octets, mais la norme actuelle est de 4096 octets. Le programme d'installation de Windows écrit le code de programme spécial et les données de partition dans le tout premier secteur du disque. Ce secteur est appelé Master Boot Record . Le disque est divisé en partitions, formatées avec leur propre système de fichiers. Maximum 4 partitions, chacune pouvant être étendue (partition étendue), celui-ci peut être divisé récursivement en 4 sections et théoriquement leur nombre n'est pas limité. Dès que le BIOS trouve le Master Boot Record, il lit le code à partir de là et lui transfère le contrôle. Ce code regarde alternativement les données sur les partitions et trouve celle qui est marquée comme active, il contient le code du chargeur de démarrage Windows (Ce n'est pas la partition avec C: \ Windows \ System32!), Cette partition est appelée la partition système . En règle générale, il occupe 100 Mo et est caché à l'utilisateur. Le premier secteur de cette section stocke le code de démarrage auquel le contrôle est transféré. Il s'agit du secteur de démarrage du volume , le code qu'il contient recherche le fichier Bootmgr , à partir duquel le processus de démarrage de Windows commence. Le fichier Bootmgr est créé via un lien unique entre les fichiers Startup.com etBootmgr.exe .



Le processeur commence son travail dans le mode dit "Real" . Il s'agit d'un mode de compatibilité, dans lequel le processeur fonctionne de la même manière que les anciens processeurs 16 bits qui ne prenaient pas en charge la mémoire virtuelle et fonctionnaient directement avec la mémoire physique via un bus d'adresse 20 bits, ce qui permettait d'adresser 1 Mo de mémoire. Les programmes MS-DOS simples s'exécutaient dans ce mode et portaient l'extension .COM. La première chose que fait Startup.com (Bootmgr) est de mettre le processeur en mode «Protégé», où la protection signifie la protection des processus les uns des autres. Dans ce mode, la mémoire virtuelle et les adresses 32 bits sont prises en charge, ce qui peut être utilisé pour adresser 4 Go de RAM. L'étape suivante, Bootmgr remplit la table d'adresses virtuelles pour les 16 premiers Mo de RAM et active la traduction d'adresses virtuelles en adresses physiques. Dans ce mode, Windows fonctionne. Étant donné qu'à ce stade, les sous-systèmes du système d'exploitation n'ont pas encore été créés, Bootmgr a sa propre implémentation simple et incomplète du système de fichiers NTFS, grâce à laquelle il trouve un fichier BCD (données de configuration de démarrage) , qui stocke les paramètres des paramètres de démarrage du système d'exploitation. Vous pouvez le modifier à l'aide de l'utilitaire BcdEdit.exe . Ces paramètres BCD peuvent indiquer que Windows était en état d'hibernation, puis Bootmgr démarrera le programmeWinResume.exe , qui lit l'état du fichier Hyberfil.sys en mémoire et redémarre les pilotes. Si le BCD indique qu'il existe plusieurs systèmes d'exploitation, Bootmgr affichera une liste d'entre eux et demandera à l'utilisateur de sélectionner. S'il existe un système d'exploitation, Bootmgr lance WinLoad.exe, ce processus effectue le travail principal d'initialisation de Windows:

  1. Sélectionne la version appropriée du noyau Windows. Vous pouvez le considérer comme Windows10.exe même s'il s'appelle en fait NtOsKrnl.exe. Quelles versions existe-t-il? Selon wikipedia:

    • ntoskrnl.exe est un noyau Windows à processeur unique. sans support PAE
    • ntkrnlmp.exe (noyau NT anglais, version multi-processeurs) - noyau multiprocesseur Windows. sans support PAE
    • ntkrnlpa.exe — Windows PAE.
    • ntkrpamp.exe — Windows PAE.


  2. HAL.dll (Hardware Abstraction Layer), CPU.
  3. vgaoem.fon
  4. , . National Language System.
  5. Charge le registre SYSTEM en mémoire, il contient des informations sur les pilotes à charger. Les informations sur tous les pilotes se trouvent dans HKLM \ SYSTEM \ CurrentControlSet \ Services \ . Les pilotes qui doivent être chargés ont la clé start = SERVICE_BOOT_START (0). Nous parlerons du périphérique de registre dans un autre article.
  6. Charge le pilote du système de fichiers pour la partition sur laquelle se trouvent les fichiers du pilote.
  7. Charge les pilotes en mémoire, mais ne les initialise pas encore en raison de dépendances circulaires.
  8. Prépare les registres du processeur pour l'exécution du noyau Windows sélectionné à la première étape - NtOsKrnl.exe.


Lorsque les pilotes sont chargés, WinLoad vérifie leurs signatures numériques et si elles ne correspondent pas, il y aura un "écran de mort" bleu ( BSOD ) ou vert ( GSOD , pour les assemblées de prévisualisation d'initié).





Exécuter sur UEFI





Un exemple d'écran de démarrage du



BIOS UEFI existe depuis plus de 30 ans et dans le but de corriger ses défauts, Intel a créé l'Initiative de démarrage Intel en 1998, renommée plus tard EFI et a fait un don au Forum EFI en 2005. Inconvénients du BIOS:

• Fonctionne uniquement en mode 16 bits

• Ne peut adresser que 1 Mo de RAM

• A souvent des problèmes de compatibilité

• Le MBR est limité à seulement quatre partitions de disque principales

• Le disque du système d'exploitation ne peut pas dépasser 2,2 To.

• Possède des capacités très limitées pour valider le chargeur de démarrage du système d'exploitation.

Le BIOS a été remplacé par UEFI, en fait c'est un système d'exploitation miniature qui peut fonctionner à la fois en 32 bits et en 64 bits. Pour la compatibilité, il existe une option Module de support de compatibilité, qui est inclus dans les paramètres et émule le BIOS.





Dans UEFI, le démarrage se produit dans le bitness natif du processeur - 32 ou 64, il y a accès à toute la mémoire, la mémoire virtuelle est prise en charge, le démarrage sécurisé est activé et il est possible d'exécuter un antimalware avant le chargement du système d'exploitation. Ordre de démarrage du système d'exploitation dans UEFI:

  1. Initialisation et lancement du firmware, lancement du chipset.
  2. Test POST, similaire au BIOS
  3. Chargement des pilotes EFI et recherche d'un disque de démarrage éligible EFI
  4. Recherchez un dossier nommé EFI. La spécification UEFI exige qu'il y ait une partition pour la partition système EFI , formatée pour le système de fichiers FAT, avec une taille de 100 Mo à 1 Go ou pas plus de 1% de la taille du disque. Chaque Windows installé a son propre répertoire sur cette partition - EFI \ Microsoft .

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


Pour afficher le contenu de la partition système EFI, ouvrez une console avec des droits d'administrateur (WinKey + X => Windows PowerShell (Admin)) et exécutez les commandes mountvol Z: / s, Z:, dir . CD - change de répertoire.

La principale différence entre les composants BootMgr et WinLoad pour UEFI de leurs homologues BIOS est qu'ils utilisent l' API EFI , au lieu des interruptions du BIOS, et les formats du BIOS MBR et des partitions système EFI sont très différents.



Initialisation du noyau



Permettez-moi de vous rappeler que nous envisageons de charger le PC dans le contexte du clavier, vous ne devez donc pas vous concentrer sur toutes les étapes. Il est nécessaire de comprendre où se trouve le clavier dans ce processus, les étapes importantes pour la compréhension sont mises en évidence .

À l'étape précédente, le composant WinLoad.exe / WinLoad.efi a été lancé , qui lance NtOsKrnl.exe en spécifiant les paramètres de démarrage dans la variable globale nt! KeLoaderBlock (la mémoire en mode noyau est disponible pour tous les processus), que WinLoad a collectée au cours de son travail. Ceux-ci inclus:

  1. Chemins d'accès aux répertoires système (chargeur de démarrage Windows) et de démarrage ( C: \ Windows \ System32 ).
  2. Pointeur vers les tables de mémoire virtuelle créées par WinLoad
  3. Une arborescence avec une description du matériel connecté, elle permet de créer la clé de registre HKLM \ HARDWARE.
  4. Une copie du registre téléchargé HKLM \ System
  5. Pointeur vers la liste des pilotes chargés (mais non initialisés) participant au démarrage de Windows.
  6. Autres informations nécessaires au téléchargement.


Le noyau Windows est initialisé en deux étapes. Avant cela, la couche d'abstraction matérielle est initialisée , ce qui, entre autres, configure les contrôleurs d'interruption pour chaque CPU.

Au même stade, les chaînes contenant des messages pour BSOD sont chargées en mémoire, car au moment de la chute elles peuvent être inaccessibles ou endommagées.

  • La première phase d'initialisation du noyau:

    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 est différent des processus utilisateur, il s'agit d'un processus natif et cela lui donne des autorisations supplémentaires. SMSS.exe fonctionne avec le noyau en contournant l'API Windows, il utilise ce qu'on appelle l' API native . L'API Windows est un wrapper autour de l'API native. SMSS.exe démarre d'abord le sous-système Windows ( CSRSS.exe - Client Server Runtime Sub System ) et termine l'initialisation du registre.



Le processus et les threads SMSS.exe sont marqués comme critiques, ce qui signifie que s'ils se terminent de manière inattendue, par exemple en raison d'une erreur, cela entraînera une panne du système. Pour communiquer avec des sous-systèmes, par exemple, un appel d'API créant une nouvelle session, SMSS crée un port ALPC nommé SmApiPort... Les variables d'environnement sont chargées à partir du registre, des programmes tels que Check Disk (autochk.exe, ces programmes sont écrits dans le registre HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ BootExecute ) sont lancés . SMSS.exe est lancé pour chaque session utilisateur. Chaque session a ses propres variables globales (file d'attente de messages, par exemple) grâce au mécanisme de mémoire virtuelle. Windows a des contextes de thread, de processus et de session. Chaque SMSS.exe démarre sa propre instance du sous-système, pour le moment il ne s'agit que de CSRSS.exe (Windows), dans le passé, les systèmes d'exploitation OS / 2 (os2ss.exe) et POSIX (psxss.exe) étaient pris en charge, mais cette idée n'a pas abouti. Le tout premier SMSS.exe se met en veille en attendant le processus WinInit.exe. Le reste des instances crée à la place un processus WinLogon qui affiche l'interface utilisateur de connexion.



WinInit.exe initialise les sous-systèmes pour créer un shell graphique - Windows Station et les bureaux , ce n'est pas le bureau que vous voyez, c'est un concept Windows différent. Ensuite, il démarre les processus:

  1. Services.exe - Services Control Manager (SCM) démarre les services et les pilotes marqués comme AutoStart. Les services sont démarrés dans les processus svchost.exe . Il existe un utilitaire appelé tlist.exe qui, lorsqu'il est exécuté avec le paramètre tlist.exe -s , imprime sur la console les noms des services dans chacun des svchost.exe.
  2. LSASS.exe - Autorité système locale.
  3. LSM.exe - Gestionnaire de session local.


WinLogon.exe - Charge les fournisseurs d'informations d'identification , qui peuvent être un mot de passe, une carte à puce, un code PIN, Hello Face. Il génère le processus LogonUI.exe, qui montre à l'utilisateur une interface d'authentification, puis valide les données saisies (login et mot de passe, PIN).



Si tout s'est bien passé, WinLogon démarre le processus spécifié dans la clé de registre HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit . Par défaut, il s'agit du processus UserInit.exe , qui:

  1. Exécute les scripts spécifiés dans les registres:
    • HKCU \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts
    • HKLM \ SOFTWARE \ Policies \ 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 informe le fournisseur de réseau de l'utilisateur connecté, auquel il restaure et connecte les disques système et les imprimantes stockés dans le registre. Le fournisseur de réseau est le fichier mpr.dll du dossier système, qui est hébergé par le processus svchost.exe , c'est-à-dire Service Windows.



L'arborescence des processus ressemble à ceci, vous pouvez voir qui a créé qui (tous les processus ne sont pas affichés, il peut différer légèrement des dernières versions de Windows).





Où est le clavier ici?



Au démarrage, le noyau Windows lit les informations sur le contrôleur de bus système à partir du registre, en règle générale, il s'agit du bus PCI (moins souvent MSI), les contrôleurs de port d'E / S, y compris USB, PS / 2, y sont connectés. Les informations à ce sujet sont enregistrées lors de l'installation de Windows. Le système charge un pilote pour celui-ci et contourne récursivement tous les ports, chargeant également son propre pilote pour chacun d'eux. Les pilotes peuvent être combinés en nœuds de pilote , par exemple un pilote de clavier sera connecté à un pilote de port PS2. Mais le port USB est plus compliqué - d'abord le pilote de port, puis le pilote pour travailler avec le protocole HID, et seulement ensuite le clavier.



Chaque port est contrôlé par sa propre puce, qui surveille la connexion, reçoit / envoie des signaux entre le CPU et l'appareil. Si le chipset South Bridge n'est pas intégré au processeur, comme c'est souvent le cas dans les ordinateurs portables, mais existe en tant que puce séparée sur la carte mère, alors il serait plus correct de dire: le signal entre le South Bridge et le contrôleur de port. La puce du port de contrôle a une ligne dédiée avec un contrôleur d'interruption (PIC ou APIC), à travers laquelle elle peut demander au CPU de faire attention à lui-même, par exemple, lire des données depuis le clavier (port PS / 2, avec USB, une autre histoire). Puisque le système d'exploitation a chargé un pilote pour le port, il peut lui envoyer des commandes, lire et envoyer des données. Dans notre exemple, le pilote a été chargé à partir de C: \ Windows \ System32 \ i8042prt.sys . Souvenons-nous de l' article précédent . Dans les ordinateurs plus anciens avec PIC sur une puceIntel 8259 avait 15 lignes d'interruption, où le clavier était connecté à la broche IRQ1, la minuterie IRQ0 et la souris à IRQ12, qui était en fait la cinquième jambe de la deuxième puce 8259, qui multiplexait ses interruptions via la broche IRQ2 du premier contrôleur. Les PIC modernes peuvent avoir 255 broches pour les signaux d'interruption. Pendant le démarrage, le système d'exploitation programme l'APIC / PIC pour renvoyer un certain nombre lorsque, par exemple, une interruption arrive du clavier ou du port USB, et par ce nombre, le CPU trouve la fonction à exécuter dans la table des vecteurs d'interruption . Le numéro d'interruption est déterminé par HAL et Plug'n'Play Manager... Le contrôleur d'interruption recherche un signal sur ses broches dans un certain ordre, par exemple, dans une boucle infinie, il vérifie la tension sur les broches de 1 à MAX_PIN. Cet ordre détermine la priorité, par exemple, le clavier sera vu avant la souris et la minuterie avant le clavier. Afin de ne pas dépendre des particularités du travail des contrôleurs d'interruption, Windows fait abstraction du concept d' IRQ (Interrupt Request) dans IRQL (Interrupt Request Level) . Si le contrôleur d'interruption a au moins 15 ou 255 lignes, elles seront toutes mappées sur 32 IRQL pour x86 et 15 IRQL pour x64 et IA64.
Que signifient les priorités IRQL:

  1. High - Lorsque le système tombe en panne, il s'agit généralement d'un appel à la fonction KeBugCheckEx.
  2. Panne de courant - non utilisé. Il a été conçu à l'origine pour 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 vous avez toujours programmé en mode utilisateur, vous n'avez jamais entendu parler d'IRQL, car tous les programmes utilisateur sont exécutés avec une priorité passive / basse (0). Dès qu'un événement se produit avec b à propos du niveau de priorité lshim (événements de clavier, minuterie du programmateur de thread), le processeur enregistre l'état du thread interrompu, qui est une valeur de registre du processeur, et appelle l'interruption du répartiteur ( le répartiteur d'interruption , juste une fonction), ce qui augmente la priorité IRQL via l'API KeRaiseIrql dans le HAL et appelle directement la routine de service de l' interruption elle-même . Après cela, l'IRQL du CPU est abaissé au niveau précédent via la fonction KeLowerIrqlet le thread interrompu commence le traitement à partir du même endroit où il a été interrompu. Le planificateur de thread est basé sur ce mécanisme . Il définit un temporisateur qui, à un certain intervalle (tranche de temps), génère une interruption avec la priorité DPC / Dispatch (2) et, dans sa routine de service d'interruption, selon un certain algorithme, attribue un nouveau thread pour l'exécution.



Le mécanisme IRQL est implémenté au niveau logiciel dans la couche d'abstraction matérielle ( HAL.dll ), et non au niveau matériel. Les systèmes Windows ont un pilote de bus), qui détermine la présence de périphériques connectés aux bus - PCI, USB, etc. et les numéros d'interruption pouvant être attribués à chaque périphérique. Le pilote de bus communique ces informations au gestionnaire Plug and Play, qui décide déjà des numéros d'interruption à attribuer à chaque périphérique. En outre, l'arbitre d'interruption au sein du PnP Mgr ( arbitre d'interruption PnP ) établit des liens entre IRQ et IRQL.



Lorsqu'une interruption clavier arrive, tout thread en cours d'exécution (cela peut être votre programme) est assigné pour le gérer. Le répartiteur d'interruption élève la priorité IRQL du processeur à l'un des niveaux Device1-DeviceN . Après cela, le gestionnaire de mémoire virtuelle ne pourra pas trouver la page si elle n'est pas chargée dans la RAM (ne pourra pas traiter l' erreur de page), le planificateur de thread ne pourra pas interrompre l'exécution car ils s'exécutent tous à un IRQL inférieur. La tâche principale du pilote de clavier à ce moment est de lire les données reçues et de les enregistrer pour un traitement ultérieur. Les données sont écrites dans un objet de type _DPC ( Appel de procédure différée ), qui est enregistré dans la liste du flux DPC (quelque chose comme std :: list <DPC> , dans le noyau du système d'exploitation, au lieu de tableaux, des listes liées sont utilisées). Dès que les interruptions de tous les périphériques externes sont traitées, l'IRQL du thread est abaissé au niveau DPC dans lequel les procédures différées (DPC) sont traitées. Le code du gestionnaire de clavier DPC appelle une fonction à partir du pilote de clavier Kbdclass.sys :



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


Ainsi, le pilote de clavier (kbdclass.sys) reçoit les données du port (USB, PS2) via une interruption et les écrit via WriteFile , un composant à l'intérieur du noyau Windows se réveille, les lit à l'aide de l'API ReadFile et ajoute les messages du clavier à la file d'attente. Les API de fichiers peuvent être utilisées pour lire les données des pilotes. A partir de ce moment, le traitement des données par la pile d'entrée Windows commence, plus à ce sujet dans l'article suivant.



Si vous avez un PC avec un port PS2 et que vous savez utiliser WinDbg en mode noyau, vous pouvez facilement trouver un gestionnaire d'interruption de clavier en tapant ! Idt , qui affichera l'intégralité de la table des vecteurs d'interruption.... L'interruption se coince dans le cours du programme, le mot vecteur signifie ici la direction, la direction d'exécution du programme. WinDbg a été spécialement conçu pour le débogage de Windows, la version la plus récente s'appelle WinDbgX. Il dispose d'une interface textuelle qui effraie les personnes habituées à Visual Studio, mais offre de nombreuses autres options, en particulier l'exécution de scripts. L'interruption du port PS2 violet est surlignée en rouge. La fonction qui le gère s'appelle I8042KeyboardInterruptService , qui se trouve dans le fichier 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.




Maintenant, la question se pose, d'où le gestionnaire d'interruption tire-t-il son argument? Qui le transmet? Après tout, le CPU n'en sait rien. Si vous mettez dans son point d' arrêt, il a été encore plus surpris de voir quelques fonctionnalités plus sur la pile:



0: kd> kC

Nombre d'appels du site

! 00 i8042prt I8042KeyboardInterruptService

! 01 nt KiCallInterruptServiceRoutine

! 02 nt KiInterruptSubDispatch

! 03 nt KiInterruptDispatch

! 04 nt KiIdleLoop




L'explication est simple - il est pas la fonction stockée dans le registre IDT du processeur. Ce que vous voyez dans l'image ci-dessus sont en fait des objets de type _KINTERRUPT... La table d'interruption contient un code d'assemblage spécial (nt! KiIdleLoop) qui sait comment trouver l'objet décrivant l'interruption en mémoire. Qu'est-ce qui est intéressant à ce sujet?

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


Dès que le gestionnaire d'interruption de clavier est appelé, il informera le pilote de clavier des données reçues, après quoi le noyau du système d'exploitation sera averti, qui, après le traitement des données, les enverra plus loin le long de la pile d'entrée, où il pourra être livré à l'application qui y répondra, ou avant cela au gestionnaire. langues (caractères asiatiques, correction automatique, saisie semi-automatique).

Le noyau du système d'exploitation n'interagit pas directement avec le pilote du clavier; Plug'n'Play Manager est utilisé à cet effet. Ce composant fournit une API IoRegisterPlugPlayNotification qui appellera la fonction de rappel fournie lorsqu'un périphérique est ajouté ou supprimé.



Quelques mots sur l'USB



La familiarisation avec le fonctionnement du port USB nécessiterait un article séparé décrivant son fonctionnement, ainsi qu'une description du traitement des données HID sous Windows. Cela compliquerait beaucoup les choses, et il y a déjà de bons articles sur le sujet, donc la PS2 est un parfait exemple en raison de sa simplicité.



L'USB a été créé comme port universel pour tous les appareils, que ce soit un clavier, une caméra, un scanner, une molette de jeu avec des pédales, une imprimante, etc. et le concentrateur USB auquel le disque dur est connecté. En regardant les broches USB 2.0, vous verrez qu'elles ne sont pas conçues pour le transfert de données spécifiques, comme la PS2. Il n'y en a que quatre - une paire torsadée pour la transmission de bits de données, plus et moins de puissance.





Le câble USB 2.0



mène à l'USB 3.0 plus rapidement avec cinq broches supplémentaires. Comme vous pouvez le voir, il n'y a pas de ligne CLOCK pour la synchronisation, donc la logique de transfert de données est plus compliquée. USB 2.0 gauche et USB 3.0 droit pour comparaison.

Toutes les données sont transmises via le protocole HID (Human Interface Device) , qui décrit les formats, l'ordre d'interaction et de transfert de données, et tout le reste. La norme USB 2.0 prend 650 pages, le document de spécification de classe HID décrivant le fonctionnement des appareils (souris, clavier, etc.) - 97 pages, il est recommandé de les étudier si vous travaillez avec USB.



Tout d'abord, l'appareil connecté doit parler de lui-même, pour cela il envoie plusieurs structures de données, qui indiquent l'ID de l'appareil et l'ID du fabricant par lesquels le gestionnaire Plug'n'Play peut trouver des informations dans le registre, charger et connecter les pilotes. Les périphériques USB sont passifs, c'est-à-dire l'hôte doit vérifier la présence de données lui-même à un certain intervalle. Le taux d'interrogation et la taille du paquet de données sont spécifiés dans l'un des descripteurs de périphérique USB. La taille maximale des paquets est de 64 octets, ce qui est plus que suffisant d'informations sur les touches enfoncées.



Windows a un support HID intégré, ce n'est pas aussi simple que de lier un pilote de port PS2 à un pilote de clavier, car le pilote HID doit être capable de gérer tous les scripts pris en charge par le protocole. Quel que soit le fournisseur de données - PS2, ports USB ou Remote Desktop ou une machine virtuelle - tout en haut du nœud du pilote, il y aura Kbdclass, à partir duquel le noyau du système d'exploitation recevra des informations. La notification de pièce jointe du clavier sera traitée via Plug'n'Play Manager , donc peu importe pour le noyau Windows le port ou la source de données de l'appareil utilisé.



Partie 1 - Bases du système d'exploitation et de l'ordinateur

Partie 2 - Fonctionnement de la carte mère et du clavier via le port PS2



All Articles