Auf dem PC arbeiten Teil 3: Vom Einschalten bis zum vollständigen Laden von Windows 10

Wir verstehen weiterhin, wie ein PC am Beispiel einer Tastatur und von Windows 10 funktioniert. In diesem Artikel werden wir darüber sprechen, wie Software und Hardware kombiniert werden.



Systemstart



Der Computer ist vollständig ausgeschaltet, wenn er vom Stromnetz getrennt und die Kondensatoren auf der Hauptplatine entladen werden. Vor der Ära der Smartphones waren Mobiltelefone häufig fehlerhaft. Wenn ein Neustart das Problem nicht beheben konnte, musste der Akku herausgenommen und 10 Sekunden gewartet werden, da der Status der Betriebssystemsoftware zurückgesetzt wurde, während die Chips auf der Hauptplatine und den Gerätesteuerungen aktiv blieben und der Status und die Betriebssystemtreiber für sie beibehalten wurden gerade wieder verbunden. 10 Sekunden - die Zeit, in der sich die Kondensatoren entladen, der Zustand der Chips wird erst nach einer vollständigen Abschaltung zurückgesetzt.

Wenn der PC an eine Steckdose oder einen Akku angeschlossen ist, befindet er sich im Standby-Modus. Dies bedeutet, dass eine kleine Spannung (5 V) über den Energiebus geliefert wird, über den einige Chips auf dem Motherboard mit Strom versorgt werden. Zumindest ist dies eine Systemsteuerungist im Wesentlichen ein Mini-Computer, auf dem ein großer Computer ausgeführt wird. Nachdem er eine Benachrichtigung über das Drücken des Netzschalters erhalten hat, fordert er das Netzteil / die Batterie auf, mehr Spannung zu liefern, und initialisiert dann den gesamten Chipsatz einschließlich des Prozessors. Die Initialisierung umfasst das Übertragen des Motherboard-Firmware-Codes und der Daten ( BIOS / UEFI ) in den RAM und das Einstellen der CPU für die Ausführung.

Es ist falsch zu glauben, dass der Netzschalter ein Schalter ist, der die CPU mit Strom versorgt und die BIOS-Firmware von einer zuvor bekannten Adresse aus ausführt. Vielleicht haben die alten Computer so funktioniert. Der Netzschalter befindet sich zusammen mit den Status-LEDs auf der Platine und ist über einen speziellen Anschluss mit der Hauptplatine verbunden. Das Bild unten zeigt die Kontakte für die Ein- / Aus-Taste, die Reset-Taste sowie LEDs mit dem Power-Status und dem Festplattenlesen. Durch Drücken des Netzschalters wird ein Signal an die Motherboard-Kontakte gesendet, von wo aus es den Systemcontroller erreicht.





Stifte auf der Hauptplatine zum Anschließen des Netzschalters, der Stromstatus-LEDs, der Festplatte und der Lautsprecher.





Laptop-Motherboard mit Netzschalter und Status-LED Der



Systemcontroller verfügt über enorme Leistungen. Um den Computer ein- und auszuschalten, führen Sie den Code im Kernelmodus aus. Daneben gibt es möglicherweise andere Chips mit vergleichbaren Funktionen wie Intel Management Engine oder AMD Secure Technology (Teil der CPU), die auch funktionieren, wenn der Computer "ausgeschaltet" ist. Der Intel ME-Chip verfügt über eine x86-CPU mit dem Betriebssystem MINIX 3 . Was er tun kann:

  1. Schalten Sie den Computer ein und aus, d.h. Führen Sie Programme mit Zugriff auf alle Rechenleistungen, Maschinenperipheriegeräte und Netzwerke aus.
  2. Firewall-Einschränkungen umgehen.
  3. Alle Daten in CPU und RAM anzeigen, um auf kennwortgeschützte Dateien zuzugreifen.
  4. Stehlen Sie Verschlüsselungsschlüssel und erhalten Sie Zugriff auf Passwörter
  5. Protokollieren Sie Tastenanschläge und Mausbewegungen
  6. Sehen Sie, was auf dem Bildschirm angezeigt wird
  7. Schädlicher Code in Intel ME kann von Antivirus nicht erkannt werden, da er nicht auf ein so niedriges Niveau gelangen kann
  8. Und natürlich senden Sie Daten heimlich über das Netzwerk, indem Sie Ihren Stack verwenden, um mit dem Netzwerk zu arbeiten.


Dies wirft schwerwiegende Sicherheitsprobleme auf, da es gehackt oder für Spionagezwecke verwendet werden kann.



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



Suchen Sie den Betriebssystem-Bootloader



Es gibt zwei Arten von Motherboard-Firmware: BIOS (Basic Input Output System) auf älteren Computern und UEFI (Unified Extensible Firmware Interface) auf neueren. Windows 10 unterstützt beide und abstrahiert die Unterschiede zwischen ihnen. Es ist korrekter, UEFI als Betriebssystem als Firmware zu bezeichnen, da es mehr Funktionen bietet, z. B. eine umfangreiche grafische Oberfläche anstelle einer Textoberfläche, das Vorhandensein einer Maus, mehr verfügbaren Speicher, ein verbessertes Sicherheitsmodell und die Validierung von Betriebssystemdateien, die Interaktion mit der Hardware über die API anstelle von Interrupts wie im BIOS.





Beispiel für einen BIOS-Monitorbildschirm.



Das BIOS-Programm wird auf einem separaten Chip gespeichert, der mit der South Bridge verbunden ist. Dieser Chip kann mit einem neuen Programm erhalten und neu geflasht werden. Tatsächlich ist er nur ein Speicherträger und kein unabhängiger Mikrocomputer.





BIOS-Einstellungen (z. B. Systemzeit) werden auf einem anderen Chip gespeichert, der sich normalerweise in der Nähe einer runden Batterie befindet. Hierbei handelt es sich tatsächlich um eine Lithiumbatterie, die bei laufendem PC aufgeladen wird. Es heißt CMOS , was bedeutet , Complementary Metal Oxide Semiconductor , und in russischen einfach - CMOS, worin a complementary metal-oxide-semiconductor Struktur .





Zunächst überprüft das BIOS-Programm die Subsysteme. Diese Prozedur wird als POST - Power On Self Test bezeichnet. Der Test kann abgekürzt oder abgeschlossen werden und wird in den BIOS-Einstellungen festgelegt. Um Wikipedia zu zitieren , umfassen diese Tests: Ein

abgekürzter Test umfasst:

  1. Überprüfen der Integrität von BIOS-Programmen im ROM mithilfe einer Prüfsumme.
  2. Erkennung und Initialisierung der Hauptcontroller, Systembusse und angeschlossenen Geräte (Grafikadapter, Festplattencontroller usw.) sowie Ausführung von Programmen, die im BIOS von Geräten enthalten sind, und Sicherstellung ihrer Selbstinitialisierung.
  3. Bestimmen der Größe des Arbeitsspeichers und Testen des ersten Segments (64 Kilobyte).


Vollständige Bestimmungen für POST:

  1. Überprüfen aller Prozessorregister;
  2. Überprüfen der Prüfsumme des ROM;
  3. Überprüfen des Systemtimers und des Tonsignalisierungsanschlusses (für IBM PC - IC i8253 oder gleichwertig);
  4. Direkter Speicherzugriffscontrollertest;
  5. RAM-Regenerator-Test;
  6. Test des unteren RAM-Bereichs für die Projektion residenter Programme im BIOS;
  7. Laden residenter Programme;
  8. Standard-Grafikadaptertest (VGA oder PCI-E);
  9. RAM-Test;
  10. Test der Haupteingabegeräte (NICHT Tastaturen);
  11. CMOS-Test
  12. Test der Hauptanschlüsse LPT / COM;
  13. Test von Diskettenlaufwerken (Diskettenlaufwerke);
  14. Test von Festplatten (HDD);
  15. Selbstdiagnose von BIOS-Funktionssubsystemen;
  16. Übertragung der Kontrolle an den Bootloader.


Dieser Test kann eine Fehlfunktion aufdecken, z. B. eine nicht funktionierende Grafikkarte oder Tastatur. Da der Bildschirm möglicherweise nicht funktioniert, werden die Testergebnisse als eine Reihe von Signaltönen unterschiedlicher Höhe angezeigt. Was genau sie bedeuten, sollte in der Dokumentation für das Motherboard zu sehen sein. Ältere Computer piepen häufig beim Start - dies ist das BIOS-Programm, das die Testergebnisse meldet. Manchmal kann ein zusätzlicher Indikator verwendet werden, um die Fehlernummer anzuzeigen.





Wenn alles gut gegangen ist, startet das BIOS die Suche nach dem Betriebssystem-Bootloader. Dazu beginnt er, alle an das Motherboard angeschlossenen Festplatten zu scannen. Daten auf physischen Festplatten werden in Einheiten adressiert, die als Sektor bezeichnet werden , normalerweise 512 Byte, aber der aktuelle Standard ist 4096 Byte. Das Windows-Installationsprogramm schreibt speziellen Programmcode und Partitionsdaten in den ersten Sektor auf der Festplatte. Dieser Sektor wird als Master Boot Record bezeichnet . Die Festplatte ist in Partitionen unterteilt, die mit einem eigenen Dateisystem formatiert sind. Maximal 4 Partitionen, von denen jede erweitert werden kann (erweiterte Partition)Dies kann rekursiv in 4 Abschnitte unterteilt werden und theoretisch ist ihre Anzahl nicht begrenzt. Sobald das BIOS den Master Boot Record findet, liest es den Code von dort und überträgt die Kontrolle an ihn. Dieser Code durchsucht abwechselnd die Daten auf den Partitionen und findet die als aktiv gekennzeichneten. Er enthält den Windows-Bootloader-Code (dies ist nicht die Partition mit C: \ Windows \ System32!). Diese Partition wird als Systempartition bezeichnet . In der Regel nimmt es 100 MB ein und ist dem Benutzer verborgen. Der erste Sektor dieses Abschnitts speichert den Startcode, an den die Steuerung übertragen wird. Dies ist der Volume-Boot-Sektor . Der darin enthaltene Code sucht nach der Bootmgr- Datei , von der aus der Windows-Boot-Prozess beginnt. Die Bootmgr-Datei wird über eine einzige Verknüpfung zwischen Startup.com- Dateien und erstelltBootmgr.exe .



Der Prozessor beginnt seine Arbeit im Modus "Real" . Dies ist ein Kompatibilitätsmodus, in dem die CPU auf die gleiche Weise funktioniert wie die alten 16-Bit-Prozessoren, die keine Unterstützung für virtuellen Speicher hatten und direkt mit dem physischen Speicher über einen 20-Bit-Adressbus arbeiteten, über den 1 MB Speicher adressiert werden konnte. Einfache MS-DOS-Programme wurden in diesem Modus ausgeführt und hatten die Erweiterung .COM. Das erste, was Startup.com (Bootmgr) tut, ist, den Prozessor in den "Geschützten" Modus zu schaltenwobei Schutz den Schutz von Prozessen voreinander bedeutet. In diesem Modus werden virtueller Speicher und 32-Bit-Adressen unterstützt, mit denen 4 GB RAM adressiert werden können. Im nächsten Schritt füllt Bootmgr die virtuelle Adresstabelle für die ersten 16 MB RAM aus und aktiviert die Übersetzung von virtuellen Adressen in physische Adressen. In diesem Modus funktioniert Windows. Da zu diesem Zeitpunkt die Betriebssystem-Subsysteme noch nicht erstellt wurden, verfügt Bootmgr über eine eigene einfache und unvollständige Implementierung des NTFS-Dateisystems, dank derer eine BCD-Datei (Boot Configuration Data) gefunden wird , in der die Einstellungen für die Betriebssystem- Startparameter gespeichert sind . Sie können es mit dem Dienstprogramm BcdEdit.exe bearbeiten . Diese BCD-Einstellungen können anzeigen, dass sich Windows im Ruhezustand befand und Bootmgr das Programm startetWinResume.exe , das den Status aus der Datei Hyberfil.sys in den Speicher liest und die Treiber neu startet. Wenn der BCD angibt, dass mehrere Betriebssysteme vorhanden sind, zeigt Bootmgr eine Liste an und fordert den Benutzer zur Auswahl auf. Wenn es ein Betriebssystem gibt, startet Bootmgr WinLoad.exe. Dieser Prozess erledigt die Hauptarbeit beim Initialisieren von Windows:

  1. Wählt die entsprechende Windows-Kernelversion aus. Sie können es sich als Windows10.exe vorstellen, obwohl es tatsächlich NtOsKrnl.exe heißt. Welche Versionen gibt es? Laut Wikipedia:

    • ntoskrnl.exe ist ein Windows-Kernel mit einem Prozessor. ohne PAE- Unterstützung
    • ntkrnlmp.exe (englischer NT-Kernel, Multi-Prozessor-Version) - Windows-Multiprozessor-Kernel. ohne PAE- Unterstützung
    • ntkrnlpa.exe — Windows PAE.
    • ntkrpamp.exe — Windows PAE.


  2. HAL.dll (Hardware Abstraction Layer), CPU.
  3. vgaoem.fon
  4. , . National Language System.
  5. Lädt die SYSTEM-Registrierung in den Speicher und enthält Informationen zu den zu ladenden Treibern. Informationen zu allen Treibern finden Sie unter HKLM \ SYSTEM \ CurrentControlSet \ Services \ . Die Treiber, die geladen werden müssen, haben den Schlüssel start = SERVICE_BOOT_START (0). Wir werden in einem anderen Artikel über das Registrierungsgerät sprechen.
  6. Lädt den Dateisystemtreiber für die Partition, auf der sich die Treiberdateien befinden.
  7. Lädt Treiber in den Speicher, initialisiert sie jedoch aufgrund zirkulärer Abhängigkeiten noch nicht.
  8. Bereitet CPU-Register für die Ausführung des im ersten Schritt ausgewählten Windows-Kernels vor - NtOsKrnl.exe.


Wenn die Treiber geladen sind, überprüft WinLoad ihre digitalen Signaturen. Wenn sie nicht übereinstimmen, wird ein blauer ( BSOD ) oder grüner ( GSOD , für Insider-Vorschau-Baugruppen) " Todesbildschirm " angezeigt.





Auf UEFI ausführen





Ein Beispiel für einen UEFI-



BIOS -Startbildschirm gibt es seit über 30 Jahren. Um seine Fehler zu beheben, hat Intel 1998 die Intel Boot Initiative ins Leben gerufen, später in EFI umbenannt und 2005 an das EFI-Forum gespendet. Nachteile des BIOS:

• Funktioniert nur im 16-Bit-Modus

• Kann nur 1 MB RAM adressieren

• Häufig treten Kompatibilitätsprobleme auf

• MBR ist auf nur vier Hauptfestplattenpartitionen beschränkt

• Die Betriebssystemfestplatte darf nicht mehr als 2,2 TB groß sein.

• Verfügt über sehr eingeschränkte Funktionen zum Überprüfen des Betriebssystem-Bootloaders.

Das BIOS wurde durch UEFI ersetzt. Tatsächlich handelt es sich um ein Miniaturbetriebssystem, das sowohl in 32-Bit- als auch in 64-Bit-Ausführung ausgeführt werden kann. Aus Kompatibilitätsgründen gibt es eine Option zum Kompatibilitätsunterstützungsmodul, das in den Einstellungen enthalten ist und das BIOS emuliert.





In UEFI erfolgt der Start in der nativen Bitigkeit für den Prozessor - 32 oder 64, es gibt Zugriff auf den gesamten Speicher, der virtuelle Speicher wird unterstützt, der sichere Start ist aktiviert und es ist möglich, Antimalware auszuführen, bevor das Betriebssystem geladen wird. Startreihenfolge des Betriebssystems in UEFI:

  1. Initialisierung und Start der Firmware, Start des Chipsatzes.
  2. POST-Test, ähnlich wie im BIOS
  3. Laden von EFI-Treibern und Suchen einer EFI-berechtigten Startdiskette
  4. Suchen Sie nach einem Ordner mit dem Namen EFI. Die UEFI-Spezifikation erfordert, dass eine Partition für die EFI-Systempartition vorhanden ist, die für das FAT-Dateisystem formatiert ist, 100 MB - 1 GB groß oder nicht mehr als 1% der Festplattengröße. Jedes installierte Windows hat ein eigenes Verzeichnis auf dieser Partition - EFI \ Microsoft .

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


Öffnen Sie zum Anzeigen des Inhalts der EFI-Systempartition eine Konsole mit Administratorrechten (WinKey + X => Windows PowerShell (Admin)) und führen Sie die Befehle mountvol Z: / s, Z :, dir aus . CD - wechselt das Verzeichnis.

Der Hauptunterschied zwischen den BootMgr- und WinLoad-Komponenten für UEFI und ihren BIOS-Gegenstücken besteht darin, dass sie die EFI-API anstelle von BIOS-Interrupts verwenden und die Formate der Boot-Partitionen MBR BIOS und EFI System Partition sehr unterschiedlich sind.



Kernel-Initialisierung



Ich möchte Sie daran erinnern, dass wir erwägen, den PC im Kontext der Tastatur zu laden, sodass Sie sich nicht auf alle Phasen konzentrieren sollten. Es ist notwendig zu verstehen, wo sich die Tastatur in diesem Prozess befindet. Die für das Verständnis wichtigen Phasen werden hervorgehoben .

In der vorherigen Phase wurde die Komponente WinLoad.exe / WinLoad.efi gestartet , die NtOsKrnl.exe durch Angabe von Startparametern in der globalen Variablen nt! KeLoaderBlock (Kernelmodus-Speicher steht allen Prozessen zur Verfügung) startet , die WinLoad während seiner Arbeit gesammelt hat. Diese schließen ein:

  1. Pfade zu den Verzeichnissen System (Windows Bootloader) und Boot ( C: \ Windows \ System32 ).
  2. Zeiger auf von WinLoad erstellte virtuelle Speichertabellen
  3. Ein Baum mit einer Beschreibung der angeschlossenen Hardware, mit dem der Registrierungsschlüssel HKLM \ HARDWARE erstellt wird.
  4. Eine Kopie der heruntergeladenen Registrierung HKLM \ System
  5. Zeiger auf die Liste der geladenen (aber nicht initialisierten) Treiber, die am Windows-Start teilnehmen.
  6. Weitere Informationen zum Herunterladen erforderlich.


Der Windows-Kernel wird in zwei Schritten initialisiert. Zuvor wird die Hardware-Abstraktionsschicht initialisiert , die unter anderem die Interrupt-Controller für jede CPU konfiguriert.

Gleichzeitig werden Zeichenfolgen mit Nachrichten für BSOD in den Speicher geladen, da sie zum Zeitpunkt des Sturzes möglicherweise nicht zugänglich oder beschädigt sind.

  • Erste Phase der Kernel-Initialisierung:

    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 unterscheidet sich von Benutzerprozessen, es handelt sich um einen nativen Prozess, der zusätzliche Berechtigungen erhält. SMSS.exe arbeitet mit dem Kernel, der die Windows-API umgeht, und verwendet die sogenannte native API . Die Windows-API ist ein Wrapper um die native API. SMSS.exe startet zuerst das Windows-Subsystem ( CSRSS.exe - Client Server Runtime Subsystem ) und schließt die Initialisierung der Registrierung ab.



Der SMSS.exe-Prozess und die Threads werden als kritisch markiert. Wenn sie beispielsweise aufgrund eines Fehlers unerwartet beendet werden, führt dies zu einem Systemabsturz. Um mit Subsystemen zu kommunizieren, z. B. einem API-Aufruf, der eine neue Sitzung erstellt, erstellt SMSS einen ALPC-Port mit dem Namen SmApiPort... Umgebungsvariablen werden aus der Registrierung geladen, Programme wie Check Disk (autochk.exe, diese Programme werden in die Registrierung HKLM \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ BootExecute geschrieben ) werden gestartet . SMSS.exe wird für jede Benutzersitzung gestartet. Globale Variablen (z. B. Nachrichtenwarteschlange) Jede Sitzung hat aufgrund des Mechanismus des virtuellen Speichers ihre eigenen. Windows verfügt über Thread-, Prozess- und Sitzungskontexte. Jede SMSS.exe startet eine eigene Instanz des Subsystems. Derzeit ist es nur CSRSS.exe (Windows). In der Vergangenheit wurden die Betriebssysteme OS / 2 (os2ss.exe) und POSIX (psxss.exe) unterstützt, aber diese Idee war nicht erfolgreich. Die allererste SMSS.exe geht in den Ruhezustand und wartet auf den Prozess WinInit.exe. Die übrigen Instanzen erstellen stattdessen einen WinLogon-Prozess, der die Anmelde-Benutzeroberfläche anzeigt.



WinInit.exe initialisiert Subsysteme zum Erstellen einer grafischen Shell - Windows Station und Desktops . Dies ist nicht der Desktop, den Sie sehen. Dies ist ein anderes Windows-Konzept. Dann startet es die Prozesse:

  1. Services.exe - Services Control Manager (SCM) startet Dienste und Treiber, die als AutoStart gekennzeichnet sind. Dienste werden in svchost.exe- Prozessen gestartet . Es gibt ein Dienstprogramm namens tlist.exe , das bei Ausführung mit dem Parameter tlist.exe -s die Namen der Dienste in jeder der svchost.exe auf die Konsole druckt.
  2. LSASS.exe - Lokale Systembehörde .
  3. LSM.exe - Lokaler Sitzungsmanager.


WinLogon.exe - Lädt Anbieter von Anmeldeinformationen , bei denen es sich um Kennwort, Smartcard, PIN und Hello Face handeln kann. Es erzeugt den LogonUI.exe- Prozess , der dem Benutzer eine Schnittstelle zur Authentifizierung anzeigt, und überprüft dann die eingegebenen Daten (Login und Passwort, PIN).



Wenn alles gut gegangen ist, startet WinLogon den im Registrierungsschlüssel HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ WinLogon \ Userinit angegebenen Prozess . Standardmäßig ist dies der UserInit.exe- Prozess , der:

  1. Führt die in den Registern angegebenen Skripte aus:
    • 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 benachrichtigt den Netzwerkanbieter über den angemeldeten Benutzer, mit dem er die in der Registrierung gespeicherten Systemfestplatten und Drucker wiederherstellt und verbindet. Der Netzwerkanbieter ist die Datei mpr.dll aus dem Systemordner, die vom Prozess svchost.exe gehostet wird , d. H. Windows-Dienst.



Der Prozessbaum sieht folgendermaßen aus. Darauf können Sie sehen, wer wen erstellt hat (nicht alle Prozesse werden angezeigt, er kann geringfügig von den neuesten Windows-Versionen abweichen).





Wo ist die Tastatur hier?



Während des Startvorgangs liest der Windows-Kernel Informationen über den Systembus-Controller aus der Registrierung. In der Regel handelt es sich hierbei um den PCI-Bus (seltener MSI), an den E / A-Port-Controller, einschließlich USB, PS / 2, angeschlossen sind. Informationen dazu werden während der Windows-Installation aufgezeichnet. Das System lädt einen Treiber dafür und umgeht rekursiv alle Ports, wobei auch für jeden ein eigener Treiber geladen wird. Treiber können zu Treiberknoten kombiniert werden . Beispielsweise wird ein Tastaturtreiber mit einem PS2-Port-Treiber verbunden. Der USB-Anschluss ist jedoch komplizierter - zuerst der Port-Treiber, dann der Treiber für die Arbeit mit dem HID-Protokoll und erst dann die Tastatur.



Jeder Port wird von einem eigenen Chip gesteuert, der die Verbindung überwacht und Signale zwischen der CPU und dem Gerät empfängt / sendet. Wenn der South Bridge-Chipsatz nicht wie bei Laptops in die CPU integriert ist, sondern als separater Chip auf dem Motherboard vorhanden ist, ist es richtiger zu sagen: das Signal zwischen der South Bridge und dem Port-Controller. Der Steueranschluss-Chip verfügt über eine Standleitung mit einem Interrupt-Controller (PIC oder APIC), über den er die CPU auffordern kann, auf sich selbst zu achten, beispielsweise Daten von der Tastatur zu lesen (PS / 2-Anschluss mit USB, eine andere Geschichte). Da das Betriebssystem einen Treiber für den Port geladen hat, kann es Befehle an ihn senden, Daten lesen und senden. In unserem Beispiel wurde der Treiber aus C: \ Windows \ System32 \ i8042prt.sys geladen . Erinnern wir uns an den vorherigen Artikel . In älteren Computern mit PIC auf einem ChipIntel 8259 hatte 15 Interrupt-Leitungen, in denen die Tastatur mit dem IRQ1-Pin, dem IRQ0-Timer und die Maus mit IRQ12 verbunden war. Dies war eigentlich der fünfte Zweig des zweiten 8259-Chips, der seine Interrupts über den IRQ2-Pin des ersten Controllers multiplexte. Moderne PICs können 255 Pins für Interrupt-Signale haben. Während des Startvorgangs programmiert das Betriebssystem den APIC / PIC so, dass eine bestimmte Nummer zurückgegeben wird, wenn beispielsweise ein Interrupt von der Tastatur oder dem USB-Anschluss eintrifft, und anhand dieser Nummer findet die CPU die auszuführende Funktion in der Interrupt-Vektortabelle . Die Interrupt-Nummer wird von HAL und Plug'n'Play Manager festgelegt... Der Interrupt-Controller sucht in einer bestimmten Reihenfolge nach einem Signal an seinen Pins, z. B. in einer Endlosschleife, und prüft die Spannung an den Pins von 1 bis MAX_PIN. Diese Reihenfolge bestimmt die Priorität. Beispielsweise wird die Tastatur vor der Maus und der Timer vor der Tastatur angezeigt. Um nicht von den Besonderheiten der Arbeit von Interrupt-Controllern abhängig zu sein, abstrahiert Windows das Konzept von IRQ (Interrupt Request) in IRQL (Interrupt Request Level) . Wenn der Interrupt-Controller mindestens 15 oder 255 Leitungen hat, werden alle 32 IRQL für x86 und 15 IRQL für x64 und IA64 zugeordnet.
Was bedeuten IRQL-Prioritäten:

  1. Hoch - Wenn das System abstürzt, wird normalerweise die KeBugCheckEx-Funktion aufgerufen.
  2. Stromausfall - nicht verwendet. Es wurde ursprünglich für Windows NT entwickelt.
  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.


Wenn Sie immer im Benutzermodus programmiert haben, haben Sie noch nie von IRQL gehört, da alle Benutzerprogramme mit der Priorität Passiv / Niedrig (0) ausgeführt werden. Sobald ein Ereignis mit b über der Prioritätsstufe lshim (Tastaturereignisse, Thread-Scheduler-Timer) auftritt , speichert der Prozessor den Status des unterbrochenen Threads, bei dem es sich um einen CPU-Registerwert handelt, und ruft den Dispatcher-Interrupt ( den Interrupt-Dispatcher , nur eine Funktion) auf, wodurch die IRQL-Priorität erhöht wird über die KeRaiseIrql- API in der HAL und ruft direkt die Serviceroutine des Interrupts selbst auf . Danach wird die IRQL der CPU durch die KeLowerIrql- Funktion auf die vorherige Ebene gesenktund der unterbrochene Thread beginnt die Verarbeitung an derselben Stelle, an der er unterbrochen wurde. Der Thread-Scheduler basiert auf diesem Mechanismus . Es setzt einen Timer, der in einem bestimmten Intervall (Zeitscheibe) einen Interrupt mit einer DPC / Dispatch (2) -Priorität erzeugt und in der Serviceroutine seines Interrupts gemäß einem bestimmten Algorithmus der Ausführung einen neuen Thread zuweist.



Der IRQL-Mechanismus ist auf Softwareebene in der Hardware Abstraction Layer ( HAL.dll ) implementiert , nicht in der Hardware. Windows-Systeme haben einen Bustreiber), die das Vorhandensein von an die Busse angeschlossenen Geräten - PCI, USB usw. - und die Interrupt-Nummern bestimmt, die jedem Gerät zugewiesen werden können. Der Bustreiber übermittelt diese Informationen an den Plug & Play-Manager, der bereits entscheidet, welche Interrupt-Nummern jedem Gerät zugewiesen werden sollen. Ferner stellt der Interrupt-Arbiter innerhalb des PnP-Mgr ( PnP-Interrupt-Arbiter ) Verbindungen zwischen IRQ und IRQL her.



Wenn ein Tastaturinterrupt eintrifft, wird jedem aktuell ausgeführten Thread (dies könnte Ihr Programm sein) zugewiesen, um ihn zu verarbeiten. Der Interrupt-Dispatcher erhöht die CPU-IRQL-Priorität auf eine der Device1-DeviceN-Ebenen . Danach werden die virtuellen Speicher - Manager nicht in der Lage sein , um die Seite zu finden , wenn es nicht in dem RAM (nicht in der Lage sein , zu verarbeiten geladen wird Page Fault) kann der Thread-Scheduler die Ausführung nicht unterbrechen, da alle mit einem niedrigeren IRQL-Wert ausgeführt werden. Die Hauptaufgabe des Tastaturtreibers besteht derzeit darin, die empfangenen Daten zu lesen und zur weiteren Verarbeitung zu speichern. Daten werden in ein Objekt vom Typ _DPC ( Deferred Procedure Call ) geschrieben, das in der DPC-Stream-Liste gespeichert wird (so etwas wie std :: list <DPC> im Betriebssystemkern werden anstelle von Arrays verknüpfte Listen verwendet). Sobald Interrupts von allen externen Geräten verarbeitet werden, wird die IRQL des Threads auf die DPC-Ebene gesenkt, in der verzögerte Prozeduren (DPC) verarbeitet werden. Der Tastatur-DPC- Handlercode ruft eine Funktion vom Tastaturtreiber Kbdclass.sys auf :



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


Der Tastaturtreiber (kbdclass.sys) empfängt Daten vom Port (USB, PS2) über einen Interrupt und schreibt sie über WriteFile , eine Komponente im Windows-Kernel, wacht auf, liest sie mithilfe der ReadFile- API und fügt Nachrichten von der Tastatur zur Warteschlange hinzu. Datei-APIs können zum Lesen von Daten aus Treibern verwendet werden. Ab diesem Moment beginnt die Verarbeitung von Daten durch den Windows-Eingabestapel, mehr dazu im nächsten Artikel.



Wenn Sie einen PC mit einem PS2-Anschluss haben und wissen, wie WinDbg im Kernelmodus verwendet wird, können Sie leicht einen Tastatur-Interrupt-Handler finden, indem Sie ! Idt eingeben , der die gesamte Interrupt- Vektortabelle anzeigt .... Die Unterbrechung klemmt sich in den Programmverlauf ein, der Wortvektor bedeutet hier die Richtung, die Richtung der Programmausführung. WinDbg wurde speziell für das Windows-Debugging entwickelt. Die neueste Version heißt WinDbgX. Es verfügt über eine textbasierte Oberfläche, die an Visual Studio gewöhnte Personen abschreckt, aber viel mehr Optionen bietet, insbesondere die Ausführung von Skripten. Der violette PS2-Port-Interrupt wird rot hervorgehoben. Die Funktion, die damit umgeht , heißt I8042KeyboardInterruptService und befindet sich in der Datei 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.




Die Frage ist nun, woher der Interrupt-Handler sein Argument bezieht. Wer überträgt es? Immerhin weiß die CPU nichts davon. Wenn Sie in ihrem Haltepunkt, es war noch mehr überrascht , ein paar Features höher auf dem Stapel , um zu sehen:



0: kd> kC

# Call - Site

! 00 i8042prt I8042KeyboardInterruptService

! 01 nt KiCallInterruptServiceRoutine

! 02 nt KiInterruptSubDispatch

! 03 nt KiInterruptDispatch

! 04 nt KiIdleLoop




Die Erklärung dafür ist einfach - es ist nicht die im IDT- Register des Prozessors gespeicherte Funktion . Was Sie im obigen Bild sehen, sind tatsächlich Objekte vom Typ _KINTERRUPT... In der Interrupt-Tabelle ist ein spezieller Assembly-Code (nt! KiIdleLoop) gespeichert, der weiß, wie das Objekt, das den Interrupt beschreibt, im Speicher gefunden wird. Was ist daran interessant?

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


Sobald der Tastatur-Interrupt-Handler aufgerufen wird, benachrichtigt er den Tastaturtreiber über die empfangenen Daten. Danach wird der Betriebssystemkernel benachrichtigt, der ihn nach der Verarbeitung weiter entlang des Eingabestapels sendet, wo er an die Anwendung übermittelt werden kann, die auf sie reagiert, oder davor an den Handler Sprachen (asiatische Zeichen, automatische Korrektur, automatische Vervollständigung).

Der Betriebssystemkernel interagiert nicht direkt mit dem Tastaturtreiber. Zu diesem Zweck wird der Plug'n'Play Manager verwendet. Diese Komponente bietet eine IoRegisterPlugPlayNotification- API , die die bereitgestellte Rückruffunktion aufruft , wenn ein Gerät hinzugefügt oder entfernt wird.



Ein paar Worte zu USB



Um mit der Bedienung des USB-Anschlusses vertraut zu sein, ist ein separater Artikel erforderlich, in dem die Funktionsweise des USB-Anschlusses sowie eine Beschreibung der HID-Datenverarbeitung unter Windows beschrieben werden. Dies würde das Material sehr komplizieren, und es gibt bereits gute Artikel zu diesem Thema, so dass die PS2 aufgrund ihrer Einfachheit ein perfektes Beispiel ist.



USB wurde als universeller Anschluss für alle Geräte entwickelt, sei es eine Tastatur, eine Kamera, ein Scanner, ein Spielrad mit Pedalen, ein Drucker usw. Außerdem unterstützt es die Verschachtelung von Anschlüssen - USB-Motherboard => Monitor mit USB => Tastatur mit USB, an die eine Maus angeschlossen ist, Flash-Laufwerk und den USB-Hub, an den die Festplatte angeschlossen ist. Wenn Sie sich die USB 2.0-Pins ansehen, werden Sie feststellen, dass sie nicht für die Übertragung bestimmter Daten wie der PS2 ausgelegt sind. Es gibt nur vier davon - ein Twisted Pair zum Übertragen von Datenbits plus und minus Leistung.





Das USB 2.0-



Kabel führt mit fünf zusätzlichen Pins schneller zu USB 3.0. Wie Sie sehen können, gibt es keine CLOCK-Leitung für die Synchronisation, sodass die Datenübertragungslogik komplizierter ist. Linker USB 2.0 und rechter USB 3.0 zum Vergleich.

Alle Daten werden über das HID- Protokoll (Human Interface Device) übertragen , das die Formate, die Reihenfolge der Interaktion und Datenübertragung sowie alles andere beschreibt. Der USB 2.0-Standard umfasst 650 Seiten, das Dokument zur HID-Klassenspezifikation , in dem die Funktionsweise von Geräten (Maus, Tastatur usw.) beschrieben wird - 97 Seiten. Es wird empfohlen, diese zu studieren, wenn Sie mit USB arbeiten.



Zunächst muss das angeschlossene Gerät über sich selbst berichten, dazu sendet es mehrere Datenstrukturen, die die Geräte-ID und die Hersteller-ID angeben, anhand derer der Plug'n'Play-Manager Informationen in der Registrierung finden, Treiber laden und verbinden kann. USB-Geräte sind passiv, d.h. Der Host muss in einem bestimmten Intervall selbst prüfen, ob Daten vorhanden sind. Die Abfragerate und die Datenpaketgröße sind in einem der USB-Gerätedeskriptoren angegeben. Die maximale Paketgröße beträgt 64 Byte, was mehr als genug Informationen über gedrückte Tasten darstellt.



Windows verfügt über eine integrierte HID-Unterstützung. Es ist nicht so einfach, einen PS2-Port-Treiber mit einem Tastaturtreiber zu verknüpfen, da der HID-Treiber alle vom Protokoll unterstützten Skripts verarbeiten kann. Unabhängig vom Datenprovider - PS2-, USB- oder Remotedesktop-Ports oder eine virtuelle Maschine - befindet sich ganz oben auf dem Treiberknoten Kbdclass, von dem der Betriebssystemkern Informationen erhält. Die Benachrichtigung über Tastaturanhänge wird über den Plug'n'Play-Manager verarbeitet , sodass es für den Windows-Kernel nicht wichtig ist, welcher Port oder welche Gerätedatenquelle verwendet wird.



Teil 1 - Grundlagen des Betriebssystems und des Computers

Teil 2 - Funktionsweise von Motherboard und Tastatur über den PS2-Anschluss



All Articles