Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
la_partie_executable_du_mbr [Le 22/09/2016, 11:31] Nasman [Exemple de zone exécutable d'un mbr] |
la_partie_executable_du_mbr [Le 20/12/2021, 19:22] (Version actuelle) wiki-corrector-bot passage de http à https sur les liens externes (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | |||
. | . | ||
{{tag> tutoriel mbr BROUILLON}} | {{tag> tutoriel mbr BROUILLON}} | ||
Ligne 5: | Ligne 6: | ||
====== Que trouve-t-on comme programme dans le mbr ====== | ====== Que trouve-t-on comme programme dans le mbr ====== | ||
- | Si vous êtes arrivés sur cette page par erreur, faites demi tour sans tarder car ici se trouve l'antre de la bête :-( - et il ne faut pas connaitre la peur car vous allez découvrir les entrailles de votre machine. 8-o | + | Si vous êtes arrivés sur cette page par erreur, faites demi tour sans tarder car ici se trouve l'antre de la bête :-( - où il ne faut pas connaître la peur car vous allez découvrir les entrailles de votre machine. 8-o |
\\ | \\ | ||
Le mbr est le premier secteur du disque chargé en mémoire lors du démarrage d'un ordinateur. Il a pour fonction principale de rechercher une partition où se trouve un système d'exploitation à lancer. | Le mbr est le premier secteur du disque chargé en mémoire lors du démarrage d'un ordinateur. Il a pour fonction principale de rechercher une partition où se trouve un système d'exploitation à lancer. | ||
Ligne 29: | Ligne 30: | ||
\\ | \\ | ||
Une fois le chargement terminé et sans erreur, l'exécution se poursuit à l'adresse 0000:7C00, et donc suit les instructions qui figurent dans le premier secteur du mbr | Une fois le chargement terminé et sans erreur, l'exécution se poursuit à l'adresse 0000:7C00, et donc suit les instructions qui figurent dans le premier secteur du mbr | ||
+ | \\ | ||
+ | <note tip>Lors d'un démarrage en mode UEFI avec un disque GPT, le mbr (protector) ne semble quasiment pas utilisé et seul l'emplacement de l'en-tête GPT est nécessaire (unique entrée de la table des partitions du mbr protector)</note> | ||
===== Comment accéder à ces informations ===== | ===== Comment accéder à ces informations ===== | ||
Ligne 60: | Ligne 62: | ||
J'ai effectué une analyse (partielle) du fonctionnement des différents morceaux mais des parties restent encore nébuleuses. | J'ai effectué une analyse (partielle) du fonctionnement des différents morceaux mais des parties restent encore nébuleuses. | ||
\\ | \\ | ||
- | Le programme utilise des fonctions du bios (seules fonctions disponible à ce stade du démarrage du PC) et je me suis servi de la liste des [[http://www.ctyme.com/intr/int.htm|interruptions]] | + | Le programme utilise des fonctions du bios (seules fonctions disponibles à ce stade du démarrage du PC) et je me suis servi de la liste des [[http://www.ctyme.com/intr/int.htm|interruptions]] |
établies par Ralph Brown. | établies par Ralph Brown. | ||
\\ | \\ | ||
Ligne 66: | Ligne 68: | ||
Voilà donc à quoi ressemble la chose. | Voilà donc à quoi ressemble la chose. | ||
\\ | \\ | ||
- | <code>; Programme chargé en 0000:7C00 | + | <code>; Programme 16 bits chargé en 0000:7C00 |
00000000 EB63 jmp short 0x65 | 00000000 EB63 jmp short 0x65 | ||
00000002 90 nop | 00000002 90 nop | ||
Ligne 89: | Ligne 91: | ||
0000005C 01000000 dd 0x00000001 ; Adresse LBA (valeur basse) où se trouve le secteur suivant de chargement (core.img) | 0000005C 01000000 dd 0x00000001 ; Adresse LBA (valeur basse) où se trouve le secteur suivant de chargement (core.img) | ||
00000060 00000000 dd 0x00000000 ; Valeur haute du qword de l'adresse LBA | 00000060 00000000 dd 0x00000000 ; Valeur haute du qword de l'adresse LBA | ||
- | 00000064 FF db 0xff ; 0xff pour le chargement du noyau à partir du disque dur | + | 00000064 FF db 0xff ; 0xff pour le chargement de core.img sur le disque de boot, si 0x80 premier disque dur, si 0x81 deuxième... |
00000065 FA cli | 00000065 FA cli | ||
Ligne 106: | Ligne 108: | ||
00000081 3CFF cmp al,0xff | 00000081 3CFF cmp al,0xff | ||
00000083 7402 jz 0x87 | 00000083 7402 jz 0x87 | ||
- | 00000085 88C2 mov dl,al ; si non égal à 0xff, sauvegardé dans dl | + | 00000085 88C2 mov dl,al ; si non égal à 0xff, sauvegardé dans dl - si core.img est sur un autre disque |
00000087 52 push dx | 00000087 52 push dx | ||
- | 00000088 BB1704 mov bx,0x417 | + | 00000088 BB1704 mov bx,0x417 ; adresse clavier |
- | 0000008B 802703 and byte [bx],0x3 | + | 0000008B 802703 and byte [bx],0x3 ; teste si une touche shift est activée |
0000008E 7406 jz 0x96 | 0000008E 7406 jz 0x96 | ||
00000090 BE887D mov si,0x7d88 ; pointe sur la chaine "GRUB" | 00000090 BE887D mov si,0x7d88 ; pointe sur la chaine "GRUB" | ||
Ligne 203: | Ligne 205: | ||
0000015E B90001 mov cx,0x100 | 0000015E B90001 mov cx,0x100 | ||
00000161 8EDB mov ds,bx ; charge le segment du buffer | 00000161 8EDB mov ds,bx ; charge le segment du buffer | ||
- | 00000163 31F6 xor si,si ; ds:di pointe sur 7000:0000 | + | 00000163 31F6 xor si,si ; ds:si pointe sur 7000:0000 |
00000165 BF0080 mov di,0x8000 | 00000165 BF0080 mov di,0x8000 | ||
00000168 8EC6 mov es,si ; es:di pointe sur 0000:8000 | 00000168 8EC6 mov es,si ; es:di pointe sur 0000:8000 | ||
Ligne 240: | Ligne 242: | ||
000001B7 C3 ret</code> | 000001B7 C3 ret</code> | ||
\\ | \\ | ||
- | La partie qui commence à l'adresse hexa 65 est commune avec le fichier boot.img qui se trouve dans /boot/grub/ | + | <note tip>L'emplacement de la LBA où se trouve core.img est indiquée en 5c (8 octets). |
+ | \\ | ||
+ | Ici nous avons la LBA qui vaut 1, soit le secteur qui suit le mbr. Dans le cas d'un partitionnement GPT cet emplacement est occupé par l'en-tête GPT et n'est plus disponible pour core.img. Il faudra donc mettre l'adresse LBA de la partition bios_boot pour le boot en mode bios sur un disque GPT</note> | ||
+ | \\ | ||
+ | Le programme chargé en mémoire à l'adresse 0000:7c00 commence par l'instruction jmp short 0x65 qui saute directement à l'adresse 065 | ||
+ | \\ | ||
\\ | \\ | ||
- | Le programme chargé en mémoire à l'adresse 0000:7c00 commence par l'instruction jmp short 0x65 qui saute directement dans la partie commune à boot.img | + | Différentes parties sont visibles : |
\\ | \\ | ||
\\ | \\ | ||
- | Différentes parties sont visibles | ||
de 065 à 095 - Routine vérifie que le boot s'effectue à partir du disque dur | de 065 à 095 - Routine vérifie que le boot s'effectue à partir du disque dur | ||
\\ | \\ | ||
de 096 à 0b3 - Définit l'emplacement des paramètres de chargement du prochain secteur et le mode CHS ou LBA selon les capacités du bios | de 096 à 0b3 - Définit l'emplacement des paramètres de chargement du prochain secteur et le mode CHS ou LBA selon les capacités du bios | ||
\\ | \\ | ||
- | de 0b4 à 0e5 - Charge le premier secteur de core.img en mode LBA (interruption bios int13/ah-42h) | + | de 0b4 à 0e5 - Charge le premier secteur de core.img en mode LBA (interruption bios int13/ah=42h) |
\\ | \\ | ||
de 0e6 à 0f8 - Récupère les paramètres du disque et gère les erreurs | de 0e6 à 0f8 - Récupère les paramètres du disque et gère les erreurs | ||
Ligne 269: | Ligne 275: | ||
\\ | \\ | ||
- | * **(fr)** [[http://fr.wikipedia.org/wiki/Master_boot_record]] | + | * **(fr)** [[https://fr.wikipedia.org/wiki/Master_boot_record]] |
- | * **(fr)**[[http://fr.wikipedia.org/wiki/Partition_de_disque_dur]] | + | * **(fr)**[[https://fr.wikipedia.org/wiki/Partition_de_disque_dur]] |
- | * [[http://forum.ubuntu-fr.org/viewtopic.php?id=390336]] sur le forum ubuntu-fr | + | * [[https://forum.ubuntu-fr.org/viewtopic.php?id=390336]] sur le forum ubuntu-fr |
- | * **(fr)**[[http://fr.wikipedia.org/wiki/Logical_block_addressing]] | + | * **(fr)**[[https://fr.wikipedia.org/wiki/Logical_block_addressing]] |