Le stage 1 de GRUB

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.