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:38] 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 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 165: | Ligne 167: | ||
0000010D 88F4 mov ah,dh ; 2 bits de poids fort cylindre | 0000010D 88F4 mov ah,dh ; 2 bits de poids fort cylindre | ||
0000010F 40 inc ax ; nb de cylindres | 0000010F 40 inc ax ; nb de cylindres | ||
- | 00000110 894408 mov [si+0x8],ax ; sLa partie qui commence à l'adresse hexa 65 est commune avec le fichier boot.img qui se trouve dans /boot/grub/ | + | 00000110 894408 mov [si+0x8],ax ; sauvegardé en 7c0d |
- | \\ | + | |
- | auvegardé en 7c0d | + | |
00000113 0FB6C2 movzx ax,dl ; copie le numéro maxi de secteurs (x4) | 00000113 0FB6C2 movzx ax,dl ; copie le numéro maxi de secteurs (x4) | ||
00000116 C0E802 shr al,0x2 ; numéro maxi de secteurs=nb secteurs | 00000116 C0E802 shr al,0x2 ; numéro maxi de secteurs=nb secteurs | ||
Ligne 205: | 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 241: | Ligne 241: | ||
000001B5 75F4 jnz 0x1ab ; teste la fin de la chaine | 000001B5 75F4 jnz 0x1ab ; teste la fin de la chaine | ||
000001B7 C3 ret</code> | 000001B7 C3 ret</code> | ||
+ | \\ | ||
+ | <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 à l'adresse 065 | ||
Ligne 271: | 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]] |