Assembleur

Développement des secteurs de démarrage

Jean-Luc Antoine - 05/06/2002

Cet 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écutable
Si 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 partition
Cette 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).
Nous savons à présent que dans le cas d'un disque dur, le code du secteur de partition est chargé en premier, et c'est lui qui devra prendre en main le lancement du secteur d'amorçage. Or celui-ci est exécuté par convention depuis l'adresse 0000:07C00h, tout comme le secteur de partition. La marche à suivre sera donc de recopier le code vers l'adresse 0000:0600h (on n'écrase rien à cet endroit), de continuer à exécuter la routine depuis cette portion de code copiée, et enfin de charger le secteur d'amorçage en 0:7C00h et de continuer l'exécution à cet endroit.
Selon ce principe, il est facile d'imaginer la création d'un bootsecteur permettant de booter l'ordinateur en laissant une disquette non système à l'intérieur: son bootsecteur contiendrait un petit programme qui doit recopier son code en 0:600h, s'y transférer, charger le secteur de partition du disque dur et l'exécuter, donc exactement comme si le bios n'avait pas détecté de disquette dans le lecteur. Attention! Il est strictement interdit d'utiliser les interruptions du DOS car celui-ci n'étant pas encore chargé, ses interruptions ne sont pas actives.
Notre programme doit donc être compilé en fichier COM (faire tasm pour le compiler, puis tlink et ensuite EXE2BIN) et le source ne doit pas contenir la directive ORG 100h (car le programme ne sera pas chargé après un PSP). Une fois compilé, il doit être inséré dans le bootsecteur à l'offset 3Eh. Vérifier également le Jump à l'offset 0 qui doit pointer sur 3Eh, ainsi que la présence de la signature AA55h en fin de secteur. Pour l'activer, il faut se debrouiller pour l'installer comme il faut sur le bootsecteur, mais ca je vous le montrerai dans le prochain numéro.
Vous pouvez également créer votre propre secteur boot, mais veuillez à ce que la taille du programme compilé ne dépasse pas 446 octets. Il est conseillé d'effectuer une sauvegarde de l'ancien secteur avant d'en installer un nouveau, car une mauvaise manipulation peut avoir des conséquences vraiment fâcheuses. Soyez sûr de vous avant de vous amuser avec le bootsecteur de votre disque dur, car dans ce cas vous risquez de perdre entièrement tout son contenu.

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     START
Bon, j'ai pitie, on arrete ici, on verra la suite la prochaine fois.
Server Info
Remote Info
Compress

Batchs
BootSector
Droit
Accessoire GFA
On Now
Ecran plasma
Système d'exploitation
Son
Unités
Scripting
Multilingue
Site Web
Bruit et son
Architecture Google


4K
Color picker
TaskList
Backup files
Mini Port Scanner
Website To CHM
PixyDemo
Web password recovery
4KWebServer
Kill Popup
VBE decoder
Script Optimizer
Database Password Recovery
Class
Ini
EMail validator
Graphical Class
MP3 Info
Pinger Class
IP ranger class
SoftwareMetering
Path Validator
Time Stamper Class
LoggerCLS
HTA
Keyword Ranking
DOM Explorer
HTA-Notepad
PixyPortManager
Other
flashMessage
Kill Popup
VBE decoder (fixed)
Error Codes
Maze generator
Char counter
HTML To Word
ICQ Choose User
ScreenSaver Password decoder
Mp3Playlister - singleList
Long Filename To Short
Trace Math
Dump Hexa File
Self modifying script
Mp3Playlister - multiList
HTANoid
PixyWebServer
Python
Progress indication

©2002 Jean-Luc Antoine. All Rights Reserved. Scripts or any other material on this website may not be redistributed or put as part of ANY collection (script archives, CDs etc) without prior written permission. Permission granted to use and modify any of the scripts found on InterClasse.com