Le boot code contenu dans le MBR pour le GRUB s’appelle GRUB Stage1 MBR Code. On peut voir le code source assembleur dans le fichier boot.S (qui s’appelait auparavant stage1.S).
Voici une capture de code en hexadécimal.
Le code assembleur de GRUB est placé dans les 446 octets avec un décalage 0000:7C00.
L’explication des instructions de stage 1
- Les 3 premiers octets représentent les instructions suivantes:
7C00 EB48 JMP 7C4A ; Jump (short) over BPB data 7C02 90 NOP ; area to main body of code.
Un jump vers les instructions d’exécution qui commencent a partir du décalage 0000:7C4A.
- Les 59 octets suivants sont réservés au BPB (BIOS Parameter Block) qui stockent des informations utilisées par la suite, comme le mode de disque, la partition qui lance le stage 2 (/boot/grub), …etc).
- On a la commande CLI (Clear Interrupt Flag) suivie par 2 NOP dans certaines versions comme la version 0.94 et 0.95, en anticipation du changement de cette commande dans le future code sur 3 octets.
7C4A FA CLI
- Ensuite, on a un jump vers le décalage 0000:7C00.
7C4B EA507C0000 JMP 0000:7C50 ; Long Jump to the next instruction ; because some bogus BIOSes jump to ; 07C0:0000 instead of 0000:7C00.
- Cette partie de code à partir de décalage 0000:7C50 jusqu’au décalage 0000:7C83 pour afficher quelques informations sur le GRUB et faire des testes de mode pour faire un jump vers le code associé au mode trouvé.
7C50 31C0 XOR AX,AX 7C52 8ED8 MOV DS,AX 7C54 8ED0 MOV SS,AX 7C56 BC0020 MOV SP,2000 7C59 FB STI 7C5A A0407C MOV AL,[7C40] ; <<<<<<<< Boot Drive 7C5D 3CFF CMP AL,FF 7C5F 7402 JZ 7C63 7C61 88C2 MOV DL,AL 7C63 52 PUSH DX 7C64 BE767D MOV SI,7D76 ; --> "GRUB " 7C67 E83401 CALL 7D9E ; Display GRUB ID on screen. 7C6A F6C280 TEST DL,80 7C6D 7454 JZ 7CC3 7C6F B441 MOV AH,41 ; Function 41h of INT13 7C71 BBAA55 MOV BX,55AA 7C74 CD13 INT 13 ; Test for INT13 Extensions 7C76 5A POP DX 7C77 52 PUSH DX 7C78 7249 JC 7CC3 ; If CF = 1, something wrong ; with test, so use CHS Mode. 7C7A 81FB55AA CMP BX,AA55 7C7E 7543 JNE 7CC3 ; If ZF = 0, INT13 Extensions ; failed, so use CHS Mode. 7C80 A0417C MOV AL,[7C41] ; <<<< Force LBA mode byte 7C83 84C0 TEST AL,AL 7C85 7505 JNZ 7C8C 7C87 83E101 AND CX,+01 7C8A 7437 JZ 7CC3
- Les instructions suivantes sont pour le mode LBA (accès linéaire à tous les secteurs du disque dur, en partant de zéro).
7C8C 668B4C10 * MOV ECX,[SI+10] 7C90 BE057C MOV SI,7C05 ; <<<<<< Setup "Disk Packet" for Extended Read. 7C93 C644FF01 MOV BYTE PTR [SI-01],01 7C97 668B1E447C * MOV EBX,[7C44] ; <<<<<<< Location of Stage2 code from the beginning of the partition (the offset is in number of sectors). 7C9C C7041000 MOV WORD PTR [SI],0010 7CA0 C744020100 MOV WORD PTR [SI+02],0001 7CA5 66895C08 * MOV [SI+08],EBX 7CA9 C744060070 MOV WORD PTR [SI+06],7000 7CAE 6631C0 * XOR EAX,EAX 7CB1 894404 MOV [SI+04],AX 7CB4 6689440C * MOV [SI+0C],EAX 7CB8 B442 MOV AH,42 ; Function 42h of INT13 7CBA CD13 INT 13 ; Extended Read (using ; Disk Address Packet). 7CBC 7205 JC 7CC3 ; If LBA not supported, ; go to CHS mode only. 7CBE BB0070 MOV BX,7000 7CC1 EB7D JMP 7D40
- Les instructions suivantes sont pour le mode CHS (Cylindres/Têtes/Secteur, anciens mode d’accès aux disques durs).
7CC3 B408 MOV AH,08 ; Function 08 of INT13 7CC5 CD13 INT 13 ; Get Drive Parameters 7CC7 730A JNB 7CD3 7CC9 F6C280 TEST DL,80 ; Tests if HDD exists. 7CCC 0F84F300 * JZ 7DC3 ; Therefore, this jump is ; never taken unless grub was installed on and running from a floppy ; disk. And only then will you find more executable code at 7DC3. ; In the source code file (stage1.S), you'll find this short comment ; about the extra code: "Kinda sneaky, huh?" 7CD0 E98D00 JMP 7D60 ; There was an HDD Error! 7CD3 BE057C MOV SI,7C05 <<<<<< "Disk Packet" 7CD6 C644FF00 MOV BYTE PTR [SI-01],00 7CDA 6631C0 * XOR EAX,EAX ; Save number of heads: 7CDD 88F0 MOV AL,DH 7CDF 40 INC AX 7CE0 66894404 * MOV [SI+04],EAX 7CE4 31D2 XOR DX,DX 7CE6 88CA MOV DL,CL 7CE8 C1E202 * SHL DX,02 7CEB 88E8 MOV AL,CH 7CED 88F4 MOV AH,DH ; Save number of cylinders: 7CEF 40 INC AX 7CF0 894408 MOV [SI+08],AX 7CF3 31C0 XOR AX,AX 7CF5 88D0 MOV AL,DL 7CF7 C0E802 * SHR AL,02 ; Save number of sectors: 7CFA 668904 * MOV [SI],EAX 7CFD 66A1447C * MOV EAX,[7C44] <<<<<< Location of Stage2 code from the beginning of the partition (the offset is in number of sectors). 7D01 6631D2 * XOR EDX,EDX 7D04 66F734 * DIV WORD PTR [SI] ; Double word here. 7D07 88540A MOV [SI+0A],DL 7D0A 6631D2 * XOR EDX,EDX 7D0D 66F77404 * DIV WORD PTR [SI+04] ; Double word here. 7D11 88540B MOV [SI+0B],DL 7D14 89440C MOV [SI+0C],AX 7D17 3B4408 CMP AX,[SI+08] 7D1A 7D3C JGE 7D58 ; There was a Geometry Error! 7D1C 8A540D MOV DL,[SI+0D] 7D1F C0E206 * SHL DL,06 7D22 8A4C0A MOV CL,[SI+0A] 7D25 FEC1 INC CL 7D27 08D1 OR CL,DL 7D29 8A6C0C MOV CH,[SI+0C] 7D2C 5A POP DX 7D2D 8A740B MOV DH,[SI+0B] 7D30 BB0070 MOV BX,7000 7D33 8EC3 MOV ES,BX 7D35 31DB XOR BX,BX 7D37 B80102 MOV AX,0201 ; Function 02 of INT13 7D3A CD13 INT 13 ; Read 1 sector into Memory 7D3C 722A JB 7D68 ; There was a Read Error! 7D3E 8CC3 MOV BX,ES
- Ici les instructions qui permettent de passer au stage 2 de GRUB (0000:7D53).
7D40 8E06487C MOV ES,[7C48] ; <<<<<<<< WORD [0800 hex] ; Note: 800:0000 = 0000:8000 7D44 60 * PUSHA 7D45 1E PUSH DS 7D46 B90001 MOV CX,0100 7D49 8EDB MOV DS,BX 7D4B 31F6 XOR SI,SI 7D4D 31FF XOR DI,DI 7D4F FC CLD 7D50 F3A5 REP MOVSW 7D52 1F POP DS 7D53 61 * POPA 7D54 FF26427C JMP [7C42] ; WORD <<< 8000 hex. ; "stage2_address"
- Cette partie contient les fonctions qui affichent les différentes erreurs rencontrées durant l’exécution s’il y a des erreurs.
7D58 BE7C7D MOV SI,7D7C ; --> "Geom Error" 7D5B E84000 CALL 7D9E ; Display it on screen. 7D5E EB0E JMP 7D6E ; Finish it and 'lock-up' 7D60 BE817D MOV SI,7D81 ; --> "Hard Disk Error" 7D63 E83800 CALL 7D9E ; Display it on screen. 7D66 EB06 JMP 7D6E ; Finish it and 'lock-up' 7D68 BE8B7D MOV SI,7D8B ; --> "Read Error" 7D6B E83000 CALL 7D9E ; Display it on screen. 7D6E BE907D MOV SI,7D90 ; (For displaying " Error") 7D71 E82A00 CALL 7D9E ; Finish it and 'lock-up' 7D74 EBFE JMP 7D74 ; Locks-up execution in an ; infinite loop! You must ; reboot your computer!
- L’emplacement des messages d’erreurs.
6 7 8 9 A B C D E F 7D76 47 52 55 42 20 00 47 65 6F 6D GRUB .Geom 7D80 00 48 61 72 64 20 44 69 73 6B 00 52 65 61 64 00 .Hard Disk.Read. 7D90 20 45 72 72 6F 72 00 Error. 0 1 2 3 4 5 6
- Une boucle qui parcourt les caractères pour afficher un message.
7D97 BB0100 MOV BX,0001 7D9A B40E MOV AH,0E ; Function 0Eh of INT 10h 7D9C CD10 INT 10 ; Display the character 7D9E AC LODSB 7D9F 3C00 CMP AL,00 7DA1 75F4 JNZ 7D97 ; Loop until finding a zero byte. 7DA3 C3 RET
- L’emplacement des partitions physiques de MBR et la signature de la fin de MBR 0x55AA.
E F 7DBE 80 01 ................ 7DC0 01 00 07 FE FF 6D 3F 00 00 00 AF 39 D7 00 00 00 .....m?....9.... 7DD0 C1 6E 0C FE FF FF EE 39 D7 00 BD 86 BB 00 00 FE .n.....9........ 7DE0 FF FF 83 FE FF FF AB C0 92 01 CD 2F 03 00 00 FE .........../.... 7DF0 FF FF 0F FE FF FF 78 F0 95 01 83 AF CC 00 55 AA ......x.......U. 0 1 2 3 4 5 6 7 8 9 A B C D E F
Références
- All the Details of many versions of both MBR (Master Boot Records) and OS Boot Sectors (also called: Volume Boot Records)
- CEIC 2013 UEFI, MBR and GPT oh my!
- GUID Partition Table
- Structure du MBR et des tables des partitions sur le disque dur
Vincent Bonnevalle, Djamal Checkroun, Hugo Pompougnac, Julien Rolland, Slimane Siroukane