4,98 secondes après avoir appuyé sur le bouton d'alimentation

Cet article explique uniquement la question suivante:

Que s'est-il passé quelques secondes après avoir appuyé sur le bouton d'alimentation?

Cela semble être une question que beaucoup de gens veulent comprendre, mais ce qui me fait me demander: pourquoi ne puis-je pas trouver une réponse à une question qui semble si simple?

La plupart des descriptions que j'ai trouvées sont comme ceci:

Selon la «séquence de démarrage», le BIOS transfère le contrôle au périphérique de stockage qui occupe le premier rang: le disque dur. Recherchez ensuite la partition de l'enregistrement de démarrage principal sur le disque dur. Cette partition indique à l'ordinateur où se trouve le système d'exploitation et charge le système d'exploitation dans la mémoire. Ensuite, vous pouvez voir l'interface de démarrage classique et le processus de démarrage est terminé.

Cette description est tout simplement magique, pourquoi le BIOS domine-t-il tout cela? Comment l'appeler dans l' ordre d'activation ? Cette partition est chargée dans la mémoire, puis comment dire à l' ordinateur où se trouve le système d'exploitation? Je ne supporte pas une description aussi magique, je dois la clarifier.

Pour apprendre quelque chose d’abord, vous devez avoir une pré- connaissance. Nous la traitons comme une connaissance connue. Je ne peux pas partir du principe de la formation de molécules à partir d’atomes.

Quelles sont les connaissances préalables pour apprendre le processus de démarrage de l'ordinateur? J'attends que vous sachiez ce qui suit:

  1. La mémoire est un lieu de stockage des données, étant donné un signal d'adresse, la mémoire peut renvoyer les données correspondant à l'adresse.

  2. Le fonctionnement du processeur consiste à extraire constamment des instructions de la mémoire et à les exécuter.

  3. L'adresse de la mémoire à partir de laquelle la CPU récupère est déterminée par la valeur dans un registre, cette valeur continuera à effectuer des opérations +1 ou une instruction de saut spécifie sa valeur.

Eh bien, vous avez seulement besoin de connaître ces trois pré- connaissances, et vous pouvez expliquer professionnellement le processus de démarrage de l'ordinateur.

1. Pourquoi le BIOS est-il dominé?

Il est dit qu'après le démarrage, le BIOS commencera à exécuter son propre programme, effectuera une auto-vérification du matériel et chargera la zone de démarrage. Je ne suis pas satisfait. Pourquoi le programme du BIOS est-il exécuté après le démarrage? Pourquoi n'est-ce pas en mémoire? Pourquoi ne figure-t-il pas sur le disque dur?

D'accord, ne doutez pas de la pré-connaissance, la méthode de travail du processeur est de récupérer constamment des instructions de la mémoire et de les exécuter, alors pourquoi dit-on exécuter les programmes dans le BIOS? Cela doit parler de mappage de mémoire .

Deux, mappage de la mémoire

La largeur du bus d'adresse CPU détermine la taille de l'espace mémoire accessible . Par exemple, la largeur du bus d'adresse CPU 16 bits est de 20 bits et la plage d'adresses est de 1M. La largeur du bus d'adresse du processeur 32 bits est de 32 bits et la plage d'adresses est 4G. Vous pouvez calculer la plage d'adresses de notre machine 64 bits actuelle.

Cependant, l'espace mémoire accessible est si grand que cela ne signifie pas qu'il est entièrement utilisé pour la mémoire. En d'autres termes, non seulement la mémoire est l'objet adressable, mais aussi certains périphériques doivent être accessibles via le bus d'adresses. Comment y accéder ceux-ci Qu'en est-il des périphériques?

Une méthode est le mappage de la mémoire . La compréhension simple consiste à mapper la mémoire vidéo, le contrôleur de disque dur, etc. à la mémoire. Nous lisons ou écrivons dans la position correspondante, ce qui équivaut à lire ou à écrire dans la position correspondante de la mémoire vidéo et autres périphériques. Écrivez, de sorte que les périphériques et la mémoire soient unifiés.

Il en va de même pour le BIOS, il sera également mappé sur la mémoire.

Génial, maintenant cela peut être expliqué avec une simple pré-connaissance, nous continuons à pousser vers le bas.

3. Répartition de la mémoire en mode réel

Je viens de dire que la mémoire est divisée en zones pour différents périphériques, donc la question se pose naturellement, quelle zone est allouée à quel périphérique? Si c'est une règle, il vaut mieux avoir une table. Oui, c'est vrai. C'est la répartition de la mémoire en mode réel. J'en ai dessiné une image:

Oups, je suis vraiment un petit ange. J'ai montré les proportions. Si vous pouvez trouver quelque chose de plus intuitif que le mien sur Internet, laissez-moi un message.

J'expliquerai après le mode réel.La compréhension simple maintenant est que seulement 1M de mémoire est disponible lorsque l'ordinateur est allumé.

On voit que la mémoire est divisée par différents périphériques, c'est-à-dire mappés dans la mémoire.

Le BIOS est plus impitoyable. Non seulement son espace est mappé à l'emplacement de mémoire 0xC0000-0xFFFFF, mais le programme qu'il contient occupe également certaines zones au début. Par exemple, la table des vecteurs d'interruption est écrite au début de la mémoire. est vraiment ce qu'on appelle le premier arrivé, premier servi.

4. Comment démarrer l'exécution à partir du programme dans le BIOS

D'accord, nous savons maintenant que les informations du BIOS sont mappées à l'emplacement de mémoire 0xC0000-0xFFFFF et que le BIOS système le plus critique est mappé à l'emplacement 0xF0000-0xFFFFF.

Si je dis maintenant que le démarrage du processeur consiste à exécuter le code dans cette zone, et que Barabara démarrera après une courte opération, vous devez me vaporiser, pourquoi vous êtes-vous arrêté ici? Pourquoi ne pas recommencer depuis le début?

Cela a naturellement une conjecture, nous devons utiliser une autre pré-connaissance, où le CPU récupère l'exécution de la mémoire et l'exécute?

Est la valeur de l'adresse dans le registre du PC .

L'adresse d'entrée et l'adresse de début du programme BIOS sont 0xFFFF0 (c'est ce que les gens écrivent), c'est-à-dire que lorsque le bouton de mise sous tension est enfoncé, il doit y avoir un pouvoir magique pour changer la valeur du registre du PC en 0xFFFF0, et puis le CPU commence à ne rien faire. Oui, la phrase suivante peut être la réponse que vous recherchez depuis longtemps, soyez prêt:

Au moment du démarrage, le registre PC de la CPU est forcé de s'initialiser à 0xFFFF0 .

(Pour être plus précis, la CPU initialise le registre d'adresse de base de segment cs à 0xF000 et le registre d'adresse de décalage IP à 0xFFF0. Selon les règles de calcul d'adresse finale en mode réel, l'adresse de base de segment est décalée de 4 bits vers la gauche, plus l'adresse de décalage, l'adresse physique finale est obtenue, c'est-à-dire que l'adresse de registre PC abstraite est 0xFFFF0.)

Quand j'apprenais ce savoir, j'ai vu cette phrase qui m'a permis de résoudre les doutes de longue date dans mon cœur. Quelle vérité simple et grossière. À ce stade, j'ai également poussé un soupir de soulagement, car le reste du processus est presque comme un compte courant.

Quant à savoir comment forcer l'initialisation, je pense que cela a franchi la limite de la pré-connaissance. De plus, les implémentations matérielles des différents fabricants ne sont pas forcément les mêmes. Il existe de nombreuses façons et elles sont très simples. Cela n'a pas beaucoup de sens d'en discuter.

5. Quel programme est écrit dans le BIOS?

Eh bien, nous savons maintenant que le CPU initialise de force son registre PC à l'adresse d'entrée du programme BIOS au moment du démarrage.De là, le CPU a fonctionné en avant sans s'arrêter.

Ensuite, la question suivante semble se poser très naturellement, c'est-à-dire qu'est-ce qui est écrit dans le programme BIOS?

Il n'est pas approprié d'afficher toutes les informations binaires dans le programme du BIOS, nous analysons certaines des principales. Commençons par deviner, vous voyez que l'adresse d'entrée est 0xFFFF0, indiquant que le programme est exécuté à partir d'ici. La limite inférieure de la mémoire en mode réel est 0xFFFFF, c'est-à- dire qu'il ne reste que 16 octets pour écrire du code.

Si vous êtes intéressé, vous devriez être en mesure de deviner que l'adresse d'entrée peut être une instruction de saut pour accéder à un espace plus grand pour effectuer votre propre tâche. C'est vrai. Les instructions machine stockées à 0xFFFF0, traduites en langage d'assemblage sont:

jmp far f000:e05b

Cela signifie sauter à l'adresse physique 0xfe05b et démarrer l'exécution (rappelez la méthode de calcul d'adresse en mode réel mentionnée précédemment).

Commençant à l'adresse 0xfe05b est le code que le BIOS joue réellement. Ce code détectera certaines informations périphériques, initialisera le matériel, établira une table de vecteurs d'interruption et remplira les routines d'interruption. N'étendez pas la partie ici. Il s'agit simplement d'un programme codé en dur, et il n'est pas utile de comprendre le processus de démarrage. Examinons la prochaine étape merveilleuse, qui est la dernière tâche du BIOS: le chargement de la zone de démarrage .

Six, qu'est-ce que 0x7c00

L'endroit pour être plus réel est d'être plus réel. Je ne laisserai jamais apparaître ici les mots qui chargent ce genre de magie. Démontons-le maintenant.

En fait, le terme n'est pas magique: le chargement dans le domaine informatique fait référence au processus de copie d'un programme sur un périphérique (tel qu'un disque dur) dans la mémoire . Le processus de traduction du chargement de la zone de démarrage consiste en ce que le programme BIOS copie le contenu de la zone de démarrage dans une certaine zone de la mémoire .

D'accord, le problème se pose naturellement à nouveau. Où est la zone de démarrage? Où la mémoire est-elle copiée? puis? Nous répondrons un par un.

Quelle est la zone de démarrage? Même si vous ne le savez pas, vous devriez être capable de deviner qu'il doit s'agir d'un domaine qui répond à une certaine caractéristique, donc les gens l'appellent un domaine de démarrage. Quelles caractéristiques doit-il rencontrer? Ne vous inquiétez pas, je ne sais pas si vous avez une expérience dans la configuration de la séquence de démarrage du BIOS. Habituellement, il existe un démarrage sur disque U, un démarrage sur disque dur, un démarrage sur disquette, un démarrage sur CD, etc. Le BIOS lira ces disquettes de démarrage dans l'ordre, qui se trouve dans la piste 0 du disque 0. 1 Le contenu du secteur .

Quant à la division du format du disque, cet article ne l'expliquera pas. Bref, pour la mémoire, on peut récupérer les données à cette adresse en donnant une adresse numérique. Pour le disque, il faut donner la tête, le cylindre, et le secteur Les données qui permettent de localiser un certain emplacement avec une seule information ne sont qu'un moyen de décrire l'emplacement.

Ensuite, le contenu de ce secteur 0 piste 1 du disque 0 a un total de 512 octets. Si les deux derniers octets sont respectivement 0x55 et 0xaa, alors le BIOS le considérera comme une zone de démarrage . Si ce n'est pas le cas, passez au périphérique suivant afin de trouver le contenu situé dans le secteur 0 disque 0 piste 1. Si vous constatez qu'aucun d'entre eux ne remplit les conditions à la fin, il signalera directement une erreur d'absence de zone de départ.

Que fait le BIOS après avoir trouvé cette zone de démarrage? Oh, j'ai dit plus tôt qu'il est en cours de chargement, ce qui signifie que le contenu de ces 512 octets, un bit, est tous copié dans l'emplacement mémoire 0x7c00 . Comment est-il copié? Bien sûr, ce sont des instructions. Quelles instructions? Ici, je peux simplement dire qu'il y a des entrées et des sorties dans le jeu d'instructions, qui sont utilisées pour copier les données du périphérique vers la mémoire, ou pour copier les données de la mémoire vers le périphérique. Utilisez ces deux instructions et le périphérique pour fournissez-nous Cela peut être fait par la voie de la lecture.

Une fois la copie terminée, notre programme devrait prendre en charge le reste du processus et la mission du BIOS est terminée!

Mais avant de se terminer, il doit sauter à l'adresse 0x7c00 et l'instruction commence à s'exécuter à partir d'ici.

Hein? Je ne sais pas si vous avez remarqué que nous semblons avoir à nouveau traduit une langue magique précédente en mots pour adultes sans le savoir. Au début, nous avons dit:

Le BIOS transfère le contrôle au périphérique de stockage qui occupe le premier rang.

Alors, que signifie cette phrase? Autrement dit, le BIOS copie les 512 octets de la zone de démarrage vers l'emplacement 0x7c00 de la mémoire et utilise une instruction de saut pour pointer la valeur du registre pc sur 0x7c00 . Vous voyez, il n'y a plus que quelques mots, alors rendons la question claire et simple.

Oh, au fait, il semble qu'il reste une question maintenant, pourquoi faut-il que ce soit 0x7c00? Bonne question. Bien sûr, la réponse est très simple. C'est ainsi que l'équipe de développement du BIOS l'a fait, et ce ne sera pas facile à changer par la suite, sinon ce n'est pas compatible. Pourquoi n'est-il pas facile de changer? Regardons un simple code de 512 octets dans la zone de démarrage. (Le code est extrait de "30 jours de système d'exploitation personnalisé")

; hello-os
; TAB=4

  ORG  0x7c00   ;程序加载到内存的 0x7c00 这个位置

;程序主体

entry:
  MOV  AX,0   ;初始化寄存器
  MOV  SS,AX
  MOV  SP,0x7c00
  MOV  DS,AX   ;段寄存器初始化为 0
  MOV  ES,AX
  MOV  SI,msg
putloop:
  MOV  AL,[SI]
  ADD  SI,1
  CMP  AL,0   ;如果遇到 0 结尾的,就跳出循环不再打印新字符
  JE  fin
  MOV  AH,0x0e   ;指定文字
  MOV  BX,15   ;指定颜色
  INT  0x10   ;调用 BIOS 显示字符函数
  JMP  putloop
fin:
  HLT
  JMP  fin
msg:
  DB  0x0a,0x0a  ;换行、换行
  DB  "hello-os"
  DB  0x0a   ;换行
  DB  0    ;0 结尾

  RESB 0x7dfe-$   ;填充0到512字节
  DB 0x55, 0xaa   ;可启动设备标识

Nous regardons la première ligne:

ORG  0x7c00

Ce numéro est l'emplacement de chargement de la zone de démarrage qui vient d'être mentionnée. Cette ligne de code d'assemblage signifie simplement l'ajout de 0x7c00 à toutes les adresses ci-dessous. Juste parce que le BIOS charge le code de zone de démarrage ici, il y a un décalage, donc tous ceux qui écrivent le code de zone de démarrage doivent écrire un tel code au début, sinon tout sera sérialisé.

Et juste parce que tous ceux qui écrivent le système d'exploitation, la première ligne de code d'assemblage dans la zone de démarrage est morte avec ce numéro, le numéro initialement défini par le développeur du BIOS n'est pas facile à changer, sinon il faut contacter les développeurs de chaque système d'exploitation un par un., Dites oh, je vais changer cette adresse, et vous la modifierez en conséquence. Pousser une autre équipe pour changer un code dans l'entreprise doit être beaucoup de problèmes, pensez à la main-d'œuvre nécessaire pour une telle poussée. De plus, même s'il est modifié, le code précédent n'est plus compatible, ce qui ne doit pas être grondé par les gens.

Regardez à nouveau la dernière ligne:

DB 0x55, 0xaa

Cela vérifie également que les deux derniers octets des 512 octets que nous avons dit précédemment doivent être 0x55 0xaa, le BIOS le considérera comme une zone de démarrage, et le chargera, et rien de plus.

En repensant à la valeur de 0x7c00, il s'agit en fait d'une valeur réglementée, mais certaines personnes demanderont encore, elle doit avoir sa rationalité. En fait, mon explication ne peut que dire que les gens fixent cette valeur, et plus tard, les gens leur expliquent cette rationalité. Cela ne signifie pas que les gens doivent avoir pensé de cette façon au début, tout comme nous faisons des problèmes de compréhension de la lecture en chinois.

La première équipe de développement du BIOS était le BIOS IBM PC 5150. Le premier système d'exploitation considéré à l'époque était le système d'exploitation DOS 1.0, et l'équipe du BIOS a supposé qu'il le servait.

Mais le système d'exploitation n'est pas encore sorti et l'équipe du BIOS suppose que la mémoire minimale requise pour son système d'exploitation est de 32 Ko. Le BIOS espère que le code de zone de démarrage chargé par lui-même est aussi éloigné que possible, afin qu'il soit "sûr" et ne soit pas écrasé prématurément par d'autres programmes. Mais s'il ne reste que 512 octets, cela semble trop en surplomb et il reste encore de l'espace de pile à réserver, alors augmentez-le à 1 Ko. Ainsi, la fin de 32 Ko est 0x8000, moins 1 Ko (0x400), ce qui est exactement égal à 0x7c00. Wow, trop précis, cela peut être un moyen d'explication.

Sept, ce qui est écrit dans le code dans la zone de démarrage

En fait, à ce stade, mon article devrait s'arrêter brusquement, car le problème d'origine a été résolu et le processeur a commencé à fonctionner sans arrêt à partir de notre position attendue. Tout est difficile au début, et le reste est l'opération. le système peut jouer autant qu'il le souhaite.

Mais je ne pense pas que cela ait suffisamment de goût, et il semble y avoir des questions dans votre esprit. Par exemple, cette question:

Qu'est-ce qui est écrit dans le code dans la zone de lancement? Est-ce que 512 octets représentent l'intégralité du contenu du système d'exploitation?

C'est une bonne question. 512 octets ne peuvent vraiment rien faire. Maintenant, le système d'exploitation doit être compté en unités M. 512 octets, c'est loin d'être suffisant. Quel est le problème?

En fait, nous pouvons deviner d'après la pensée précédente que le BIOS charge le contenu de la zone de démarrage de 512 octets dans la mémoire avec très peu de code, et saute pour démarrer l'exécution. Selon cette routine, le code de zone de démarrage de 512 octets peut-il charger plus de programmes du système d'exploitation stockés sur le disque à un certain emplacement de la mémoire, puis y accéder?

C'est vrai, c'est la routine. Le BIOS est donc responsable du chargement de la zone de démarrage et la zone de démarrage est responsable du chargement du noyau du système d'exploitation réel .

Étant donné que le disque utilisé pour le disque de démarrage est créé par le fabricant qui écrit le système d'exploitation, communément appelé disque de démarrage, il doit également savoir dans quel secteur du disque le code de base du système d'exploitation est stocké, ce secteur est donc stockés dans la zone de démarrage, et après cela, de nombreux secteurs (en fonction de la taille du système d'exploitation) sont lus dans la mémoire, puis sautent au début du début du programme. Où allez-vous? Ce n'est pas aussi classique que le nombre 0x7c00. Les différents systèmes d'exploitation sont définitivement différents et il n'est pas nécessaire de le prédéterminer. Quoi qu'il en soit, la personne qui écrit le système d'exploitation peut en définir un pour elle-même. Ne pas couvrir la zone utilisée par d'autres appareils clés.

8. Qu'a écrit le noyau du système d'exploitation?

D'accord, maintenant après plusieurs séries de sauts et de sauts, pour enfin passer au code du noyau, examinons-le ensemble:

  1. Appuyez sur le bouton de mise sous tension et le CPU initialisera de force la valeur du registre PC à 0xffff0, qui est l'adresse d'entrée du programme BIOS (un saut)

  2. L'adresse d'entrée est une instruction de saut, saute à la position 0xfe05b et démarre l'exécution (deux sauts)

  3. Après avoir effectué quelques tests matériels, la dernière étape consiste à charger le contenu de la zone de démarrage dans la mémoire 0x7c00 et à y accéder (trois sauts)

  4. Le code de zone de démarrage sert principalement à charger le noyau du système d'exploitation et à sauter au point de chargement (quatre sauts)

Après ces quatre sauts consécutifs, je suis enfin arrivé au monde des systèmes d'exploitation. Le reste du contenu peut être considéré comme les principes décrits dans l'ensemble du cours sur le système d'exploitation, tels que la segmentation, la pagination, l'établissement d'interruptions, les pilotes de périphériques, la mémoire gestion et gestion des processus., Système de fichiers, interface du mode utilisateur, etc.

Vous avez peut-être entendu plus ou moins de ces termes dans les cours sur le système d'exploitation. Si vous l'apprenez bien, vous devez connaître les principes généraux. Mais pour un chien inconditionnel comme l'auteur qui a étudié le code source du noyau Linux du début à la fin, ces les concepts ne sont pas seulement des concepts ennuyeux dans les livres, mais flexibles et flexibles. Sur chaque ligne de code du système d'exploitation, certains témoignent de l'incomparable sagesse de l'auteur, et d'autres me laissent voir l'abandon de l'auteur en raison des paramètres matériels.

Si cet article éveille votre curiosité sur le système d'exploitation, je vous propose de trouver le temps de le lire, rejoignez-moi dans la fosse, vous constaterez que la porte d'un nouveau monde s'ouvre à vous

Neuf, matériaux de référence

Eh bien, cette fois, je veux vraiment y mettre fin, je crois que si vous lisez vraiment le texte intégral, on peut dire que le processus de démarrage de l'ordinateur a une compréhension plus concrète. Si vous voulez entrer dans les détails, c'est-à-dire comprendre chaque point de l'ensemble du processus, vous devez travailler dur.

Les débutants recommandent deux livres, qui peuvent être lus dans l'ordre. Je vous souhaite une fosse:

  • "Système d'exploitation personnalisé de 30 jours"

  • "Restauration de la vérité du système d'exploitation"

Finir

Programmation à faible concurrence, très décadente le lundi, hardcore le jeudi

Je suppose que tu aimes

Origine blog.csdn.net/coderising/article/details/113488638
conseillé
Classement