Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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]]
  
  
  • la_partie_executable_du_mbr.1474531119.txt.gz
  • Dernière modification: Le 22/09/2016, 09:58
  • par Nasman