CREER UNE ZONE DE "BOOT"





Prérequis :

Avant de commencer à étudier ce chapitre et les suivants il est recommandé de télécharger VirtualPC afin de tester la disquette de "boot" sans redémarrer à chaque fois votre ordinateur.
Pour cela rendez-vous à la page de téléchargements et de liens.




Créer une zone "bootable" est très facile à réaliser. Pour cela, il faut connaître certaines particularités, lesquelles sont :

  1. Le programme de "boot" doit être situé sur le premier secteur de la première piste de la première tête de lecture du média concerné,
  2. la longueur du programme de "boot" ne doit pas dépasser 512 octets,
  3. les deux derniers octets doivent correspondre à la valeur numérique : 0AA55h, qui est la signature d'un secteur de boot,
  4. le programme de "boot" sera chargé à l'adresse de segment : 7C00h

1) Où doit être implanté le programme de "boot" ?

Le BIOS  après qu'il ait effectué le POST, effectura la recherche d'un secteur "bootable" dans l'ordre suivant :
Sur les cartes mère modernes l'ordre d'exécution des médias peut être paramétré à travers le "setup".

Le secteur concerné est toujours celui situé à l'adresse 0 du média, c'est-à-dire :
2)  Quelle taille doit avoir le programme de "boot" ?

La taille du programme de "boot" dépend fortement de la taille du secteur. Il faut savoir que, quelque soit le média utilisé, ce dernier est décomposé en secteurs. Chaque secteur a une taille maximale de 512 octets. Par conséquent, le programme de "boot" ne devra pas dépasser la taille de 512 octets.

Le secteur de "boot" contiendra le code et les données nécessaires au lancement du noyau ("kernel") du programme principal (le système d'exploitation).

Les deux derniers octets de ce secteur devront correspondre à la signature numérique : 0AA55h. C'est grâce à cette valeur que le BIOS détermine un secteur de "boot".

3)  A quel adresse le programme de "boot" est-il chargé en mémoire ?

Un programme de "boot" sera toujours chargé à l'adresse de segment : 7C00h.

Exemple :

;Le programme ci-dessous est un programme de "boot".
;Au moment ou le BIOS détectera le secteur de "boot", il chargera ce programme
;à l'adresse 7C00h puis exécutera le programme.

;La chaîne de caractères qui sera affichée à l'écran est : "Hello World !"

;On utilisera l'injection directe dans la mémoire vidéo.

MonCode SEGMENT

    ORG 0h ;Calcul des "offsets" à partir du début du segment de "boot".

;--- Zone de code ---

Main:
   
;Adresse de segment pour les données.
    mov ax, 7C0h
    mov ds, ax

    ;Ecriture directement en mémoire vidéo.
    mov ax,0B800h
    mov es,ax    
    
    ;Mode vidéo 80 x 25
    xor ah, ah
    mov al, 2h
    int 10h    
    
    mov di, 7C2h ;La chaîne "Hello World !" est centrée.
    mov ah, 0Eh  ;Couleur jaune.
    mov si, OFFSET GoodMorning
    
    ;Affichage de la chaîne : "Hello World !" en jaune.
ShowHelloWorld:
    lodsb
    stosw
    or al, al
    jnz ShowHelloWorld    
    
    mov di, 0F58h ;Coin inférieur droit
    mov ah, 0Ah   ;Couleur verte.
    mov si, OFFSET PressAnyKey
    
    ;Affiche la chaîne : "Pressez une touche pour continuer..." en vert.
ShowPressAnyKey:
    lodsb
    stosw
    or al, al
    jnz ShowPressAnyKey    
    
    ;Cache le curseur.
    mov ah,2
    mov bh, 0
    mov dh,25
    mov dl, 80
    int 10h
    
    ;Attends l'appui sur une touche.
    xor ah, ah
    int 16h
    
    ;Efface l'écran.
    mov ah, 0Fh
    mov al, 0
    mov cx, 7D0h
    xor di, di
Clear:
    stosw
    loop Clear        
    
    mov di, 7C6h ;Centre la chaîne.
    mov ah, 9h ;Couleur bleu
    mov si, OFFSET ByeBye
    
    ;Affiche la chaîne : "Bye Bye !" en bleu.
ShowByeBye:
    lodsb
    stosw
    or al, al
    jnz ShowByeBye    
        
    ;Fin du programme.
TheEnd:
    jmp TheEnd
    
    ;--- Zone des données ---
    
    GoodMorning db "Hello World !",0
    PressAnyKey db "Pressez une touche pour continuer...",0
    ByeBye db "Bye Bye !",0
    
    ORG 510
    
    ;--- Signature du secteur de "boot" ---
    
    DW 0AA55h

MonCode ENDS

END Main

Compilation : ml /c boot.asm

Liage : link16 /tiny boot.obj

Fichier généré : boot.com d'une taille de 512 octets.

Création de la disquette de "boot" :

Avant d'enregistrer le programme sur le premier secteur, vérifiez que la disquette est au format FAT.
Debug étant une application MS-DOS, il ne reconnaîtra le secteur 0 seulement si la disquette a été formatée avec un format  qu'il connaît.

Effectuer autant de formatage de la disquette qu'il y aura de modification du premier secteur.
  1. Formatage de la disquette
  2. debug boot.com
  3. w 0D6A:0100 0 0 1
Explications des points 2 et 3 :

debug boot.com : debug charge le programme "boot.com" à l'adresse de segment : 0D6Ah et à l'offset 0100h

w 0D6A:0100 0 0 1 :
w signifie "write",
0D6A:0100 est l'adresse à partir de laquelle debug copiera 512 octets sur le premier secteur (secteur 0),
0 est le numéro du média concerné en l'occurence la disquette,
0 est le numéro du secteur sur lequel 512 octets seront copiés à partir de l'adresse 0D6A:0100, et
1 est le nombre de secteurs à copier soit, ici, 512 octets.

Ecrit (w) à partir de l'adresse mémoire (0D6A:0100) vers le lecteur de disquette (0), sur le premier secteur (0),  512 octets (1), le programme "boot.com".