Accéder au disque dur depuis le BIOS
Les modèles XT d'origine comprenaient des disques durs de 10 mégaoctets. Les disques durs sont devenu par la suite le périphérique d'entreposage de masse de choix sur les PC, suivis de près par les disquettes. Cependant, les deux périphériques ont de nombreuses caractéristiques en commun.
Comme la disquette, un disque dur est constitué de plaques aimantées, également appelées disques, pouvant entreposer des données sous forme d'impulsions magnétiques. Contrairement à la disquette, un disque dur contient plusieurs de ces disques. Les plaques d'un disque dur peuvent entreposer des données des deux côtés et doivent donc avoir une tête de lecture/écriture au-dessus et au-dessous de chaque disque pour lire et écrire des données.
Formatage du disque dur
Le formatage du disque dur est similaire à celui d'une disquette : chaque disque est divisé en pistes contenant des secteurs. Un cylindre est constitué de tous les secteurs accessibles sans déplacer les têtes de lecture/écriture. En d'autres termes, les têtes restent immobiles dans un cylindre tandis que le disque se déplace sous elles. Déplacer les têtes vers un autre ensemble de pistes accède à un autre cylindre. Chaque cylindre contient le même nombre de secteurs, qui à leur tour contiennent un nombre constant d'octets.
Partitions
Le disque dur a une autre division au-delà des niveaux de piste, de secteur et de cylindre : les partitions vous permettent de configurer des parties d'un disque dur pour différents systèmes d'exploitation. Bien que vous puissiez formater un disque selon un système d'exploitation et utiliser ce système d'exploitation exclusivement, les disques durs vous permettent de stocker plusieurs systèmes d'exploitation à la fois. Vous pouvez allouer le nombre de cylindres nécessaires à chaque système d'exploitation lors du formatage d'un disque dur. Le premier secteur du disque dur contient les informations sur cette allocation de mémoire. Ces informations incluent des données sur le début de chaque partition et sa taille, ainsi que le système d'exploitation se trouvant dans cette partition (par exemple, DOS a le code 1). Il enregistre également quel système d'exploitation est actif et quel système d'exploitation doit être démarré lors du démarrage du système.
Les modèles XT et AT peuvent contrôler des disques durs capables d'entreposer 10 mégaoctets, 20 mégaoctets, 40 mégaoctets et plus. Les deux disques durs ont 2 disques (4 faces) (numérotés de 0 à 3) et acceptent 17 secteurs par cylindre de 512 octets chacun. La différence de capacité réside uniquement dans le nombre de cylindres. Le disque dur XT comporte 306 cylindres numérotés de 0 à 305 de chaque côté de son support disque ; l'AT comporte 615 cylindres numérotés de 0 à 614 de chaque côté de son support disque. Le disque dur XT a une capacité minimale de 10,16 mégaoctets et le disque dur AT une capacité minimale de 20,41 mégaoctets.
Remarque : Soyez extrêmement prudent lorsque vous utilisez les fonctions d'accès au disque dur du BIOS. Contrairement à un unité de disque que vous pouvez tester avec un disque inutilisé, vous ne pouvez pas faire la même chose avec un disque dur. Une utilisation négligente de la fonction d'écriture ou de formatage peut entraîner une perte de données irrémédiable. Si vous envisagez d'essayer ces fonctions, sauvegardez l'intégralité du disque dur avant d'essayer ces fonctions.
Le BIOS accède au disque dur via l'interruption 13h - la même interruption utilisée pour l'accès à la disquette. Les fonctions individuelles sont identiques pour les unités de disque dur et de disquette, mais le contrôle du disque dur est très différent du contrôle de l'unité de disquette. Le BIOS utilise différents modules pour contrôler le disque dur et les unités de disque. Lorsque vous appelez l'interruption 13h, elle accède d'abord à la routine du disque dur. Cette routine teste si le disque dur ou l'unité de disquette doit être adressé, en fonction du numéro de périphérique dans le registre DL. Si le disque dur est impliqué, il appelle la routine appropriée dans le module de disque dur. D'autre part, si l'unité de disquette doit être adressé, un autre module doit être appelé en appelant l'interruption 40h, pointant vers l'ancienne interruption de disque 13h.
Toutes les fonctions du disque dur partagent la condition qu'après l'appel de la fonction, elles utilisent le drapeau de retenue pour indiquer si elles peuvent exécuter leur tâche ou si une erreur s'est produite. Si c'est le cas, le drapeau de retenue est activé et un code d'erreur est transmis au registre AH. Les codes individuels ont les significations suivantes :
Valeur | Description |
---|---|
01h | Fonction ou unité indisponible adressé |
02h | Marquage d'adresse introuvable |
04h | Secteur introuvable |
05h | Erreur lors de la réinitialisation du contrôleur |
07h | Erreur lors de l'initialisation du contrôleur |
09h | Erreur de transmission DMA : Limite de segment franchie |
0Ah | Secteur défectueux |
10h | Erreur de lecture |
11h | Erreur de lecture corrigée avec ECC |
20h | Défaut du contrôleur |
40h | L'opération de recherche a échoué |
80h | L'unité de disque ne répond pas (dépassement de délai) |
AAh | Le disque pas prêt |
CCh | Erreur d'écriture |
Lorsque l'une de ces erreurs se produit à l'exception de l'erreur 01, exécutez une réinitialisation et essayez d'appeler à nouveau la fonction. La plupart du temps, l'erreur ne se reproduira pas.
En savoir plus sur les erreurs
Si l'erreur 11H se produit pendant la fonction de lecture, les données lues ne sont peut-être pas réellement défectueuses. Cette erreur indique qu'une erreur de lecture s'est produite, mais qu'elle a pu être corrigée à l'aide de l'algorithme ECC (Error Correction Code). Cette procédure est similaire au processus CRC (Cyclic Redundancy Check) utilisé dans les unités de disque. Une formule mathématique compliquée ajoute les octets individuels d'un secteur. Le résultat du processus va sur le disque sous la forme d'un secteur plus quatre octets. Si une erreur de lecture se produit, elle peut être corrigée dans certaines limites à l'aide des résultats ECC enregistrés.
L'utilisation de registres de microprocesseur pour la transmission de données devient un autre parallèle entre les fonctions de disque dur et de disquette. Le numéro de fonction passe au registre AH. Si le programme demande le numéro du disque dur à adresser, il passe toujours au registre DL. La valeur 80h représente toujours le premier disque dur et 81H pour le deuxième disque dur. Le numéro de la tête de lecture/écriture (et indirectement du disque adressé) passe au registre DH. Le registre CH accepte le numéro de cylindre. N'oubliez pas qu'un disque dur de 10 Mo contient plus de 306 cylindres. Étant donné que ce registre 8 bits ne peut adresser que 256 cylindres à la fois, ce registre seul ne suffit pas pour indiquer le numéro de cylindre.
Pour cette raison, les bits 6 et 7 de l'aide du registre CL indiquent le numéro de cylindre. Ils forment les bits 8 et 9 du numéro de cylindre, permettant un intervalle adressable de 1 024 cylindres (0 à 1 023). Les bits 0 à 5 du registre CL fournissent le numéro du secteur à adresser (ils sont numérotés de 1 à 17 dans chaque cylindre). Si vous tentez d'accéder à plusieurs secteurs à la fois, les numéros de ces sections passent au registre AL. Pendant les opérations de lecture/écriture, une adresse de tampon doit être indiquée à partir de laquelle les données peuvent être lues ou vers laquelle les données peuvent être transférées. Dans un tel cas, le registre ES transmet l'adresse du segment et le registre BX l'adresse de déplacement de ce tampon.
Fonction 00h : Réinitialiser
La fonction 0h réinitialise le contrôleur sans avoir besoin d'autres paramètres. Après qu'une erreur se soit produite, cette fonction doit toujours être appelée avant le prochain accès aux données. Les informations du disque dur sur lesquelles repose l'exécution de la réinitialisation passent au registre DL.
Fonction 01h : État
La fonction 01h lit l'état du disque dur (cet état est indiqué après chaque opération sur le disque dur). Le numéro du variateur dont l'état doit être lu doit être entreposé dans le registre DL.
Fonction 02h : Lecture de secteur
La fonction 02h lit un ou plusieurs secteurs. Un seul appel de cette fonction peut lire jusqu'à 128 secteurs. Cette limitation se produit car le contrôleur de disque dur transfère les données directement dans la RAM via le DMA. La puce DMA ne peut transférer qu'un maximum de 64 Ko à la fois, dans un segment de mémoire à la fois. Pour cette raison, il est important que le tampon complet dont l'adresse passe à ES:BX tienne dans le 64K en commençant par l'adresse de segment dans ES. Sinon, la puce DMA peut signaler une erreur.
Cette fonction lit initialement tous les secteurs dans l'ordre numérique à l'intérieur du cylindre indiqué, en utilisant la tête de lecture/écriture indiquée. Une fois que la fonction a lu le dernier secteur d'un cylindre et que des secteurs supplémentaires doivent être lus, la lecture se poursuit avec le premier secteur du même cylindre, mais en utilisant une tête de lecture/écriture différente. Une fois que la fonction a accédé à la dernière tête de lecture/écriture et qu'il reste des secteurs supplémentaires, le processus de lecture se poursuit dans le premier secteur du cylindre suivant sur la première tête de lecture/écriture.
Fonction 03 : Écrire un secteur
La fonction 03h écrit un ou plusieurs secteurs. Un seul appel de cette fonction peut écrire des données dans jusqu'à 128 secteurs. Cette limitation est également causée par le DMA (voir fonction 02h ci-dessus).
Cette fonction écrit initialement tous les secteurs dans l'ordre numérique à l'intérieur du cylindre indiqué, en utilisant la tête de lecture/écriture indiquée. Une fois que la fonction écrit dans le dernier secteur d'un cylindre et que des secteurs supplémentaires doivent être écrits, l'écriture se poursuit avec le premier secteur du même cylindre, mais en utilisant une tête de lecture/écriture différente. Une fois que la fonction a atteint la dernière tête de lecture/écriture et qu'il reste des secteurs supplémentaires, le processus d'écriture se poursuit dans le premier secteur du cylindre suivant sur la première tête de lecture/écriture.
Fonction 04h : Vérifier
La fonction 04h vérifie les différents secteurs d'un cylindre. Aucune comparaison n'a lieu entre les données sur le disque et les données en mémoire (aucune adresse de tampon n'est nécessaire dans ES:BX). Les numéros ECC vérifient si les octets entreposés renvoient les mêmes résultats après traitement via l'algorithme ECC. Le registre AL indique le nombre de secteurs à vérifier.
Fonction 05h : formater
La fonction 05h formate le disque dur. Avant de pouvoir accéder à un disque dur, il doit être formaté. Semblable à la fonction utilisée pour formater un disque, cette fonction doit connaître la tête de lecture/écriture et le numéro de cylindre. De plus, il doit transmettre l'adresse du tampon au couple de registres ES:BX. Ce tampon doit avoir une longueur de 512 octets, même si la fonction n'accède qu'aux 34 premiers octets. Il contient deux octets pour chacun des 17 secteurs à formater. Le premier octet indique si le secteur est en bon état. En supposant que chaque secteur est en bon état, la valeur 0 est entrée dans cet octet. Le deuxième octet accepte le numéro logique devant être affecté au secteur courant. Le BIOS prend les informations des deux premiers octets de la table sur le premier secteur physique du cylindre. Les octets 3 et 4 fournissent des informations sur le second cylindre physique. Une fois que la série physique a déjà été déterminée, la séquence logique des secteurs peut être définie par 2 octets d'une indication de secteur dans cette table.
Les nombres diffèrent entre un secteur logique et son secteur physique respectif. Ce déplacement des secteurs logiques, appelé entrelacement de secteurs, permet d'optimiser le temps d'accès sur un disque dur.
Le disque dur moyen tourne à 60 tours par seconde. Cela signifie que le secteur physique suivant apparaît sous la tête de lecture/écriture tous les millièmes de seconde. Le contrôleur de disque dur est incapable de transférer les 512 octets du secteur précédemment lu dans la mémoire du PC. Pour cette raison, les secteurs logiques se décalent par rapport aux secteurs physiques, de sorte que le secteur logique suivant n'apparaît sous la tête de lecture/écriture qu'après que le contrôleur de disque dur a terminé la transmission du dernier secteur.
Le facteur d'entrelacement, c'est-à-dire le nombre de secteurs par lesquels les secteurs logiques se décalent par rapport aux secteurs physiques, dépend de la relation entre la vitesse à laquelle le disque dur tourne et la vitesse de traitement du contrôleur de disque dur. Par exemple, si le facteur d'entrelacement est de 6, cela signifie que pour chaque secteur lu, un "saut" de 5 secteurs a lieu avant que le secteur logique suivant ne suive. Plus ce facteur se rapproche de 1 (auquel cas les secteurs physique et logique sont identiques), plus le disque dur est rapide et plus la vitesse de transmission se rapproche de la limite physique.
Alors que les disques durs XT fonctionnent avec un facteur d'entrelacement de 1:6, les disques durs AT sont deux fois plus rapides, avec un facteur d'entrelacement de 1:3. Les effets du facteur d'entrelacement et la relation entre les secteurs logiques et physiques peuvent être vus dans le tableau suivant :
AT : Secteur physique | XT : Secteur physique | Secteur logique | Secteur |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 7 | 2 | 4 |
3 | 13 | 3 | 7 |
4 | 2 | 4 | 10 |
5 | 8 | 5 | 13 |
6 | 14 | 6 | 16 |
7 | 3 | 7 | 2 |
8 | 9 | 8 | 5 |
9 | 15 | 9 | 8 |
10 | 4 | 10 | 11 |
11 | 10 | 11 | 14 |
12 | 16 | 12 | 17 |
13 | 5 | 13 | 3 |
14 | 11 | 14 | 6 |
15 | 17 | 15 | 9 |
16 | 6 | 16 | 12 |
17 | 12 | 17 | 15 |
Lors d'un appel de fonction, le BIOS entre une valeur dans le premier octet d'un marqueur de secteur indiquant au programme appelant si le secteur est correcte ou non. La valeur 0 signifie correcte et la valeur 128 signifie qu'une erreur de magnétisation s'est produite. Outre les registres mentionnés ci-dessus, le registre AL accepte le nombre de secteurs à traiter. Les cylindres des disques durs AT et XT étant au format 17 secteurs, le registre AL doit contenir la valeur 17 lors de l'appel de cette fonction.
Fonction 08h : Vérifier les spécifications du disque
La fonction 08h, passant le numéro du disque dur : dans le registre DL, vérifie les spécifications du disque dur. Ceci est important pour examiner les disques durs avec des formats inhabituels.
Après l'appel de la fonction, le registre DL contient le nombre de disques durs connectés. Ce nombre peut être 0, 1 ou 2. De plus, le registre DH contient le nombre de têtes de lecture/écriture. Étant donné que le décompte des têtes de lecture/écriture commence toujours à 0, une valeur de 7 signifie que 8 têtes sont disponibles. Le registre CL (bits 0 à 7 du numéro de cylindre) et les deux bits supérieurs du registre CH (bits 8 et 9 du numéro de cylindre) indiquent le nombre de cylindres. Le comptage commence ici aussi à 0. La dernière information se trouve dans les 6 bits inférieurs du registre CH. Il indique le nombre de secteurs par cylindre, où le comptage commence à 1 (une exception à la règle, puisque les autres comptages de cette fonction commencent par 0).
Lorsqu'un utilisateur interface un disque dur étranger à un PC, le BIOS doit connaître les caractéristiques de ce disque dur pour effectuer un accès correct. Pour cette raison, il utilise l'interruption 41h pour le disque dur : 0 et l'interruption 46h pour le disque dur : 1 comme pointeurs vers une table. Ce tableau a un format prescrit par le BIOS et décrit le disque dur connecté. Le BIOS entrepose toute une série de tables afin que le BIOS puisse s'ajuster correctement lors du démarrage du système à partir du disque dur d'une unité de disque de démarrage.
Remarque : Si le disque dur : est déjà dans le PC et fonctionne correctement, n'essayez pas d'accéder au tableau de description du disque dur, car le disque dur pourrait être endommagé.
Une table doit être construite en RAM pour disque dur étranger : l'interfaçage, et les vecteurs d'interruption 41h ou 46h doivent pointer vers cette table. De plus, la fonction 9 doit configurer le BIOS pour utiliser cette table. Le chiffre 9 déclare la fonction. Le numéro d'unité de disque (80h ou 81h) est chargé dans le registre DL. Vous n'aurez peut-être jamais à utiliser cette fonction compliquée : la plupart des fabricants de disques durs incluent un programme de configuration effectuant la même tâche. Consultez la documentation fournie avec le disque dur : pour connaître les paramètres nécessaires au tableau de description du disque dur.
Fonction 0AH : Lire ECC
Fonction 0BH : Écrire ECC
Les fonctions 0Ah et 0Bh sont des fonctions de lecture/écriture supplémentaires. Elles diffèrent des fonctions 2 et 3 en ce qu'elles lisent et écrivent les quatre octets ECC à la fin de chaque secteur en plus des 512 octets de données. Pour cette raison, chaque secteur a 516 octets au lieu de 512 octets, et seuls 127 secteurs peuvent être lus ou écrits à la fois, au lieu de 128 comme dans les fonctions 2 et 3.
Fonction 0Bh : Recalibrer
La fonction 0Bh recalibre l'un des deux disques durs. Il renvoie également l'état d'erreur, en transmettant le numéro d'erreur au registre DL.
Fonction 10h : Vérifier l'état prêt
La fonction 10h teste si oui ou non le disque dur dont le numéro est dans le registre DL est actuellement prêt à exécuter des commandes. Si le drapeau de retenue est activé au retour de cette fonction, le disque dur n'est pas prêt. Un code d'erreur passe au registre AH.
Fonction 14h : Autotest
La fonction 14h force le contrôleur à effectuer un autotest interne. Si le contrôleur est correcte, il revient avec un drapeau de retenue de réinitialisation.
Fonction 15h : vérifier le type d'unité de disque
La fonction 15h détermine le type d'unité de disque. Le numéro de l'unité de disque (80h ou 81h) passe dans le registre DL. Si l'unité de disque est indisponible, il renvoie la valeur 0 dans le registre AH après l'appel de la fonction. Si le registre AH contient une valeur de 1 ou 2, le périphérique indiqué est un unité de disquette. La valeur 3 indique un disque dur. Si c'est le cas, les registres CX et DX contiennent le nombre de secteurs sur ce disque dur. Les deux registres forment un nombre de 32 bits (le registre CX contient les 16 bits supérieurs et le registre DX les 16 bits inférieurs).
Évitez l'accès au disque dur à l'aide des fonctions du BIOS, sauf en cas d'absolue nécessité. Laissez ces tâches aux fonctions DOS, OS/2 ou UNIX autant que possible.