Entreposage de masse DOS
De nombreuses tâches effectuées par DOS ne sont pas vues par l'utilisateur. C'est pourquoi certains utilisateurs sous-estiment la complexité du DOS. Par exemple, DOS nécessite de nombreuses structures de données pour gérer un périphérique d'entreposage de masse, et l'utilisateur peut ne pas s'en rendre compte. Cette page approfondit le DOS et révèle l'architecture et le fonctionnement de ces structures de données.
Du point de vue de l'utilisateur, DOS traite les périphériques d'entreposage de masse comme des volumes où chaque volume individuel s'est vu attribuer une lettre. Les unités de disquettes sont identifiés par les lettres A et B, tandis que les lettres C ou D identifient généralement un disque dur. Un périphérique d'entreposage de masse peut avoir plusieurs volumes. Cette division en plusieurs volumes ou partitions est très pratique pour les disques durs. Les partitions sur disquette ne fonctionnent pas aussi bien en raison de la quantité limitée d'espace d'entreposage. Un disque dur peut être divisé en partitions supplémentaires si UNIX (ou XENIX) est utilisé en plus de DOS. Chacun des deux systèmes d'exploitation possède alors son propre volume étant également désigné par sa propre lettre.
Noms des volumes
Chaque volume peut se voir attribuer un nom de volume lors de sa création, mais ce nom de volume n'est pas obligatoire. La commande DIR répertorie les noms de volume lorsqu'ils sont disponibles. Chaque volume possède son propre répertoire racine, pouvant contenir plusieurs sous-répertoires et fichiers. Ces sous-répertoires et fichiers peuvent être maintenus et manipulés en utilisant une ou plusieurs des fonctions d'interruption 21h.
Secteurs
Le DOS subdivise chaque volume en une série de secteurs. Ces secteurs sont organisés séquentiellement. Chaque secteur contient un nombre spécifique d'octets (généralement 512) et se voit attribuer un numéro consécutif commençant par le secteur 0. Étant donné que les appels de fonction avec l'interruption 21h sont dirigés vers des fichiers plutôt que vers des secteurs individuels, DOS convertit ces accès aux fichiers en accès aux secteurs. Pour ce faire, DOS utilise des répertoires et une structure de données connue sous le nom de FAT (table d'allocation de fichiers). Une fois que le numéro de secteur souhaité a été déterminé, le contrôle est passé au pilote de périphérique traduisant ce numéro de secteur en une adresse physique. Les périphériques d'entreposage de masse tels que les disquettes et les disques durs sont divisés en pistes individuelles contenant un certain nombre de secteurs. En plus du numéro de secteur physique, le pilote doit également déterminer le numéro de la piste et le numéro de la tête de lecture.
↓ Numéro de secteur | Nom du fabricant, pilote de périphérique, routine de démarrage |
Table d'allocation des premiers fichiers (FAT) | |
Une ou plusieurs copies de FAT | |
Répertoire racine avec les noms de volume. | |
Registre de données pour les fichiers et sous-répertoires |
Comme mentionné ci-dessus, chaque volume est divisé en différentes zones contenant les différentes structures de données DOS et les fichiers individuels. Étant donné que la taille des zones individuelles peut différer selon le type de périphérique d'entreposage de masse (et le fabricant), chaque volume contient un secteur de démarrage. Le secteur d'amorçage contient toutes les informations nécessaires pour accéder aux différentes zones et structures de données. Le DOS crée ce secteur lors du formatage du disque. Les secteurs de démarrage ont toujours la même structure et sont toujours situés dans le secteur 0 afin que DOS puisse le trouver et l'interpréter correctement.
L'illustration suivante montre la disposition du secteur d'amorçage.
Déplacement | Description | Taille | |
---|---|---|---|
00(h) | Passer la commande à la routine de démarrage (E9xxx ou EBxx90) | 3 octets | |
03(h) | Nom du fabricant et numéro de version | 8 octets | |
0B(h) | Octets par secteur | 1 mot | BPB |
0D(h) | Secteurs par unité d'allocation | 1 octet | |
0E(h) | Nombre de secteurs réservés | 1 mot | |
10(h) | Nombre de FAT | 1 octet | |
11(h) | Nombre d'entrées dans le répertoire racine | 1 mot | |
13(h) | Nombre de secteurs en volume | 1 mot | |
15(h) | Descripteur de média | 1 octet | |
16(h) | Nombre de secteurs par FAT | 1 mot | |
18(h) | Secteurs par piste | 1 mot | |
1A(h) | Nombre de têtes de lecture/écriture | 1 mot | |
1C(h) | Nombre de secteurs cachés | 1 mot | |
1E(h) à 1FF(h) | ROUTINE DE DÉMARRAGE |
Secteur de démarrage
Le nom de secteur de démarrage vient du fait que DOS démarre (c'est-à-dire démarre) à partir de celui-ci. Le DOS est chargé et démarré à partir du disque, il n'est généralement pas stocké dans la mémoire permanente du PC (ROM). Après avoir allumé l'ordinateur, le BIOS prend en charge l'initialisation du système et charge le secteur logique 0 de la disquette ou du disque dur en mémoire. Une fois qu'il a terminé son travail, le BIOS démarre l'exécution à l'adresse 0.
Le secteur d'amorçage contient toujours une instruction JUMP en langage assembleur à l'adresse 0. Après l'exécution, le programme continue à un emplacement plus loin dans le secteur d'amorçage. Cette instruction peut être soit une instruction de saut normal, soit un "saut court". Étant donné que le champ de cette instruction de saut a une longueur de 3 octets, mais qu'un "saut court" ne nécessite que 2 octets, une instruction NOP (pas d'opération) suit toujours le "saut court" pour remplir l'octet supplémentaire. Ce NOP ne fait rien. Suivent une série de champs contenant certaines informations sur l'organisation des médias. Le premier champ est long de 8 octets et contient le nom du fabricant, où ce support a été formaté, ainsi que le numéro de version DOS ayant effectué le formatage. Les champs suivants contiennent le format physique du support (c'est-à-dire le nombre d'octets par secteur, le nombre de secteurs par piste,...) et la taille des structures de données DOS entreposées sur le support. Étant donné que les fonctions BIOS et DOS-BIOS représentent le niveau d'accès le plus bas aux unités de disque et aux disques durs, cette zone est également désignée comme bloc de paramètres BIOS (BPB). Trois champs supplémentaires, pouvant fournir des informations supplémentaires au pilote de périphérique sur le support, suivent le BPB ; ces trois champs ne sont pas utilisés directement par DOS.
Amorçage
Vient ensuite la routine d'amorçage à laquelle l'instruction de saut se branche au début de ce secteur d'amorçage. Il gère le chargement et le démarrage de DOS via les composants individuels du système.
Plusieurs secteurs réservés peuvent suivre le secteur d'amorçage. Ces secteurs réservés peuvent contenir du code d'amorçage supplémentaire. Les numéros de ces secteurs sont enregistrés dans le BPB dans le champ commençant à l'adresse 0Eh. Il termine le secteur de démarrage et un 1 dans ce champ indique qu'aucun secteur réservé supplémentaire ne suit le secteur de démarrage (c'est le cas pour la plupart des PC).
Pour que DOS puisse ajouter de nouveaux fichiers ou agrandir des fichiers existants, il doit savoir quels secteurs du média sont encore disponibles. Ces informations sont contenues dans une structure de données appelée FAT (table d'allocation de fichiers) étant immédiatement adjacente à la zone réservée du média. Chaque entrée dans la FAT correspond à un certain nombre de secteurs logiquement contigus, appelés unités d'allocation, sur le support. L'emplacement 0Dh du secteur d'amorçage spécifie le nombre de secteurs par unité d'allocation dans le cadre de la table des paramètres du BIOS. Seuls les multiples de 2 sont des valeurs légales. Sur un disque dur XT, cet emplacement contient la valeur 8 (8 secteurs consécutifs forment un unité d'allocation). Comme le montre le tableau suivant, le nombre de secteurs composant un unité d'allocation dépend du support d'entreposage :
Périphérique | Secteur par unité d'allocation |
---|---|
Unité de disque simple face | 1 |
Unité de disque double face | 2 |
Disque dur AT | 4 |
Disque dur XT | 8 |
La raison pour joindre plusieurs secteurs dans un unité d'allocation est dérivée de la logique utilisée par DOS pour écrire des fichiers sur un support. Il désassemble le fichier pour ajuster les pièces dans les secteurs étant encore disponibles, au lieu de sélectionner des secteurs adjacents pour l'entreposage du fichier. Ce processus ralentit l'accès aux fichiers puisque la tête de lecture/écriture doit être repositionnée après presque chaque fonction de lecture. Pour éviter un désassemblage excessif du fichier, le DOS rassemble plusieurs secteurs séquentiels sur le support dans un unité d'allocation. Cela garantit qu'au moins les secteurs d'un unité d'allocation contiennent une partie d'un fichier. Si DOS n'utilisait pas d'unités d'allocations, un fichier de 24 secteurs pourrait être entreposé dans de nombreux secteurs séparés, ce qui nécessiterait que la tête de lecture/écriture soit positionnée au maximum 24 fois pour lire l'intégralité du fichier. Le principe de l'unité d'allocation fait gagner beaucoup de temps, puisque le fichier est entreposé en 6 unités d'allocation et la tête de lecture/écriture ne doit être repositionnée que 6 fois.
Il y a un problème cependant. Puisqu'un fichier se voit attribuer au moins un unité d'allocation, une partie de l'espace d'entreposage est gaspillée. Considérez que l'AUTOEXEC.BAT ne dépasse généralement pas 150 octets. Normalement, un seul secteur peut contenir ce fichier (et gaspiller encore près de 400 octets), mais AUTOEXEC.BAT occupe un unité d'allocation de 2048 octets sur un AT, ce qui gaspille plus de 1,5 Ko d'espace disque.
Revenons maintenant à la table d'allocation de fichiers :
La taille des entrées individuelles dans le FAT sous les versions DOS 1 et 2 est de 12 bits. Pour DOS version 3 et versions ultérieures, la taille d'une entrée dans la FAT dépend du nombre des unités d'allocation : si un volume a plus de 4 096 unités d'allocation, alors chaque entrée FAT est de 16 bits ; sinon chaque entrée FAT est de 12 bits. Le nombre de bits par entrée FAT doit être déterminé avant l'accès au fichier. Les informations du bloc de paramètres du BIOS sont utilisées à cette fin. Le nombre total de secteurs dans le volume peut être trouvé à partir de l'emplacement 13H. Divisez ce nombre par le nombre de secteurs par unité d'allocation pour obtenir le nombre de unités d'allocation dans le volume.
Les deux premières entrées de la FAT sont réservées et n'ont rien à voir avec l'affectation de l'unité d'allocation. Selon la taille des entrées individuelles, 24 bits (3 octets) ou 32 bits (4 octets) peuvent être disponibles. Le premier octet contient le descripteur de média, tandis que la valeur 255 remplit les autres octets. Le descripteur de média, étant également entreposé à l'adresse 15h du BPB, indique le périphérique qu'utilise le média (par exemple une disquette). Les codes suivants sont possibles :
Code | Périphérique |
---|---|
F8h | Disque dur |
F9h | Unité de disquette 5.25" (AT seulement) 2 faces, 80 pistes, 15 secteurs |
FCh | Unité de disquette 5,25" 1 face, 40 pistes, 9 secteurs |
FDh | Unité de disquette 5,25" 2 côtés, 40 pistes 9 secteurs |
FEh | Unité de disquette 5,25" 1 face, 40 pistes, 8 secteurs |
FFh | Unité de disquette 5,25" 2 côtés, 40 pistes 8 secteurs |
Cela montre les différents formats de disquette pris en charge par DOS dans les disquettes 5,25" :
Inclus dans la version DOS | 1.00 | 1.10 | 2.00 | 2.00 | 3.00 |
---|---|---|---|---|---|
Descripteur de média | FE | FF | FC | FD | F9 |
Nombre de têtes de lecture/écriture | 1 | 2 | 1 | 2 | 2 |
Nombre de pistes par tête | 40 | 40 | 40 | 40 | 80 |
Nombre de secteurs 0 par piste | 8 | 8 | 8 | 8 | 8 |
Nombre d'octets par secteur | 512 | 512 | 512 | 512 | 512 |
Nombre de secteurs par unité d'allocation | 1 | 2 | 1 | 2 | 1 |
Nombre ou secteurs réservés | 1 | 1 | 1 | 1 | 1 |
Nombre de secteurs par FAT | 1 | 1 | 1 | 2 | 7 |
Nombre de FAT | 2 | 2 | 2 | 2 | 2 |
Nombre de secteurs dans le répertoire racine | 4 | 7 | 4 | 7 | 4 |
Nombre d'entrées dans le répertoire racine | 64 | 112 | 64 | 112 | 224 |
Nombre total de secteurs | 320 | 640 | 360 | 720 | 2400 |
Secteurs libres pour les données | 313 | 620 | 351 | 708 | 2371 |
Nombre d'unité d'allocation | 313 | 315 | 351 | 354 | 2371 |
Capacité totale | 160 Ko | 320 Ko | 180 Ko | 1360 Ko | 1,2 Mo |
Capacité totale du fichier | 156,5 Ko | 315 Ko | 175,5 Ko | 354 Ko | 1,185 Mo |
Vous vous êtes peut-être demandé pourquoi les entrées individuelles du FAT ont une largeur de 12 ou 16 bits si tout ce qu'elles font est d'indiquer si une unité d'allocation est occupé ou non. Cela aurait pu être fait avec un bit : Le bit pourrait contenir 1 lorsque l'unité d'allocation est occupé et 0 si l'unité d'allocation est disponible. La raison en est que les entrées dans la FAT permettent de marquer les unités d'allocation disponibles et d'identifier les unités d'allocation individuels contenant un fichier spécifique. L'entrée de répertoire d'un fichier indique à DOS quel unité d'allocation contient les premières données d'un fichier. Le numéro de cette unités d'allocation correspond au numéro de l'entrée FAT lui appartenant. Dans cette entrée se trouve le numéro de l'unité d'allocation contenant le prochain secteur de données de fichier. Comme le montre l'illustration suivante, une forme de chaîne dans laquelle les unités d'allocations individuels affectés à un fichier peuvent être localisés dans le bon ordre.
L'entrée FAT correspondant au dernier groupe d'un fichier doit contenir un code spécial indiquant au DOS que le fichier se termine ici. Le tableau suivant montre la signification des différentes entrées FAT.
Code | Description |
---|---|
(0)000h | Unité d'allocation est disponible |
(F)FF0h à (F)FF6h | Unité d'allocation réservé |
(F)FF7h | Unité d'allocation endommagé, non utilisé |
(F)FF8h à (F)FFFh | Dernier unité d'allocation de fichiers |
(x)xxxh | Unité d'allocation de fichiers suivant |
Remarque : Le premier nombre hexadécimal entre parenthèses fait référence à une FAT dont les entrées ont une largeur de 16 bits.
Le DOS est conçu pour que plusieurs copies identiques de la FAT sur le support puissent être conservées. Cela offre l'avantage qu'en cas d'endommagement d'un FAT, il peut être remplacé par un autre, évitant ainsi la perte de données.
La commande CHKDSK du DOS teste les différentes FAT pour voir si elles sont identiques.
Structure du répertoire
Regardons maintenant la structure d'un répertoire.
Le répertoire racine d'un volume suit immédiatement la dernière copie du FAT. Ce répertoire racine (comme tous les sous-répertoires) se compose d'entrées de 32 octets dans lesquelles des informations peuvent être stockées sur des fichiers individuels, des sous-répertoires et des noms de volume. Le nombre maximum d'entrées dans le répertoire racine, et donc sa taille, est entreposé dans le BPB à partir de l'adresse 11h. La commande FORMAT spécifie à la fois le numéro de taille et le BPB. Avant d'examiner les champs individuels de cette structure de données, voici un aperçu graphique d'une entrée de répertoire :
Déplacement | Description | Taille |
---|---|---|
+ 00h | Nom de fichier (blancs remplis avec des espaces) | 8 octets |
+ 08h | Extension de fichier (blancs remplis avec des espaces) | 3 octets |
+ 0Bh | Attribut de fichier | 1 octet |
+ 0Ch | Réservé | 10 octets |
+ 16h | Heure du dernier changement | 1 mot |
+ 18h | Date du dernier changement | 1 mot |
+ 1Ah | Premier unité d'allocation de fichiers | 1 mot |
+ 1Ch | Taille du fichier | 2 mots |
Les 8 premiers octets contiennent normalement le nom du fichier courant. Si le nom de fichier est plus court que 8 caractères, le DOS remplit les caractères restants avec des espaces (code ASCII 32). Si l'entrée de répertoire ne contient pas d'informations sur un fichier, mais que le fichier est utilisé d'une autre manière, le premier octet du nom de fichier (donc le premier octet de l'entrée de répertoire) est identifié par un code spécial :
Code | Description |
---|---|
00h | Dernière entrée du répertoire |
05h | Le premier caractère du nom de fichier a le code ASCII E5h |
2Eh | Le fichier s'applique au répertoire courant |
E5h | Fichier supprimé |
Le deuxième champ contient l'extension de nom de fichier à trois caractères. Si l'extension contient moins de trois caractères, DOS remplit les caractères supplémentaires avec des espaces (code ASCII 32). Le point entre le nom de fichier et l'extension est affiché par la commande DIR du DOS mais n'est pas conservé dans le répertoire ; DIR l'affiche juste pour faciliter la lecture des noms.
Vient ensuite le champ d'attribut d'un octet. Comme le montre la figure suivante, les bits individuels de ce champ définissent certains attributs. Les différents attributs peuvent être combinés pour qu'un fichier (comme dans le fichier IBMBIOS.COM) puisse avoir les attributs READ_ONLY, SYSTEM et HIDDEN.
Bit | Description |
---|---|
0 | 1=protégé en écriture 0=lecture/écriture activée |
1 | 1=fichier caché (Invisible pour DIR) |
2 | 1=Fichier système |
3 | 1=Nom du volume |
4 | 1=Sous-répertoire |
5 | 1=Bit d'archive |
6 à 7 | Réservé |
Alors que la signification des bits 0 à 4 est facile à voir, la signification du bit 5 nécessite des explications supplémentaires. Le nom archive bit vient de son utilisation dans la réalisation de copies de sauvegarde. Chaque fois qu'un fichier est créé ou modifié, ce bit est mis à 1. Si un programme est utilisé pour sauvegarder ce fichier, (par exemple la commande BACKUP du DOS), le bit d'archive est remis à 0. La prochaine fois que la commande BACKUP est utilisé, il peut déterminer à partir du bit d'archive si ce fichier a été modifié depuis la dernière sauvegarde. S'il contient toujours la valeur 0, le fichier n'a pas besoin d'être sauvegardé à nouveau. Si le bit d'archive contient un 1, le fichier a été modifié et doit être sauvegardé à nouveau.
Le nom du volume d'attributs et le sous-répertoire seront discutés plus en détail ci-dessous.
Un champ réservé dont DOS a besoin pour les opérations internes suit le champ d'attribut.
Les champs d'heure et de date indiquent quand le fichier a été créé ou modifié pour la dernière fois. Les deux sont entreposés sous forme de mots (2 octets), mais ont des formats spéciaux et différents.
Le champ suivant indique le numéro d'un unité d'allocation contenant les premières données du fichier. Il indique également le numéro de la FAT contenant le numéro d'unité d'allocation suivant affecté au fichier. Ce champ forme le début d'une chaîne par laquelle tous les unités d'allocation affectés à un fichier peuvent être récupérés.
La taille du fichier en octets est entreposée dans 2 mots avec le mot inférieur stocké en premier. En utilisant une petite formule et les deux mots, la taille du fichier peut être calculée comme suit :
Taille du fichier = mot1 + mot2 x 65 536 |
Nom du sous-répertoire et du volume
Le sous-répertoire et le nom du volume méritent une attention particulière. Le nom de volume ne peut exister que dans le répertoire racine et est indiqué par le bit 3 du champ d'attribut de l'entrée de répertoire en cours. Le nom de fichier dans une entrée de volume fait office de nom de volume ; les commandes DIR, VOL et TREE du DOS peuvent être utilisées pour afficher le nom du volume.
Si le bit 4 du champ d'attribut du répertoire courant est défini, cette entrée est pour un sous-répertoire. Si en plus le bit 1 de ce champ est activé, le sous-répertoire peut être adressé, mais ne sera pas affiché lorsque vous exécuterez la commande DIR. Pour ces entrées, les champs nom de fichier et extension contiennent le nom du sous-répertoire ; le champ date et heure contient l'heure de sa création. Le champ de longueur de fichier est toujours 0. Le champ indiquant normalement le premier unité d'allocation du fichier indique maintenant l'unité d'allocation contenant les entrées de répertoire de ce sous-répertoire. Ils ont la même structure de 32 octets que les entrées du répertoire racine. Comme dans un fichier normal, l'entrée dans la FAT, correspondant au unité d'allocation du sous-répertoire, pointe vers l'unité d'allocation suivant du sous-répertoire, tant qu'un unité d'allocation suffit pour le répertoire du sous-répertoire. Ce n'est pas le cas du répertoire racine s'étendant sur plusieurs secteurs ou unités d'allocation, se succédant logiquement. De plus, les unités d'allocation individuels du répertoire racine ne peuvent pas être connectés via le FAT, car il se réfère uniquement à la zone de données du volume. C'est la zone qui accepte mes et sous-répertoires, mais pas le répertoire racine.
Le processus décrit ci-dessus révèle que DOS sépare les fichiers individuels dans une unité d'entreposage en fonction de leurs répertoires. Il n'entrepose pas les fichiers d'un répertoire dans une zone, mais disperse les fichiers sur le support d'entreposage.
Lorsqu'un sous-répertoire est créé, deux fichiers sont créés avec les noms '.' et '..' ne pouvant être effacés que lorsque vous supprimez tout le sous-répertoire. Le premier de ces deux mes pointe vers le sous-répertoire courant, et son champ unité d'allocation contient le numéro du premier unité d'allocation du sous-répertoire courant. La deuxième entrée pointe vers le répertoire parent, qui, dans l'arborescence des répertoires, est situé devant le répertoire courant. Si le répertoire parent est le répertoire racine, le champ d'unité d'allocation contient la valeur 0. Le chemin d'accès au répertoire racine peut être retracé via cette entrée, puisque chaque sous-répertoire recherche son répertoire parent, il se rapproche du répertoire racine.
Revenons maintenant à notre discussion sur les structures des périphériques d'entreposage de masse. La zone de fichiers suit le répertoire racine que nous venons de décrire. Il occupe la zone d'entreposage restante du périphérique de stockage de masse. Il accepte les fichiers individuels et divers sous-répertoires. Pour chaque unité d'allocation de cette zone, il existe une entrée dans la FAT correspondant à cette unité d'allocation. Si un fichier est agrandi, DOS réserve un unité d'allocation étant encore disponible pour entreposer les données supplémentaires du fichier. L'entrée FAT du dernier unité d'allocation indiquant auparavant la fin du fichier est modifiée pour pointer vers le nouveau unité d'allocation contenant à son tour le nouveau caractère de fin. Dans les versions DOS 1.0 et 2.0, les unités d'allocation inutilisés sont recherchés depuis le début. Dans les versions DOS 3.0 et supérieures, une recherche plus sophistiquée est utilisée pour essayer de sélectionner un unité d'allocation inutilisé à proximité d'autres unités d'allocation comprenant le fichier. Cela réduit au maximum le temps d'accès au fichier. Inversement, lors de la réduction de la taille du fichier ou de la suppression d'un fichier, la FAT est mise à jour pour indiquer que les unités d'allocation inutilisés sont à nouveau disponibles. Ils peuvent être réutilisés lorsqu'un nouveau fichier est créé ou développé.