Comment Software / Code communique-t-il réellement avec le matériel?

Ma question est:

Lorsque j’appuie sur le bouton “Arrêter” sous Windows / Linux, l’ordinateur s’arrête . Comment la commande “Arrêter” a-t-elle réellement arrêté l’ordinateur?

Pour clarifier mon propos:

Quand on frappe une balle, il y a un contact physique entre la balle et notre jambe, pour que la balle bouge. Alors, comment la connexion physique est-elle réalisée entre le logiciel et le matériel? Comment le texte en clair des codes permet-il à l’ordinateur de faire ce qu’il fait?

    Bien que la réponse soit assez complexe et nécessite de comprendre les bases des systèmes et circuits élecsortingques (KVL, KCL), les nombres binarys et la logique booléenne, nous pouvons décrire le processus à un niveau élevé: le code (représenté par des mots en texte brut) est compilé , assemblés et finalement traduits en une combinaison de zéro et de onde, qui représentent respectivement des tensions faibles et élevées.

    Lorsque des tensions sont appliquées à des matériaux et à des circuits, ces tensions peuvent modifier leurs propriétés physiques, telles que la fermeture d’un circuit alimentant une ampoule (ce qui provoque son illumination) ou la fourniture de courant à un moteur à courant continu pouvant ouvrir un CD / DVD / Bluray / (?) Drive.

    Imaginez maintenant une hypothétique CPU à 1 bit, capable de fermer un circuit et de fournir du courant à un buzzer, créant ainsi un son. Ce processeur 1 bit a une seule entrée, qui peut avoir deux valeurs: 0 et 1.

    Ce processeur simple a un langage d’assemblage très simple: ON et OFF , et nous avons un langage de programmation sophistiqué qui fournit des abstractions plus cpu.turnOn : cpu.turnOn , cpu.turnOff .

    J’écris mon programme cpu.turnOn; comstackz-le, assemblez-le et il est prêt à être exécuté. Lorsque je lance le programme sur mon CPU, l’avertisseur s’active.

    Dans le monde réel, les ordinateurs sont composés de systèmes plus complexes. Au lieu d’un seul processeur 1 bit, nous avons un processeur 64 bits, avec des jeux d’instructions complexes et une multitude de périphériques.

    Pour faire interagir un système complexe, ces systèmes sont constitués de couches d’abstractions.

    La couche inférieure est constituée des tensions, des circuits et du silicium, ou de ce que vous pourriez considérer comme le «matériel physique» réel. Parallèlement, le matériel est généralement équipé d’un «microcontrôleur» ou d’une unité de traitement spécialisée conçue pour interagir avec les spécificités d’un matériel. Imaginez un lecteur de disque optique, son microcontrôleur a la capacité d’éjecter la baie, de démarrer le moteur, d’aligner le lazer et de diffuser les données hors du disque.

    Le logiciel que le microcontrôleur exécute est appelé firmware. C’est un système d’exploitation spécialisé qui contrôle les fonctions matérielles et peut également inclure une API. Dans l’exemple de processeur 1 bit imaginaire, le programme serait un firmware, et cpu.turnOn, cpu.turnOff serait l’API.

    Étant donné qu’un ordinateur est constitué de nombreux composants matériels (graphiques, stockage, communications, E / S), les ordinateurs sont composés de nombreux firmwares spécialisés. Pour tout ce qui est utile avec ce matériel, une autre couche d’abstraction est nécessaire, par exemple pour gérer les claviers de manière universelle, ou pour permettre aux souris, aux pavés tactiles et aux trackballs de se comporter de la même façon. C’est là qu’intervient le système d’exploitation. Le système d’exploitation fournit une API pour gérer des groupes de périphériques associés et fournit des crochets aux fournisseurs de matériel pour fournir la traduction entre les commandes du système d’exploitation et les commandes que le microcontrôleur comprend. Dans Windows Land, c’est un driver.

    La prochaine couche d’abstraction au-dessus des systèmes d’exploitation et des pilotes, ce sont les applications que les utilisateurs utilisent pour faire du vrai travail (ou jouer à Fortnite). Ces programmes sont écrits dans une myriade de langages, de kits de développement logiciel et de kits d’outils, ce qui explique pourquoi StackOverflow existe. Ces langages se comstacknt en code exécutable que le système d’exploitation charge et gère, et exécuté par l’ordinateur.

    Tout cela avec la commande shutdown : la commande intepreter utilise une API au niveau du système d’exploitation qui gère l’alimentation du système. Cette API envoie une notification au rest du système d’exploitation pour traiter des tâches telles que le vidage des tampons de mémoire, la sauvegarde de l’état des applications, la fermeture des canaux de communication et la mise hors tension de divers systèmes matériels. Il utilise également un pilote d’alimentation (ACPI?) Pour s’interfacer avec le sous-système de gestion de l’alimentation des ordinateurs. Ce sous-système est invité à s’arrêter, ce qui envoie un signal à l’alimentation de l’ordinateur pour interrompre le circuit et ne plus alimenter la majorité des composants.

    Si vous pensez que le logiciel est une créature différente du matériel, aucune explication ne vous satisferait. Pensez au logiciel comme à une séquence de charges élecsortingques. Tout le code que vous écrivez serait stocké en tant que séquence de charges élecsortingques sur la RAM ou le disque. Donc, vous n’écrivez PAS de texte, mais la séquence de charges élecsortingques. Votre carte vidéo dessine les éléments sur le moniteur en anglais pour vous aider à comprendre ce que vous tapez. D’une certaine manière, peut-être que tout ce que vous faites sur l’ordinateur est physique.

    Eh bien, l’arrêt n’est pas réellement physique, tous les circuits de l’ordinateur ne sont pas complètement éteints tant que vous n’avez pas débranché le courant.

    Le logiciel utilise l’interface APM (Advanced Power Management) du BIOS pour contrôler les circuits d’alimentation de l’ordinateur.

    Lorsque l’ordinateur est éteint, il peut toujours être allumé sans avoir à actionner physiquement un commutateur, par exemple en émettant un signal d’éveil par appel réseau depuis une carte réseau de l’ordinateur.

    La jambe qui frappe une balle en est un bon exemple. C’est assez similaire dans une machine. Le processeur est connecté à toutes les autres parties du système, mais contrairement au système nerveux qui est un câblage physique, tous les nerfs étant connectés en même temps, le processeur ne maintient pas une connexion permanente avec le rest du système. Il se connecte à la partie souhaitée à la demande – comme lors d’un appel téléphonique – tous les téléphones ont des connexions, mais seuls quelques-uns sont connectés à la fois.

    Le processeur fonctionne en exécutant des instructions – le logiciel. Il existe des codes d’instruction qui indiquent au processeur de composer certaines parties du système. Chaque partie a un numéro et l’unité centrale a pour instruction de composer un numéro. Une fois que le processeur a composé ce numéro, il envoie un message à cette partie – le message est simplement des données – d’un bit à un bloc de taille arbitraire. Le matériel à cet endroit agit alors sur le message codé.

    Pour ce faire, le processeur peut contrôler n’importe quel matériel en utilisant le même mécanisme. La seule chose qui change pour chaque périphérique est le numéro que le cpu doit composer et les données que le cpu envoie au périphérique – les détails qui sont introduits dans le logiciel que le cpu exécute.

    Ainsi, pour mettre la machine hors tension, l’unité centrale de numérotation compose le numéro du périphérique de gestion de l’alimentation et lui envoie des instructions pour entrer dans un état d’alimentation approprié. Le matériel répond et le bloc d’alimentation cesse d’envoyer l’alimentation principale à la carte mère.

    Lorsque vous écrivez des logiciels, vous n’avez pas à connaître tous ces détails vous-même. Ils sont généralement pré-emballés en tant que code prêt à l’emploi, de sorte que votre logiciel doit simplement indiquer “shutdown” et les codes prêts à l’emploi (généralement dans le BIOS) sont exécutés pour effectuer l’arrêt, comme indiqué ci-dessus.

    Les logiciels sont stockés dans le matériel sous forme de domaines magnétiques sur le disque dur ou la disquette, ou sous forme de tensions faibles et élevées dans les puces informatiques. Lorsque vous tapez sur un clavier, chaque caractère est converti en une série élecsortingque de 0 et de 1, qui sont ensuite stockés sous forme de basse et haute tension dans les puces informatiques appelées RAM. Les tensions basses et hautes de la RAM sont ensuite converties en domaines magnétiques sur le disque dur ou la disquette pour être relues ultérieurement par les têtes de disques en tensions, ou stockées en tant que tensions basses et hautes dans des puces non volatiles pour une lecture ultérieure. . Les tensions basses et hautes représentent les 0 et 1 élecsortingques générés par les caractères du clavier.

    Il existe plusieurs interfaces entre les programmes PC et le monde réel extérieur.

    Certains se connectent au CPU. Des exemples sont les ports et les interruptions matérielles (IRQ). Celles-ci permettent d’envoyer de petites quantités de données (par requête de programme hôte) et des fonctions d’appel (gestionnaires d’interruption) basées sur des déclencheurs matériels (ligne discrète allant de basse à haute).

    Il existe des interfaces plus rapides pour transférer des quantités massives de données qui contournent le processeur. Cela s’appelle DMA (access direct à la mémoire). Celles-ci sont utilisées pour transférer des données sur disque, réseau, cartes graphiques, etc.

    Pour les ports IO (opcodes IN et OUT), le logiciel est l’initiateur. Pour IRQ, le matériel parle en premier pour déclencher une réponse logicielle.

    Seuls les pilotes de périphériques sont autorisés à faire tout cela. Si vous essayez de le faire depuis l’application, le système d’exploitation le brisera instantanément. Les applications se connectent à ce monde via des API présentées par des pilotes de périphérique. La plupart des API sont normalisées, vous pouvez donc remplacer le périphérique réel sans avoir à interagir différemment (imprimante, disque, clavier, souris, commutateur CRROM, ATX dans votre exemple).

    Comparons les solutions physiques et logicielles.

    Lorsque vous appuyez sur le bouton, vous envoyez un signal de 5 volts au bloc d’alimentation. Ces 5 volts d’alimentation ne s’éteignent jamais (même si vous pensez que votre ordinateur est éteint). Vous avez besoin de ces 5 volts lorsque vous appuyez sur le bouton pour allumer l’ordinateur – à quel point un autre 5 volts est envoyé au bloc d’alimentation pour lui demander de se rallumer.

    Donc, en réalité, la pression de votre bouton physique est convertie en un signal électronique pour que l’alimentation puisse faire quelque chose.

    Lorsque vous pensez aux choses en ces termes, vous réalisez soudain que l’ordinateur n’a pas besoin de transformer son signal électronique en un bouton-poussoir physique pour l’éteindre – c’est quelque chose qu’ils ont ajouté au profit des humains (si vous y pensiez était un minuscule moteur qui poussait un bouton secret “off” – ça n’existe pas.

    Il suffit donc que le logiciel commande un signal électronique, ce qui déclenche l’alimentation en mode de veille 5 volts.

    En fait, votre texte en clair ne provoque pas l’arrêt direct de l’ordinateur. Il appelle une procédure du système d’exploitation sous-jacent. Le système d’exploitation appelle à son tour l’ACPI / APM sur votre carte principale. Cela va alors arrêter l’ordinateur.

    L’interaction des petits et des grands avec les circuits de votre matériel est un sujet assez complexe sur lequel vous pouvez lire au moins un livre pour le comprendre complètement …

    Si, au cas où vous cherchiez en général un appareil est conçu pour effectuer son action, le périphérique est livré avec des firmwares stockés dans la ROM / CHIP de la carte de contrôle. Le tableau de commande est utilisé pour contrôler l’appareil à l’aide de signaux élecsortingques.

    Au-dessus du micrologiciel, vous aurez des pilotes / fournisseur de services. L’application utilisera ces fournisseurs de services / pilotes pour communiquer ou demander au périphérique d’effectuer certaines actions.

    Cliquez ici pour en savoir plus sur la façon dont les firmwares communiquent avec les appareils électroniques pour effectuer leurs opérations.

    J’ai réfléchi à la même question pour le moment, et je me suis rendu compte qu’il y avait en fait une connexion entre le monde du logiciel (fantastique) et le monde matériel (réel).

    Pensez à quelque chose d’aussi simple que des circuits et des commutateurs, puis pensez à quelque chose de plus abstrait, comme un additionneur ou un ALU. Au fil du temps, l’abstraction se construit sur elle-même et devient complexe dans la prochaine rom. Viennent ensuite le microcode, les opcodes, le langage de la machine, puis enfin l’assemblage et C. Après cela, le BIOS, l’OS, les pilotes et l’interface utilisateur graphique sont arrivés et voici le bouton “Arrêter”.

    C’est simple: les codes / logiciels que nous écrivons sont des signaux élecsortingques représentés par les 0 (OFF) et les 1 (ON) sur la CPU. De ce point, pensez aux courants et aux moteurs.