AssembleurDéveloppement des secteurs de démarrageJean-Luc Antoine - 05/06/2002Cet article à pour but de vous faire comprendre toute la structure et l'utilité des secteurs de démarrage. Un secteur de démarrage (bootsector) est le premier secteur physique de la disquette. Il est constitué de toutes les informations essentielles pour le DOS sur la structure du disque, ainsi que d'un petit programme qui sera exécuté à l'allumage de la machine et permettant de lancer tout le système d'exploitation. Comme tout secteur, sa taille est de 512 octets. Chaque système d'exploitation a sa structure de disque différente; nous nous contenterons de survoler brièvement celle du DOS. En fait, quand vous allumez votre micro, le BIOS (programme en ROM, sur la carte mère) effectue une initialisation système de très bas niveau, puis charge le bootsecteur en RAM (adresse 0:7C00h) et lui passe le relai. Le programme exécutable stocké dans le bootsecteur doit donc tester si le système d'exploitation est présent; si c'est le cas il le charge, sinon il envoie un message d'erreur ou bien charge le Basic de la ROM. Structure d'un bootsector: Octets 0 à 2: Code de saut à la routine de démarrage 3..10: Nom du constructeur ou version du DOS 11,12: Nombre d'octets par secteur 13: Nombre de secteurs par cluster 14,15: Nombre de secteurs réséervés au début de la partition 16: Nombre de tables d'allocation de fichiers (FAT) 17,18: Nombre d'entrées dans le répertoire principal 19,20: Nombre total de secteurs sur le disque ou 0 si capacité>32 Mo 21: Code d'identification du disque: FFh: disquette double face, huit secteur/piste FEh: disquette simple face, huit secteurs/piste FDh: disquette double face, neuf secteurs/piste FCh: disquette simple face, neuf secteurs/piste F9h: disquette double face, 15 secteurs/piste F8h: disque dur F0h: autre 22,23: Nombre de secteurs par FAT 24,25: Secteurs par piste 26,27: Nombre de têtes 28..31: Nombre de secteurs cachés 32..35: Nombre de secteurs si la capacité du disque est > 32 Mo 36: Numéro du disque 37: Réservé 38: Signature de boot étendu: 29h 39..42: Numéro de série du volume 43..53: Nom du volume 54..61: Type de système de fichiers (FAT12=FAT de 12 bits, FAT16=FAT à 16 bits) 62..510: Routine de démarrage 511,512: AA55h si le disque possède un bootsector exécutableSi vous ne bootez pas depuis une disquette mais depuis un disque dur, c'est le secteur de partition qui sera en premier chargé; le code exécutable (il se situe dans les 446 premiers octets) va à son tour charger le secteur de démarrage après multes vérifications. Par convention, un bootsecteur sera exécutable si la signature AA55h est présente dans le dernier mot du secteur. Structure de la table de partition: Offset 0: Type de partition: 80h=bootable, 00h=non bootable 1: Première page de la partition 2: Secteur de début 3: Cylindre de départ 4: Nom du système de fichiers: 0=inconnu 1=FAT12 2=XENIX 3=XENIX 4=FAT16 (partition<32Mo) 5=partition DOS étendue 6=FAT16 (partition >= 32Mo) DBh=concurrent DOS 5: Dernière page de la partition 6: Secteur de fin 7: Cylindre de fin 8..11: Secteur de départ (nombre de secteurs précédant la partition, relatif au début du disque) 12..15: Nombre de secteurs dans la partitionCette table se situe dans le premier secteur physique d'un disque dur, à l'Offset 01BEh pour la quatrième partition, 1CEh pour la troisième, 1DEh pour la seconde et en 1EEh pour la première. La signature AA55h est à l'Offset 01FEh Les 1BDh premiers octets sont constitués de code exécutable.
Etant donné que le bootsecteur est exécuté directement à partir de l'adresse à laquelle il a été chargé, et que les données sur la structure du disque sont situées dans les 3Eh premiers octets, le premier code rencontré devra absolument être un JUMP vers l'adresse 3Eh à laquelle continue le programme. Il peut arriver que 446 octets ne soient pas suffisants pour contenir la routine boot strap. Dans ce cas on indique à l'offset 15 le nombre de secteurs réservés pour la routine (ils seront situés directement après le bootsecteur). Voici donc le programme commenté: .286C ;Code de bootsecteur permettant de booter sur le dur, (c) Digit Code SEGMENT BYTE ASSUME CS:Code,DS:Code drive EQU 80h ;pour le lecteur C: START: XOR AX,AX CLI MOV SS,AX MOV SP,7C00h ;On crée une pile STI MOV SI,SP MOV ES,AX MOV DS,AX CLD MOV DI,0600h MOV CX,256 ;512 octets REP MOVSW ;On copie 512 octets de 0000:7C00h vers 0000:0200h MOV DI,5 ;5 essais pour lire le secteur MOV AX,Offset boucle ADD AX,63Eh ;adresse à laquelle on a copié (en 600+Offset du prog) JMP AX ;On continue à exécuter dans notre copie boucle: MOV BX,7C00h ;Chargement du secteur de partition du dur PUSH 0000h POP ES XOR DH,DH MOV DL,drive ;tete numero 0 lecteur C (pour le D mettre 81h) MOV CX,0001h ;cylindre 0 et secteur 1 MOV AX,0201h ;Lecture d'un secteur en ES:BX INT 13h JNC suite XOR AX,AX INT 13h ;On reinitialise en cas d'erreur DEC DI JNZ boucle INT 19h ;On reboot après les essais (erreur) suite: JMP BX ;en 7C00h=secteur de partition chargé Code ENDS ;Voilà, c'est fini... END STARTBon, j'ai pitie, on arrete ici, on verra la suite la prochaine fois. |
|||||
![]()
|
|