Über die Bedienung eines PCs am Beispiel von Windows 10 und der Tastatur, Teil 1

Bild

Mein Name ist Andrey Artemyev, ich arbeite bei Microsoft mit dem Kern von Windows 10, ich arbeitete zuvor mit Windows 10x (WCOS), XBox, Windows Phone und Microsoft Edge. Ich möchte aus pädagogischen Gründen gerne erzählen, wie der Computer am Beispiel der Tastatureingabe und Windows 10 funktioniert. Diese Artikelserie richtet sich in erster Linie an Studenten technischer Fachrichtungen. Wir werden prüfen, welchen Pfad die Informationen über die gedrückte Taste von der Tastatur in Notepad.exe anzeigen. Aufgrund der Weite und Interdisziplinarität des Themas kann es zu Ungenauigkeiten in den Artikeln kommen, über die in den Kommentaren berichtet wird. Einige Informationen sind möglicherweise aufgrund der Geschwindigkeit, mit der sich Windows entwickelt, veraltet.

Wie tief tauchen wir in das Thema ein?


Sprechen wir zunächst über die Ebenen, auf denen ein Computer in Betracht gezogen werden kann. Jede Ebene basiert auf der vorherigen. Fangen wir von oben an.

Anwendungsebene . Alle Benutzeranwendungen befinden sich hier, dies sind ein Browser, Microsoft Office, Editor sowie der IIS-Webserver, SQL Server, verschiedene Middleware wie Java und .Net und alle Skriptsprachen, ob Ruby, PHP oder Bat-Dateien.

Betriebssystemebene . Betriebssystem kann betrachtet werden als:

  • Ressourcenmanager - Arbeitsspeicher, Festplatten, Drucker, Bildschirm, Tastatur, begrenzte Ressourcen, die von Programmen gemeinsam genutzt werden, die auf dem Computer ausgeführt werden.
  • Virtuelle Maschine - Eine Datei ist ein gutes Beispiel für ein virtuelles Objekt. Es stellt eine Abstraktion von Daten auf der Festplatte dar, eine API für die Arbeit damit, und fügt auch das Konzept der Zugriffsrechte hinzu. Anstelle einer Datei könnte das Konzept eines Datencontainers und einer völlig anderen API verwendet werden. Es gibt viele solcher virtuellen Objekte im Betriebssystem.
  • Platform - OS bietet Softwaremodelle und Grundelemente für das Erstellen von Programmen. Mit dem Windows-Treiber-Framework können Sie beispielsweise schnell Treiber entwickeln. Windows wird zum Erstellen komplexer Benutzeroberflächen verwendet. Dll - bietet ein Modell für die Erweiterung der Funktionalität des Programms durch Plugins sowie einen Mechanismus für die Implementierung des Bildschirmlesers durch Tastaturfallen (siehe LowLevelKeyboard-Hook).
Das Betriebssystem ist in Ebenen und Komponenten unterteilt. Im Allgemeinen sieht die Architektur von Windows 10 so aus. Wir werden später ausführlich darauf eingehen.

Bild

Ebene der Computerarchitektur . Es handelt sich um ein Motherboard mit einem bestimmten Formfaktor, integrierten Funktionen, die in als Chipsatz bezeichneten Mikroschaltungen codiert sind, und Anschlüssen, über die die Funktionalität eines Computers erweitert werden kann, indem eine Grafikkarte, eine Netzwerkkarte, ein zusätzlicher Arbeitsspeicher (RAM), Festplatten, eine Tastatur usw. angeschlossen werden. Ports wirken sich auf die Geschwindigkeit und die Funktionen des Computers aus, die seinen Zweck bestimmen, egal ob es sich um einen Server für die Verarbeitung von Tausenden von Anfragen pro Sekunde, ein Tablet für die Nutzung des Internets oder einen Gaming-PC mit mehreren Videos handelt arty. OS abstrahiert die Funktionen des Motherboards.

Die Mikroschaltungen sehen wie in der Abbildung unten aus und sind ein Minicomputer, der einfache Programme für einfache Aufgaben ausführt, z. B. Daten von der Tastatur liest und weiter überträgt, damit sie letztendlich den Prozessor erreichen. Sie sind in der Regel als analoge nicht programmierbare Mikroschaltung oder in C programmierbarer Mikrocontroller ausgeführt.

Bild


Das Motherboard kann als eine Kolonie von Mikrokreisen betrachtet werden, die über Busse miteinander kommunizieren und über die Daten von den angeschlossenen Geräten zum Prozessor und umgekehrt übertragen werden. Der Chipsatz ist eine Art Computer-Nervensystem. Alle Chips auf dem Motherboard wurden ursprünglich erstellt, um miteinander zu arbeiten. Einige von ihnen können spezielle Funktionen haben, zum Beispiel einen Timer oder das Speichern von BIOS-Einstellungen. Das vielleicht wichtigste davon ist das mit einem integrierten Programm (Firmware, BIOS, UEFI), das ausgeführt wird, sobald Strom anliegt. Sie findet die Festplatte mit dem Windows-Bootloader und überträgt die Steuerung darauf, wodurch wiederum die ausführbare Datei des Betriebssystems gestartet wird, die als Windows10.exe, eigentlich NtOsKrnl.exe, bezeichnet werden kann. Das BIOS weiß aufgrund einer Vereinbarung zwischen Hardwareherstellern und Betriebssystemen, wonach es zu suchen gilt.

Auf dem Motherboard können Sie ein Mobiltelefon, eine Spielekonsole, eine Server-Station oder ein Smart-Gerät installieren. In der Abbildung unten sind die gängigen Formfaktoren von Motherboards dargestellt.

Bild

Die Mikroarchitekturebene wird durch den Prozessor (CPU) repräsentiert, dies ist das Herzstück des Motherboards und der gesamte Chipsatz wird für die Wartung der CPU benötigt. Ein Prozessor ist ein Computer in einem Computer, ein leistungsfähigerer und fortschrittlicherer Mikrocontroller, der keine Firmware benötigt, da der Befehlsfluss sofort eintritt, wenn der Thread-Scheduler den Kontext des Prozessors ändert. Die Funktion des Prozessors ist in Subsysteme unterteilt, beispielsweise eine Komponente, die an mathematischen und logischen Operationen beteiligt ist, einen mathematischen Coprozessor und einen Cache. Einige von ihnen waren früher ein separater Chip auf dem Motherboard, aber jetzt sind sie Teil der CPU, zum Beispiel ein Interrupt-Controller und ein Chip namens North Bridge, die die Arbeitsgeschwindigkeit erhöhen.

Mikroarchitektur ist nicht dasselbe wie Architektur . Die gesamte Funktionalität der CPU ist in Komponenten unterteilt, die zusammenarbeiten. Diese Komponenten und ihre Wechselwirkung ist Mikroarchitektur. Im folgenden Flussdiagramm werden sie durch farbige Rechtecke und Quadrate dargestellt.

BildBild

Die Prozessorarchitektur ist im Wesentlichen ein Dokument, das beschreibt, welche Funktionalität es haben sollte, um beispielsweise der auf Mobilgeräten verwendeten x86-, x64- oder ARM-Architektur zu entsprechen. Dieses Dokument beschreibt, welche Befehle, Registerzuweisungen und Operationslogiken unterstützt werden sollen. Die Entwickler von Intel-, AMD- und Elbrus-Prozessoren können diese Funktionalität nach Belieben implementieren und ihr neue Funktionen in Form von Befehlen, Registern, Flags, Interrupts hinzufügen. Wenn das Betriebssystem davon weiß, kann es sie verwenden. In Bezug auf OOP ist die CPU-Architektur die Schnittstelle und die Mikroarchitektur ihre Implementierung.

Logikschaltungen . Farbige Rechtecke aus dem CPU-Blockdiagramm bestehen aus Logikschaltungen, die ihre Operationen mit Folgen von Nullen und Einsen ausführen. Der Prozessor sieht alle Daten und Anweisungen in Form von Bits (0 und 1). Gemäß der Formel kann jede Dezimalzahl als Folge von 0 und 1 dargestellt werden, aber was eine bestimmte Zahl bedeutet, hängt vom Kontext ab. Es kann ein Code, eine Zahl oder ein Buchstabe sein. Arithmetik und Logik (ALU) können durch bitweise Operationen zwei Zahlen addieren. Die bitweisen Algorithmen Addition, Subtraktion, Multiplikation und Division sind seit langem bekannt und müssen von den Entwicklern der Logikschaltung nur effektiv implementiert werden.

Bild

Digitale Schaltkreise arbeiten mit Daten auf der Ebene von Nullen und Einsen, während analoge Schaltkreise auf der Ausnutzung der physikalischen Gesetze beruhen. Sie führen einfache Bitmanipulationen durch, z. B. Shifts, AND, OR, XOR. Durch diese Grundelemente werden komplexere Operationen implementiert. Das Bild unten zeigt den analogen UND-Operator, der durch Transistoren implementiert ist. Am Ausgang der Schaltung liegt nur dann eine Spannung ungleich Null an, wenn beide Eingangskontakte (Bx1 und Bx2) anliegen, andernfalls null Volt. Der Operator && in C # funktioniert genauso. Digitale Schaltungen basieren letztendlich auf Analog. Physikalisch logische Elemente in Logikschaltungen können nicht nur auf elektronischem, sondern auch auf mechanischem, hydraulischem, optischem und anderem Wege implementiert werden.

Bild

Der Pegel der Radioelemente . Physikalisch analoge Schaltungen beruhen auf Funkelementen, die die physikalischen Gesetze tatsächlich ausnutzen. Meist sind dies Halbleiter, d.h. Unter bestimmten Umständen leiten sie möglicherweise Elektrizität, jedoch nicht. Die Diode leitet den Strom nur in eine Richtung. Wenn sie nicht gelötet, um 180 ° gedreht und zurückgelötet ist, fließt der Strom nicht durch sie. Der Transistor lässt nur dann Strom durch, wenn am Steuerzweig Spannung anliegt. Die Menschheit hat gelernt, Transistoren mikroskopisch zu machen, und deshalb können sie millionenfach auf einer kleinen Tafel platziert werden. In den Bildern unten sind Halbleiter-Funkelemente und ein herkömmlicher Transistor neben einem Nanotransistor unter einem Elektronenmikroskop zu sehen.
Bild

Bild
Das Niveau der Gesetze der Physik . Und schließlich ist die unterste Ebene die Ebene der physikalischen Gesetze, die in Halbleiter-Funkelementen eingeschlossen sind.

Bild

Wir werden viel über die Betriebssystemebene und etwas weniger über Computerarchitektur, Mikroarchitektur, analoge Schaltungen und Funkelemente sprechen. Im letzten Teil sollten Sie verstehen, wie dies alles zusammenarbeitet.

Betriebssystem-Grundlagen


Als wir an einer Universität in Assembler-Sprache waren, hatten viele Studenten ein Problem mit so klugen Worten wie "Kernel- und Benutzermodi", unter denen das eigentlich bekannte Rollenauthentifizierungssystem verborgen ist. Alle Sites haben mindestens einen "Administrator" mit Zugriff auf Alle Seiten und der „Benutzer“ haben eingeschränkten Zugriff. Auf die gleiche Weise hat die "Core" -Rolle Zugriff auf alle Funktionen der CPU, und die "User" -Rolle verursacht möglicherweise nicht alle Prozessorbefehle und nicht alle Argumente. Neben diesem Vorbild basiert das Betriebssystem auf dem Prinzip der Client-Server-Architektur, bei der der Server der Kern ist, der die Betriebssystemfunktionalität implementiert, und der Client Benutzerprogramme. In der Welt des Webs sind Client und Server physisch getrennt - das sind zwei verschiedene Computer, die über das Netzwerk kommunizieren. Im Betriebssystem befinden sich Client und Server auf demselben Computer und auf derselben Hardware. Der Server verfügt über eine bestimmte API, mit der Kunden ihren Status ändern können. Mit der Twitter-API können Sie beispielsweise Beiträge erstellen, sich anmelden und einen Tweet-Feed auf einen mobilen Client hochladen. Windows verfügt über eine Win-API, die aufgrund eines breiteren Aufgabenspektrums nur umständlicher ist, und derzeit über rund 330.000 Windows-APIs sowie eine API für UWP-Apps. Wenn die Konzepte von Twitter für alle mehr oder weniger klar sind - posten, verwenden, füttern -, müssen die Konzepte des Betriebssystems möglicherweise etwas vertieft werden. Daher können die Windows-APIs schwer verständlich sein, ohne die interne Struktur des Betriebssystems zu kennen.

Tatsächlich bedeutet der Kernel drei verschiedene Dinge. Der Kernel ist wie jeder OS-Code. Der Kernel als Subsystem, das für Betriebssystemmechanismen wie Thread-Scheduler, Kontextwechsel, Interrupt-Behandlung, Austausch des virtuellen Speichers in physischen (Kernel) und des Kernel-Subsystems zur Unterstützung anderer Betriebssysteme verantwortlich ist - CSRSS.exe (Windows), PSXSS.exe (POSIX), OS2SS.exe (OS / 2) oder WSL (Windows SubSystem for Linux). In diesem Zusammenhang wird die erste Bedeutung verstanden - der gesamte OS-Code.

Wenn ein Fenster auf dem Bildschirm angezeigt wird, wird im Serverteil des Betriebssystems (Kernelmodus) eine Datenstruktur angezeigt, die dieses Fenster beschreibt - seine Position auf dem Bildschirm, Größe, Titeltext und Fensterfunktion, über die das Betriebssystem der Anwendung ermöglicht, auf Ereignisse zu reagieren. Da das Betriebssystem viele Subsysteme enthält, kann es mehrere Datenstrukturen geben, die ein Objekt beschreiben. Informationen zum Benutzerprozess befinden sich beispielsweise in den Komponenten:

  • Executive - hier ist die Logik des Betriebssystems. Diese Ebene prüft, welche Prozesse können und welche nicht. Diese Datei enthält Informationen zum übergeordneten Prozess, zu den Prozessstartparametern (Process Environment Block), zum zugeordneten Benutzerkonto und zum Namen der Prozess-Exe-Datei.
  • Hier sind Kernel- OS-Mechanismen wie ein Thread-Scheduler implementiert. Es speichert, wie viel Zeit der Prozess im Benutzer- und Kernel-Modus verbringt, an welche Prozessoren seine Threads angeschlossen sind, und legt die grundlegende Priorität der Prozess-Threads fest.
  • Fenstersubsystem - Informationen zu GDI-Objekten, die zum Zeichnen im Fenster verwendet werden. Dies sind solche Grundelemente wie Pinsel, Stift usw.
  • DirectX - alles rund um DirectX: Shader, Oberflächen, DX-Objekte, GPU-Leistungsindikatoren, Speichereinstellungen für den Grafikspeicher.
  • Das Windows-Subsystem , das vom CSRSS.exe-Prozess (Client Server Runtime SubSystem) dargestellt wird. Windows unterstützte zuvor OS POSIX (Prozess PSXSS.exe) und OS / 2 (OS2SS.exe). Damals kam die Idee auf, Windows zum selben Subsystem zu machen, aber dies war langsam und so wurde ein Teil von CSRSS.exe nach win32k.sys übertragen, das nun in mehrere Dateien unterteilt ist - win32k.sys, win32kbase.sys und win32kfull.sys. Hier werden Informationen zu Prozessgruppendaten, Herunterfahren, Sitzungsdaten usw. gespeichert.

Die Unterstützung für POSIX und OS / 2 war eher formal, da zum Übertragen des Programms von diesen Betriebssystemen der Quellcode gesucht und auf besondere Weise neu kompiliert werden musste, um eine exe-Datei zu erhalten, in der alle Aufrufe der OS-API an PSXdll.dll (NETAPI.DLL und DOSCALLS.DLL für OS / 2 und User32.dll für Windows-Anwendungen), ein dünner Wrapper über die Windows-API. Der Status einiger APIs wurde während des PSXSS.exe-Subsystems (OS2SS.exe) gespeichert. Da nicht alle APIs 1 zu 1 zugeordnet werden können, funktionierte ein solches Programm instabil. Die Linux-Unterstützung wurde in Windows 10 hinzugefügt und funktioniert ganz anders. Das Linux-Subsystem wird im Kernelmodus gehostet und der Unterschied zwischen Windows-Subsystem für Linux und Linux ist ungefähr der gleiche wie zwischen verschiedenen Builds. Speziell für die WSL wurde eine neue Art von Verfahren eingeführt - das PICO-Verfahren.

Was ist eine Komponente? Dies ist eine logisch gruppierte Funktionalität. Eine Komponente kann als OOP-Klasse, DLL, Ordner, Funktionsgruppe mit einem gemeinsamen Präfix, Namespace oder Layer in der Architektur bezeichnet werden.

Weitere Informationen zur Client-Server-Partitionierung


Die Trennung von Client und Server erfolgt über die integrierte Funktionalität der CPU, Speicherfreigabe und Softwareprüfung.

Die Gerätehersteller arbeiten mit den Entwicklern des Betriebssystems zusammen. Der Prozessor verfügt daher über Mechanismen, die unter Berücksichtigung der Bedürfnisse der Hersteller von Betriebssystemen erstellt wurden. In allen modernen Prozessoren ist der Benutzerrollenmechanismus implementiert, wobei der Benutzer als der aktuell ausführbare Code verstanden wird. In Webanwendungen wird die Rolle des angemeldeten Benutzers in einer Variablen gespeichert und verfügt neben dem eindeutigen Namen Admin oder User über eine ID dieser Rolle, die häufig bei der Autorisierung verwendet wird, da das Vergleichen von Zahlen schneller und einfacher ist als Zeichenfolgen. Im Prozessor wird die Rolle des aktuellen Benutzers in einem Feld namens "Sicherheitsring" und nicht "CurrentUser.Role.Id" gespeichert. In den meisten Prozessoren nimmt dieses Feld vier Werte von 0 bis 3 an. Windows verwendet 0 für die Rolle "Kernel-Modus", da dies der privilegierteste Modus ist und der größte Wert für die Rolle "Benutzermodus" ist, da dies die eingeschränkteste Rolle ist. Die übrigen Rollen werden nicht verwendet, da der Unterschied zwischen 0 und 1, 2 und 3 vernachlässigbar ist. Diese Rollen begrenzen die Speicherseiten, die angesprochen werden können, Sie können einige Anweisungen nicht aufrufen oder Sie können sie nicht mit bestimmten Argumenten aufrufen. Es gibt auch Einschränkungen für die Verwendung der E / A-Anschlusstechnologie für den Datenaustausch mit Geräten wie einer Tastatur, die jedoch seit 10 Jahren nicht mehr verwendet wird. Der Wechsel in den Kernel-Modus erfolgt über den Befehl syscall, der nach Index die aufzurufende Funktion im Array der Zeiger auf die Windows-APIs findet. Ein Zeiger auf dieses Array wird während des Betriebssystemstarts in einem speziellen Prozessorregister gespeichert.

Ich habe speziell bei der CPU ein Feld registrieren lassen. Wenn Sie ein Programm in C # schreiben, können Sie Ihrer Klasse beliebig viele Felder hinzufügen und ihnen Anzeigenamen geben. Bei Prozessoren und Mikrocontrollern werden Felder als Register bezeichnet. Wenn Sie ein Stück Eisen entwerfen, müssen Sie bereits zu diesem Zeitpunkt verstehen, wie viele Register (Felder) Sie benötigen, welche Größe sie haben sollten und welche Funktionen ihnen zugewiesen werden müssen, damit dies für alle Gelegenheiten und für alle vorstellbaren und unvorstellbaren Situationen ausreicht. Stellen Sie sich vor, Sie müssen ein Programm in einer C # -ähnlichen Programmiersprache schreiben, die 16 vordefinierte Felder in der Klasse enthält, und Sie können keine lokalen Variablen verwenden. Das heißt Das gleiche Feld kann zum Speichern des angemeldeten Benutzers, des sortierten Arrays, der temporären Daten oder des Ergebnisses der Methode verwendet werden. Die Namen solcher Felder sollten so häufig wie möglich sein. Anstelle von tempData, funcResult gibt es seltsame Namen wie EAX, AH, AL, DX usw. Wenn Sie in C # einen Prozessoremulator auf x86 - Architektur geschrieben haben, könnte der Code so aussehen (DIV - Divide, Befehl ganzzahlige Division):

Bild

Zur Veranschaulichung habe ich eine Kernel-Modus-Prüfung hinzugefügt. Wenn ein Fehler bei der Division durch Null auftritt, benachrichtigt der Prozessor das Betriebssystem über einen Interrupt (löst ein Ereignis aus). Zum Startzeitpunkt stellt das Betriebssystem dem Prozessor ein eindimensionales Array von Zeigern auf eine Funktion zur Verfügung, die als Interrupt-Vektor bezeichnet wird, wobei jeder Index einer Art Ereignis entspricht, beispielsweise einer Division durch Null. Das Betriebssystem kennt die Architektur des Prozessors, auf dem es ausgeführt wird, und kann entsprechend Funktionszeiger in einem Array anordnen. Die CPU ruft diese Funktion auf und die OS hat einen eigenen Code. Beispielsweise überprüft Windows in der Registrierung, ob ein Debugger installiert ist, und zeigt eine Meldung an, dass ein Fehler aufgetreten ist. Außerdem kann ein Debugger ausgeführt werden, um die Stelle zu ermitteln, an der der Fehler aufgetreten ist. Ein Interrupt wird als Interrupt bezeichnet, da er in den normalen Ablauf der Programmausführung eingreift und die Ausführung durch den Interrupt-Handler ermöglicht und der Prozessor erst nach seiner Beendigung zur Programmausführung zurückkehren kann.

Interrupts können nicht nur vom Prozessor, sondern auch von externen Geräten (Tastatur, Maus) oder Programmcode generiert werden. Der Thread-Scheduler legt einen Zeitgeber fest, der in Intervallen von einem Quantum (standardmäßig ca. 15 ms, in Windows Server mehr) einen Interrupt generiert, um einen anderen Thread für die Ausführung gemäß dem internen Algorithmus zuzuweisen. Die schrittweise Ausführung des Programms in Visual Studio hängt auch vom Interrupt-Mechanismus ab: Auf dem Prozessor wird ein Flag gesetzt, das nach jedem Befehl einen Interrupt verursacht, der von der Windows Debugging Engine verarbeitet und über die Visual Studio-API benachrichtigt wird.

Speicherfreigabe wird dank virtuellem Speicher implementiert. Ich habe vorhin gesagt, dass das Betriebssystem ein Ressourcenmanager und eine virtuelle Maschine ist. 1 RAM 32 Windows 4 , .. 1, 4. ( ). . 4096 (4), :

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

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

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

- ( - ) . / . -, .

Windows?


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

Bild

:

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

    Advanced Configuration and Power Interface? 1996 UI, .
    Bild

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

. .

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


All Articles