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, 09:58] 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 78: | Ligne 80: | ||
; Buffer pour chargement en mode LBA | ; Buffer pour chargement en mode LBA | ||
- | 00000005 resw 1 ; 0x0010 - taille paquet | + | 00000005 resw 1 ; 0x0010 - taille paquet |
00000007 resw 1 ; 0x0001 - nb blocs à transférer | 00000007 resw 1 ; 0x0001 - nb blocs à transférer | ||
00000009 resw 1 ; 0x0000 | 00000009 resw 1 ; 0x0000 | ||
Ligne 85: | Ligne 87: | ||
00000011 resd 1 ; 0x00000000 - démarrer au bloc 0x0000000000000001 | 00000011 resd 1 ; 0x00000000 - démarrer au bloc 0x0000000000000001 | ||
- | 00000004 BC007C mov sp,0x7c00 | ||
- | 00000007 8EC0 mov es,ax | ||
- | 00000009 8ED8 mov ds,ax | ||
- | 0000000B BE007C mov si,0x7c00 | ||
- | 0000000E BF0006 mov di,0x600 | ||
- | 00000011 B90002 mov cx,0x200 | ||
- | 00000014 FC cld | ||
- | 00000015 F3A4 rep movsb ; copie le secteur de 7C00-7DFF en 600-7FF | ||
- | 00000017 50 push ax | ||
- | 00000018 681C06 push word 0x61c | ||
- | 0000001B CB retf ; saute en 61c (contenu ci dessous) | ||
- | 0000001C FB sti | + | 0000005A 0080 dw 0x8000 ; Emplacement de l'offset où le contenu du tampon sera copié |
- | 0000001D B90400 mov cx,0x4 | + | 0000005C 01000000 dd 0x00000001 ; Adresse LBA (valeur basse) où se trouve le secteur suivant de chargement (core.img) |
- | 00000020 BDBE07 mov bp,0x7be ; pointe sur le début de la table des partitions | + | 00000060 00000000 dd 0x00000000 ; Valeur haute du qword de l'adresse LBA |
- | + | 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... | |
- | 00000023 807E0000 cmp byte [bp+0x0],0x0 | + | |
- | 00000027 7C0B jl 0x34 ; teste si marqueur "boot" | + | |
- | 00000029 0F851001 jnz word 0x13d ; ni boot ni zéro | + | |
- | 0000002D 83C510 add bp,byte +0x10 ; pointe sur partition suivante | + | |
- | 00000030 E2F1 loop 0x23 ; 4 boucles pour 4 partitions | + | |
- | 00000032 CD18 int 0x18 ; appelé si pas de partition de boot | + | |
- | 00000034 885600 mov [bp+0x0],dl | + | |
- | 00000037 55 push bp ; sauvegarde adresse (partition de boot) | + | |
- | 00000038 C6461105 mov byte [bp+0x11],0x5 | + | |
- | 0000003C C6461000 mov byte [bp+0x10],0x0 | + | |
- | 00000040 B441 mov ah,0x41 | + | |
- | 00000042 BBAA55 mov bx,0x55aa | + | |
- | 00000045 CD13 int 0x13 ; installation check | + | |
- | 00000047 5D pop bp | + | |
- | 00000048 720F jc 0x59 ; extension non supportée | + | |
- | 0000004A 81FB55AA cmp bx,0xaa55 ; | + | |
- | 0000004E 7509 jnz 0x59 ; extension non installée | + | |
- | 00000050 F7C10100 test cx,0x1 | + | |
- | 00000054 7403 jz 0x59 ; fonctions 42h-44h, 47h et 48h non supportées | + | |
- | 00000056 FE4610 inc byte [bp+0x10] | + | |
- | 00000059 66 | + | |
- | 0000005A 0080 | + | |
- | 0000005C 01000000 dd 0x00000001 ; Adresse LBA où se trouve le secteur suivant de chargement (core.img) | + | |
- | 00000060 00000000 dd 0x00000000 ; | + | |
- | 00000064 FF db 0xff | + | |
00000065 FA cli | 00000065 FA cli | ||
Ligne 142: | 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 210: | Ligne 176: | ||
; Convertit adresse linéaire en tête, secteur et cylindre | ; Convertit adresse linéaire en tête, secteur et cylindre | ||
- | 00000125 66A15C7C mov eax,[0x7c5c] ; charge l'adresse LBA de l'emplacement de core.img | + | 00000125 66A15C7C mov eax,[0x7c5c] ; charge l'adresse LBA de l'emplacement de core.img (valeur basse qword) |
00000129 6631D2 xor edx,edx ; met à zéro | 00000129 6631D2 xor edx,edx ; met à zéro | ||
- | 0000012C 66F734 div dword [si] ; division numéro secteur/nb secteurs par piste | + | 0000012C 66F734 div dword [si] ; divise l'adresse LBA par le nombre de secteurs par piste |
- | 0000012F 88D1 mov cl,dl ; reste de la division=numéro secteur | + | 0000012F 88D1 mov cl,dl ; reste de la division = numéro secteur (commencement à 0) |
00000131 31D2 xor dx,dx | 00000131 31D2 xor dx,dx | ||
00000133 66F77404 div dword [si+0x4] ; divise par le nombre de têtes - donne un nb de cylindres | 00000133 66F77404 div dword [si+0x4] ; divise par le nombre de têtes - donne un nb de cylindres | ||
- | 00000137 3B4408 cmp ax,[si+0x8] | + | 00000137 3B4408 cmp ax,[si+0x8] ; compare au nombre de cylindres du disque |
0000013A 7D37 jnl 0x173 ; supérieur au nombre de cylindres du disque - erreur | 0000013A 7D37 jnl 0x173 ; supérieur au nombre de cylindres du disque - erreur | ||
0000013C FEC1 inc cl ; rajoute 1 car les n°secteurs commencent à 1 | 0000013C FEC1 inc cl ; rajoute 1 car les n°secteurs commencent à 1 | ||
Ligne 234: | Ligne 200: | ||
0000015A 8CC3 mov bx,es | 0000015A 8CC3 mov bx,es | ||
+ | ; Copie des données chargées (partie commune mode CHS ou LBA) | ||
0000015C 60 pushaw | 0000015C 60 pushaw | ||
0000015D 1E push ds | 0000015D 1E push ds | ||
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 245: | Ligne 212: | ||
0000016D 1F pop ds | 0000016D 1F pop ds | ||
0000016E 61 popaw | 0000016E 61 popaw | ||
- | 0000016F FF265A7C jmp word near [0x7c5a]; saute en 0000:8000 (car 7c5a contient 8000) | + | 0000016F FF265A7C jmp word near [0x7c5a]; saute en 0000:8000 (car 7c5a contient 8000) - début de core.img |
Ligne 257: | Ligne 224: | ||
00000186 EBFE jmp short 0x186 ; boucle sans fin | 00000186 EBFE jmp short 0x186 ; boucle sans fin | ||
- | ; Chaines messages d'erreur | + | ; Chaînes messages d'erreur |
00000188 db "GRUB ",0 | 00000188 db "GRUB ",0 | ||
0000018E db "Geom",0 | 0000018E db "Geom",0 | ||
Ligne 275: | 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 | ||
+ | \\ | ||
+ | \\ | ||
+ | Différentes parties sont visibles : | ||
\\ | \\ | ||
- | 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 | ||
\\ | \\ | ||
+ | de 065 à 095 - Routine vérifie que le boot s'effectue à partir du disque dur | ||
\\ | \\ | ||
- | Différentes parties sont visibles | + | 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 004 à 01b - Routine qui recopie à une autre adresse le contenu du mbr - peut être en prévision du chargement d'un autre secteur. | + | |
\\ | \\ | ||
- | de 01c à 037 - Détermine la partition de boot | + | de 0b4 à 0e5 - Charge le premier secteur de core.img en mode LBA (interruption bios int13/ah=42h) |
\\ | \\ | ||
- | de 038 à 059 - Détermine si le bios reconnait le système d'adressage LBA | + | de 0e6 à 0f8 - Récupère les paramètres du disque et gère les erreurs |
\\ | \\ | ||
- | de 05c à 05f - Adresse LBA de core.img | + | de 0f9 à 124 - Sauvegarde ces paramètres dans la zone des paramètres de chargement |
\\ | \\ | ||
- | de 125 à 14a - Calcule les valeurs HSC à partir de la LBA | + | de 125 à 15b - Convertit l'adresse LBA de core.img dans le mode CHS et charge ce secteur dans le tampon (interruption bios int13/ah=02h) |
\\ | \\ | ||
- | de 14c à 158 - Charge un secteur | + | de 15c à 172 - Recopie le secteur chargé à son nouvel emplacement et saute à cet emplacement (première partie de core.img, soit diskboot.img) |
\\ | \\ | ||
- | de 173 à 186 - Gestion des erreurs | + | de 173 à 187 - Affichage des messages d'erreur |
\\ | \\ | ||
de 1ab à 1b0 - Affichage de caractères | de 1ab à 1b0 - Affichage de caractères | ||
\\ | \\ | ||
- | de 1b2 à 1b7 - Affichage des chaines des messages d'erreurs | + | de 1b2 à 1b7 - Affichage des chaînes des messages d'erreurs |
\\ | \\ | ||
===== Voir aussi ===== | ===== Voir aussi ===== | ||
\\ | \\ | ||
- | * **(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]] |