Ă€ propos du fonctionnement d'un PC en utilisant l'exemple de Windows 10 et du clavier, partie 1

image

Je m'appelle Andrey Artemyev, je travaille chez Microsoft sur le noyau de Windows 10, j'ai précédemment travaillé sur Windows 10x (WCOS), XBox, Windows Phone et Microsoft Edge. Je veux populairement à des fins éducatives raconter comment l'ordinateur fonctionne sur l'exemple de la saisie au clavier et de Windows 10. Cette série d'articles est conçue principalement pour les étudiants de spécialités techniques. Nous allons considérer quel chemin les informations sur la touche enfoncée du clavier vont afficher dans Notepad.exe. En raison de l'immensité et de l'interdisciplinarité du sujet, il peut y avoir des inexactitudes dans les articles, qui sont rapportées dans les commentaires. Certaines informations peuvent être obsolètes en raison de la vitesse à laquelle Windows se développe.

Ă€ quelle profondeur plongons-nous dans le sujet?


Parlons d'abord des niveaux auxquels un ordinateur peut être considéré. Chaque niveau est basé sur le précédent. Commençons par le haut.

Niveau d'application . Toutes les applications utilisateur se trouvent ici, c'est un navigateur, Microsoft Office, un bloc-notes, ainsi que le serveur Web IIS, SQL Server, divers middleware comme Java et .Net et tous les langages de script, qu'il s'agisse de fichiers Ruby, PHP ou Bat.

Niveau du système d'exploitation . Le système d'exploitation peut être considéré comme:

  • Gestionnaire de ressources - mĂ©moire, disques durs, imprimantes, Ă©cran, clavier, ressources limitĂ©es partagĂ©es par les programmes exĂ©cutĂ©s sur l'ordinateur.
  • Machine virtuelle - un fichier est un bon exemple d'un objet virtuel. Il reprĂ©sente une abstraction des donnĂ©es sur disque, une API pour travailler avec, et ajoute Ă©galement le concept de droits d'accès. Au lieu d'un fichier, il pourrait y avoir le concept d'un conteneur de donnĂ©es et d'une API complètement diffĂ©rente. Il existe de nombreux objets virtuels de ce type dans le système d'exploitation.
  • Platform - OS fournit des modèles logiciels et des primitives pour la crĂ©ation de programmes. Par exemple, Windows Drivers Framework vous permet de dĂ©velopper rapidement des pilotes, les fenĂŞtres de Windows sont utilisĂ©es pour crĂ©er des interfaces utilisateur complexes. Dll - fournit un modèle pour Ă©tendre les fonctionnalitĂ©s du programme via des plugins, ainsi qu'un mĂ©canisme pour implĂ©menter un lecteur d'Ă©cran via des pièges Ă  clavier (voir le crochet LowLevelKeyboard).
Le système d'exploitation est divisé en couches et composants. En général, l'architecture de Windows 10 ressemble à ceci. Nous en parlerons en détail un peu plus tard.

image

Niveau d'architecture informatique . Il est représenté par une carte mère, qui a un facteur de forme spécifique, des fonctions intégrées codées dans des microcircuits appelés un jeu de puces et des ports à travers lesquels il est possible d'étendre les fonctionnalités d'un ordinateur en connectant une carte graphique, une carte réseau, une mémoire vive (RAM) supplémentaire, des disques durs, un clavier, etc. Les ports affectent la vitesse et les capacités de l'ordinateur, qui déterminera son objectif, qu'il s'agisse d'un serveur pour traiter des milliers de requêtes par seconde, d'une tablette pour utiliser Internet ou d'un PC de jeu avec plusieurs vidéos arty. OS résume les fonctionnalités de la carte mère.

Les microcircuits ressemblent à l'image ci-dessous et sont un mini-ordinateur qui exécute des programmes simples pour des tâches de bas niveau, par exemple, lit les données du clavier et les transfère plus loin pour qu'elles atteignent le processeur en fin de compte. En règle générale, ils sont mis en œuvre comme un microcircuit analogique non programmable ou un microcontrôleur programmable en C.

image


La carte mère peut être considérée comme une colonie de microcircuits qui communiquent entre eux via des bus et à travers eux les données des appareils connectés au processeur et vice versa circulent. Le jeu de puces est une sorte de système nerveux informatique. Toutes les puces de la carte mère ont été créées à l'origine pour fonctionner ensemble. Certains d'entre eux peuvent avoir des fonctions spéciales, par exemple, un minuteur ou un stockage des paramètres du BIOS. Le plus important d'entre eux est peut-être celui qui a un programme intégré (firmware, BIOS, UEFI) qui commence à fonctionner dès que l'électricité apparaît. Elle trouve le disque dur avec le chargeur de démarrage Windows et lui transfère le contrôle, qui à son tour lance le fichier exécutable du système d'exploitation, qui peut être appelé Windows10.exe, en fait NtOsKrnl.exe. Le BIOS sait quoi rechercher grâce à un accord entre les fabricants de matériel et les systèmes d'exploitation.

Autour de la carte mère, vous pouvez assembler un téléphone mobile, une console de jeu, une station serveur ou un appareil intelligent. Dans l'image ci-dessous, les facteurs de forme courants des cartes mères.

image

Le niveau de microarchitecture est représenté par le processeur (CPU), c'est le cœur de la carte mère et l'ensemble du jeu de puces est nécessaire pour entretenir le CPU. Un processeur est un ordinateur dans un ordinateur, un microcontrôleur plus puissant et avancé qui n'a pas besoin de micrologiciel, car le flux de commandes arrive à la volée lorsque le planificateur de threads a changé le contexte du processeur. La fonction du processeur est divisée en sous-systèmes, par exemple, un composant impliqué dans les opérations mathématiques et logiques, un coprocesseur mathématique et un cache. Certains d'entre eux étaient autrefois une puce séparée sur la carte mère, mais ils font maintenant partie du CPU, par exemple, un contrôleur d'interruption et une puce appelée North Bridge, ce qui a augmenté la vitesse de travail.

La microarchitecture n'est pas la même chose que l' architecture . Toutes les fonctionnalités du CPU sont divisées en composants qui fonctionnent ensemble. Ces composants et leur interaction sont la microarchitecture. Dans l'organigramme ci-dessous, ils sont représentés par des rectangles et des carrés colorés.

imageimage

L'architecture du processeur est essentiellement un document qui décrit les fonctionnalités qu'il doit avoir pour correspondre, par exemple, à l'architecture x86, x64 ou ARM utilisée sur les appareils mobiles. Ce document décrit les commandes, les affectations de registre et la logique d'opération à prendre en charge. Les créateurs de processeurs Intel, AMD, Elbrus peuvent implémenter cette fonctionnalité à leur guise et y ajouter de nouvelles fonctionnalités sous forme de commandes, registres, drapeaux, interruptions et si le système d'exploitation les connaît, il peut les utiliser. En termes de POO, l'architecture CPU est l'interface, et la microarchitecture est sa mise en œuvre.

Circuits logiques . Les rectangles colorés du diagramme de bloc CPU sont constitués de circuits logiques qui effectuent leurs opérations sur des séquences de zéros et de uns. Le processeur voit toutes les données et instructions sous forme de bits (0 et 1), selon la formule, tout nombre décimal peut être représenté comme une séquence de 0 et 1, mais ce qu'un nombre particulier signifie dépend du contexte. Il peut s'agir d'un code, d'un nombre, d'une lettre. L'unité arithmétique et logique (ALU) peut ajouter deux nombres par le biais d'opérations au niveau du bit. Les algorithmes au niveau du bit d'addition, de soustraction, de multiplication et de division sont connus depuis longtemps; les développeurs du circuit logique n'ont qu'à les implémenter efficacement.

image

Les circuits numériques fonctionnent avec des données au niveau des zéros et des uns, tandis que les circuits analogiques reposent sur l'exploitation des lois de la physique. Ils effectuent de simples manipulations de bits, telles que des décalages, AND, OR, XOR. Grâce à ces primitives, des opérations plus complexes sont mises en œuvre. L'image ci-dessous montre l'opérateur ET analogique implémenté via des transistors. En sortie du circuit, une tension non nulle n'existera que si elle est sur les deux contacts d'entrée (Bx1 et Bx2), sinon zéro volt. L'opérateur && en C # fonctionne de la même manière. Les circuits numériques sont finalement basés sur l'analogique. Les éléments physiquement logiques dans les circuits logiques peuvent être mis en œuvre non seulement de manière électronique mais également mécanique, hydraulique, optique et autres.

image

Le niveau des radioéléments . Les circuits physiquement analogiques reposent sur des éléments radio qui exploitent réellement les lois de la physique. Ce sont principalement des semi-conducteurs, c'est-à-dire sous certaines conditions, ils peuvent conduire l'électricité, mais pas. La diode conduit le courant dans une seule direction, si elle n'est pas soudée, tournée à 180 ° et soudée en retour, le courant ne la traversera pas. Le transistor ne fait passer le courant que s'il y a de la tension sur la branche de commande. L'humanité a appris à rendre les transistors microscopiques et, par conséquent, ils peuvent être placés sur une petite planche par millions. Dans les images ci-dessous, des éléments radio semi-conducteurs et un transistor conventionnel à côté d'un nano transistor sous un microscope électronique.
image

image
Le niveau des lois de la physique . Et enfin, le niveau le plus bas est le niveau des lois de la physique qui sont enfermées dans les radioéléments semi-conducteurs.

image

Nous parlerons beaucoup du niveau OS et un peu moins de l'architecture informatique, de la microarchitecture, des circuits analogiques et des éléments radio. Pour la dernière partie, vous devez comprendre comment tout cela fonctionne ensemble.

Bases du système d'exploitation


Lorsque nous sommes allés au langage d'assemblage à l'université, de nombreux étudiants ont eu la stupeur de mots aussi intelligents que «modes noyau et utilisateur», sous lesquels un système d'authentification de rôle vraiment bien connu est caché sous tous, sur tous les sites, il y a au moins un «Admin» avec accès à toutes les pages et l '«Utilisateur» ayant un accès limité. De la même manière, le rôle "Core" a accès à toutes les capacités du CPU, et le rôle "User" peut ne pas provoquer toutes les commandes du processeur et pas avec tous les arguments. En plus de ce modèle de rôle, le système d'exploitation est construit sur le principe de l'architecture client-serveur, où le serveur est le noyau qui implémente la fonctionnalité du système d'exploitation et le client est des programmes utilisateur. Dans le monde du Web, le client et le serveur sont physiquement séparés - ce sont deux ordinateurs différents communiquant via le réseau. Dans le système d'exploitation, le client et le serveur vivent sur la même machine et sur le même matériel. Le serveur dispose d'une certaine API qui permet aux clients de changer son état, par exemple, l'API Twitter vous permet de créer des publications, de vous connecter et de télécharger un flux de tweet sur un client mobile. Windows a une API Win, qui n'est que plus encombrante en raison d'un éventail de tâches plus large; aujourd'hui, Windows a environ 330 000 API plus une API pour les applications UWP. Si les concepts de Twitter sont plus ou moins clairs pour tout le monde - publication, utilisateur, flux - alors les concepts de l'OS peuvent nécessiter un approfondissement intérieur. Par conséquent, les API Windows peuvent être difficiles à comprendre sans comprendre la structure interne du système d'exploitation.

En fait, le noyau signifie trois choses différentes. Le noyau est comme tout le code OS. Le noyau en tant que sous-système responsable des mécanismes de système d'exploitation, tels que le planificateur de threads, le changement de contexte, la gestion des interruptions, l'échange de mémoire virtuelle en physique (noyau) et le sous-système de noyau pour prendre en charge d'autres systèmes d'exploitation - CSRSS.exe (Windows), PSXSS.exe (POSIX), OS2SS.exe (OS / 2) ou WSL (sous-système Windows pour Linux). Dans ce contexte, la première signification est comprise - tout le code OS.

Lorsqu'une fenêtre apparaît à l'écran, une structure de données apparaît dans la partie serveur du système d'exploitation (mode noyau) qui décrit cette fenêtre - sa position sur l'écran, sa taille, le texte du titre, la fonction de la fenêtre à travers laquelle le système d'exploitation permet à l'application de répondre aux événements. Comme il existe de nombreux sous-systèmes dans le système d'exploitation, il peut y avoir plusieurs structures de données décrivant un objet, par exemple, des informations sur le processus utilisateur se trouvent dans les composants:

  • ExĂ©cutif - voici la logique de l'OS. Cette couche vĂ©rifie ce que les processus peuvent et ne peuvent pas faire. Ce fichier contient des informations sur le processus parent, les paramètres de dĂ©marrage du processus (Process Environment Block), le compte utilisateur associĂ©, le nom du fichier exe du processus.
  • Les mĂ©canismes du noyau - OS tels qu'un planificateur de threads sont implĂ©mentĂ©s ici. Il stocke combien de temps le processus passe en mode utilisateur et noyau, Ă  quels processeurs ses threads sont attachĂ©s, la prioritĂ© de base des threads de processus.
  • Sous - système de fenĂŞtrage - informations sur les objets GDI qui sont utilisĂ©s pour dessiner dans la fenĂŞtre. Ce sont des primitives telles que des pinceaux, un stylo, etc.
  • DirectX - tout ce qui concerne DirectX: shaders, surfaces, objets DX, compteurs de performances GPU, paramètres de mĂ©moire pour la mĂ©moire graphique.
  • Le sous-système Windows reprĂ©sentĂ© par le processus CSRSS.exe ( sous - système d' exĂ©cution client-serveur). Windows supportait auparavant OS POSIX (processus PSXSS.exe) et OS / 2 (OS2SS.exe). Ă€ cette Ă©poque, l'idĂ©e est venue de faire de Windows le mĂŞme sous-système, mais cela a Ă©tĂ© lent et une partie de CSRSS.exe a donc Ă©tĂ© transfĂ©rĂ©e vers win32k.sys, qui est maintenant divisĂ© en plusieurs fichiers - win32k.sys, win32kbase.sys et win32kfull.sys. Les informations sur les donnĂ©es de groupe de processus, le niveau d'arrĂŞt, les donnĂ©es de session, etc. sont stockĂ©es ici.

La prise en charge de POSIX et OS / 2 était plus probablement formelle, car pour transférer le programme à partir de ces systèmes d'exploitation, vous deviez trouver le code source et le recompiler de manière spéciale pour obtenir un fichier exe dans lequel tous les appels à l'API OS étaient redirigés vers PSXdll.dll (NETAPI.DLL et DOSCALLS.DLL pour OS / 2 et User32.dll pour les applications Windows), qui était un wrapper fin sur l'API Windows. L'état de certaines API a été stocké dans le processus du sous-système PSXSS.exe (OS2SS.exe). Étant donné que toutes les API ne peuvent pas être mappées sur 1 à 1, un tel programme a fonctionné de manière instable. Le support Linux a été ajouté dans Windows 10 et cela fonctionne d'une manière complètement différente. Le sous-système Linux est hébergé en mode noyau et la différence entre le sous-système Windows pour Linux et Linux est approximativement la même qu'entre différentes versions. Surtout pour WSL, un nouveau type de processus a été introduit - le processus PICO.

Qu'est-ce qu'un composant? Il s'agit d'une fonctionnalité regroupée logiquement. Un composant peut être appelé une classe OOP, dll, dossier, ensemble de fonctions avec un préfixe commun, un espace de noms, une couche dans l'architecture.

Plus d'informations sur le partitionnement client-serveur


La séparation du client et du serveur est mise en œuvre à l'aide de la fonctionnalité intégrée du processeur, du partage de mémoire et des vérifications logicielles.

Les fabricants d'équipements collaborent avec les développeurs du système d'exploitation, par conséquent, le processeur dispose de mécanismes créés en tenant compte des besoins des créateurs de systèmes d'exploitation. Dans tous les processeurs modernes, le mécanisme de rôle d'utilisateur est implémenté, où l'utilisateur est compris comme le code actuellement exécutable. Dans les applications Web, le rôle de l'utilisateur connecté est stocké dans une variable et, en plus du nom clair Admin ou User, a un ID de ce rôle, qui est souvent utilisé lors de l'autorisation, car la comparaison des nombres est plus rapide et plus facile que les chaînes. Dans le processeur, le rôle de l'utilisateur actuel est stocké dans un champ appelé «anneau de sécurité», et non «CurrentUser.Role.Id». Dans la plupart des processeurs, ce champ prend quatre valeurs de 0 à 3. Windows utilise 0 pour le rôle appelé «Mode noyau», car il s'agit du mode le plus privilégié et la plus grande valeur pour le rôle est «Mode utilisateur», car il s'agit du rôle le plus limité. Les rôles restants ne sont pas utilisés car la différence entre 0 et 1, 2 et 3 est négligeable. Ces rôles limitent les pages de mémoire qui peuvent être adressées, vous ne pouvez pas appeler certaines instructions ou vous ne pouvez pas les appeler avec certains arguments. Il existe également des restrictions sur l'utilisation de la technologie des ports d'E / S pour l'échange de données avec des périphériques tels qu'un clavier, mais elle n'a pas été utilisée depuis 10 ans. Le passage en mode noyau s'effectue via la commande syscall, qui, par index, trouve la fonction à appeler dans le tableau de pointeurs vers les API Windows. Un pointeur vers ce tableau est stocké dans un registre de processeur spécial lors du démarrage du système d'exploitation.

J'ai spécifiquement appelé le registre CPU un champ. Lorsque vous écrivez un programme en C #, vous pouvez ajouter autant de champs à votre classe que vous le souhaitez et leur donner des noms conviviaux. Pour les processeurs et les microcontrôleurs, les champs sont appelés registres. Lorsque vous concevez un morceau de fer, vous devez déjà comprendre à ce stade le nombre de registres (champs) dont vous avez besoin, leur taille et la fonctionnalité à leur attribuer, afin que cela soit suffisant pour toutes les occasions pour toutes les situations imaginables et inconcevables. Imaginez que vous avez besoin d'écrire un programme dans un langage de programmation de type C # qui a 16 champs prédéfinis dans la classe et que vous ne pouvez pas utiliser de variables locales. C'est-à-dire le même champ peut être utilisé pour stocker l'utilisateur connecté, le tableau trié, les données temporaires ou le résultat de la méthode. Les noms de ces champs doivent être aussi communs que possible, au lieu de tempData, funcResult, il y aura des noms étranges EAX, AH, AL, DX, etc. Si vous avez écrit un émulateur du processeur sur l'architecture x86 en C #, le code pourrait ressembler à ceci (DIV - diviser, commande division entière):

image

Pour illustrer, j'ai ajouté une vérification du mode noyau. En cas d'erreur de division par zéro, le processeur avertit le système d'exploitation via une interruption (déclenche un événement). Au démarrage, le système d'exploitation fournit au processeur un tableau unidimensionnel de pointeurs vers une fonction appelée vecteur d'interruption, où chaque index correspond à une sorte d'événement, par exemple, une division par zéro. Le système d'exploitation connaît l'architecture du processeur sur lequel il s'exécute et peut donc organiser les pointeurs de fonction dans un tableau. Le CPU appelle cette fonction et l'OS a son propre code. Par exemple, Windows recherche dans le Registre si un débogueur est installé et affiche un message indiquant qu'une erreur s'est produite et qu'il est possible d'exécuter un débogueur pour rechercher l'emplacement où il s'est produit. Une interruption est appelée interruption car elle intervient dans le cours normal de l'exécution du programme et permet au gestionnaire d'interruption de s'exécuter et ce n'est qu'après son achèvement que le processeur peut retourner à l'exécution du programme.

Les interruptions peuvent être générées non seulement par le processeur mais également par des périphériques externes (clavier, souris) ou un code de programme. Le planificateur de threads définit un temporisateur qui, à des intervalles d'un quantum (par défaut, environ 15 ms, dans Windows Server plus) génère une interruption afin d'attribuer un autre thread pour l'exécution selon l'algorithme interne. L'exécution pas à pas du programme dans Visual Studio repose également sur le mécanisme d'interruption - un indicateur est défini sur le processeur, ce qui, après chaque commande, provoque une interruption qui est traitée par le moteur de débogage Windows et notifiée via l'API Visual Studio.

Le partage de mémoire est implémenté grâce à la mémoire virtuelle. J'ai dit plus tôt que le système d'exploitation est un gestionnaire de ressources et une machine virtuelle. 1 RAM 32 Windows 4 , .. 1, 4. ( ). . 4096 (4), :

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

Windows 10 , — ( ), .
imageimage
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++. :

image

:

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

    Advanced Configuration and Power Interface? 1996 UI, .
    image

    1996 ACPI, , .. . ACPI , CD drive, .. .
  • Device Drivers — . *.sys, , . Process Explorer SysInternals .
  • Kernel — Kernel Mode Execution Environment , , , , . .
  • Executive — , - .
  • Windowing & Graphics — DirectX .
  • NtDll.dll — . dll , ( .. dll) . Nt Native, Native American. C'est-Ă -dire 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/fr483330/


All Articles