Question

J'écris un chargeur de démarrage et j'ai la plupart des détails, mais je ne sais pas pourquoi certains chargeurs de démarrage se repositionnent en mémoire avant de commencer le gros de leur exécution.

Quelqu'un peut-il expliquer cela?

Un exemple de ce comportement est le le chargeur de démarrage du noyau Linux v0.01 d'origine , qui contient le commentaire suivant:

  

boot.s est chargé à l'adresse 0x7c00 par les routines de démarrage du bios, et se déplace lui-même pour accéder à l'adresse 0x90000 et y saute.

Était-ce utile?

La solution

De l'article lié:

  

En pratique, le MBR contient généralement un chargeur de démarrage dont le but est de charger un autre chargeur de démarrage, qui se trouve au début de l’une des partitions. C'est souvent un programme très simple qui trouve la première partition marquée Active, charge son premier secteur dans la RAM et commence son exécution. Étant donné que, par convention, le nouveau chargeur de démarrage est également chargé sur l'adresse 7C00h, l'ancien chargeur peut avoir besoin de déplacer tout ou partie de lui-même vers un emplacement différent avant de le faire. En outre, ES: SI devrait contenir l'adresse dans la RAM de la table de partition et DL le numéro de lecteur d'amorçage. Casser de telles conventions peut rendre un chargeur de démarrage incompatible avec d’autres chargeurs de démarrage.

Autres conseils

CookieOfFortune est essentiellement correct (car il voulait déplacer quelque chose là où se trouvait le chargeur initial), mais ce n'était pas pour un deuxième chargeur, mais plutôt pour le noyau lui-même.

D'après ses commentaires:

  

Il charge ensuite le système à 0x10000,   en utilisant les interruptions du BIOS. Ensuite   désactive toutes les interruptions, déplace le   système jusqu’à 0x0000, passe à   mode protégé, et appelle le début de   système. Le système doit alors   Ré-initialiser le mode protégé dans   ses propres tables, et permettent   interrompt au besoin.

Il souhaite que le noyau soit situé à 0x0000 ... 0xKERNEL_SIZE-1, mais le chargeur de démarrage initial est actuellement à 0x7C00. Ainsi, si le noyau était supérieur à 32 Ko, il écraserait le chargeur de démarrage lors de son déplacement. Le fait que le noyau soit situé à 0x0000 explique également ce commentaire:

  

& NOTE; NOTE! actuellement le système est au plus   8 65536 octets de long. "

Si la longueur était supérieure à 512 Ko, en commençant à 0, vous courriez le risque de toucher la zone réservée de l'espace adresse x86.

Je crois que cette section de code contient le saut actuel dans le noyau

mov ax,#0x0001  | protected mode (PE) bit
lmsw    ax      | This is it!
jmpi    0,8     | jmp offset 0 of segment 8 (cs)

Parfois, le chargeur de démarrage est en ROM et doit être copié dans la RAM à un moment donné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top