Reading of the parameters (BIOS) of hard disk IDE/AT /Récupération des informations des paramètres des Disques dûrs IDE/AT

(from an issue published in INFOPC LANGAGES & SYSTEME N°92 - Mai 1993)


Décoder toutes leurs informations
(Article de Jean-François DUVIVIER paru dans LANGAGE & SYSTEMES – INFOPC N°92 - Mai 1993)

Les contrôleurs de disque durs pour PC ont connu leur première « révolution culturelle » avec l’arrivée de l’IBM A, en 1984. Cette machine comprenait une carte contrôleur ST506 à encodage MFM Modified frequency Modulation d’origine Western Digital et un BIOS pilotant le disque dur intégré en standard dans le Bios de l’IBM AT.
Pour des raisons de compatibilité, tous les modèles suivants et tous les compatibles ont incorporé le même type de Bios. Par conséquent, toutes les cartes contrôleurs de tous les fabricants et de toutes technologies (ST506/MFM ST506/RLL et ESDD) fonctionnent à partir des mêmes registres et des mêmes commandes.

Le premier essai de disque IDE date de 1986. Il est l’œuvre d’Imprimis (racheté depuis par Seagate) qui à la demande de Compaq et avec l’aide de Western Digital, incorpore une carte contrôleur compatible PC/AT sur le disque dur. Le mariage contrôleur / disque permet de réduire le nombre de composants et, surtout d’éliminer une carte dans la machine. L’idée va petit à petit faire son chemin, Conner se montrant un précurseur dans la commercialisation de disques 3, 5 pouces IDE.

Cependant les différences d’interfaces ainsi que les incompatibilités des disques entre eux freinent la diffusion des disques IDE.

Les sociétés impliquées dans l’IDE créent alors en octobre 1988, un groupe de travail dénommé le CAM (Common Access Method Commitee) pour standardiser L’IDE sous le nom de ATA/AT Attachment, Le document de description de l’IDE est élaboré au cours des mois suivants.

Après plusieurs révisions, il devient une proposition de norme auprès de l’Ans. Les bénéfices de cette standardisation se font sentir dès 1990 et conduisent mêmes les fabricants de disques à stopper tous leurs développements en technologie ST506/MFM , ST506/RLL et ESDI. Seul le SCSI, interface intelligente et performante permettent d’accéder à des disques de très grande capacité subsistera au raz-de-marée IDE.

Les commandes disponibles:

Un disque IDE réagit à des commandes qui lui sont adressées il en existe 3 types :

Celles qui doivent obligatoirement être implémentées par le disque. Elle correspondent en fait aux commandes reconnues par la première carte contrôleur utilisée sur le premier IBM/AT

Le BIOS des machines à base de processeur 80286 (et supérieur) les utilisent pour réaliser toutes les fonctions de l’interruption 1Bh standard.

Celles qui sont spécifiques à chaque fabricant de disque dur, et qui ne sont ni documentées, ni même diffusées. Il peut s’agir de commandes utilisées pour les tests lors de la fabrication du disque, mais aussi de commandes permettant une configuration « fine » des tampons internes du disque ou une modification du firmware (dont une partie peut être en PROM et une autre stockée sur le disque lui-même en un endroit invisible pour l’utilisateur, permettant ainsi une sorte de téléchargement.

Celles qui sont optionnelles et dont l’implémentation est laissée au bon vouloir des fabricants de disques. Elles sont cependant très clairement définies ; afin qu’elles présentent les mêmes codes et fonctionnalités sur tous les disques. On y retrouve principalement trois grandes familles.

La première regroupe des commandes permettant de modifier la consommation du disque (Idle, Sleep, Standby) grâce à l’extinction graduelle de certaines parties (électronique, moteur…). La majorité des disques incorporés dans les blocs notes utilisent ces fonctionnalités pour prolonger l’autonomie des batteries.

La seconde rassemble des commandes autorisant la lecture ou l’écriture de plusieurs secteurs à la fois (opération plus performante puisqu’une seule commande est envoyée au disque pour un groupe de secteurs consécutifs au lieu d’une commande pour chaque secteur), ainsi que les commandes permettant la lecture et l’écriture d’un secteur en utilisant un canal DMA. Cependant, comme les Bios n’utilisent pas ces commandes en raison de la sacro-sainte « compatibilité », la plupart des disques ne les implémentent pas.

La commande « Identify drive »

La dernière famille ne comprend qu’une seule commande dénommée « Identify drive », qui permet de récupérer certaines informations sur le disque. Bien qu’optionnelle, cette commande est en fait toujours implémentée et permet de « lire » un secteur de 512 octets dont le format est donné ci-après. Les informations sont regroupées par mots de 16 bits (256 au total). Certaines d’entre elles seulement intéresseront l’utilisateur :
Le modèle du disque. Cette information retourne généralement la marque et le code attribué par le fabricant du disque. Elle permet donc d’identifier très rapidement et sans ouvrir la machine le modèle du disque dur installé.

Le numéro de série du disque. En pratique, certains disques ne présentent pas cette information car le fabricant n’a pas prévu d’inscrire une table variable. Le numéro de série est en effet la seule différence pouvant exister entre deux disques de même modèle.

La version du firmware, c'est-à-dire du logiciel implémenté sur le disque. Bien qu’il soit beaucoup moins sujet à modification et à correction que le Bios d’une machine, par exemple, le firmware d’un disque peut être l’objet de modifications, surtout au début de sa commercialisation.

Les caractéristiques du disque, représentées sous la forme classique des cylindres, de têtes et de secteurs par piste. En général, les paramètres rendus sont « logiques », c'est-à-dire qu’ils définissent la façon dont on peut accéder au disque et non ses caractéristiques physiques réelles. Le transcodage entre paramètres logiques et physiques était nécessaire au départ (en 1988-1989) afin de présenter 17 secteurs par pistes, valeur qui était classique pour les disques MFM, et que nécessitaient certains logiciels.
Cette raison a perdu de son importance maintenant, mais le transcodage est toujours nécessaire en raison des limitations originales du Bios qui interdisent de définir plus de 1024 cylindres, alors que les progrès dans la densité magnétique ont permis de dépasser cette limite sur un disque 3,5 pouces. De plus, le Bios n’intègre pas non plus la possibilité d’utiliser un disque présentant un nombre de secteurs variables suivant les pistes (on peut effectivement mettre plus de secteur sur les pistes (on peut effectivement mettre plus de secteurs sur les pistes extérieure du plateau que celles situées plus au centre). Cette technique, appelée ZBR (Zone Bit Recording), est très largement pratiquée pour augmenter les capacités d’un disque. Certains disques, rares il est vrai, peuvent indiquer leur vrais paramètres « physiques » avant transcodage. C’était notamment le cas de quelques disques Conner. On s’en aperçoit généralement par un nombre de cylindres supérieur à 1024. Dans le cas du Quantum LPS105 qui nous a servi de test (voir figure 1), on peut affirmer que les paramètres rendus sont logiques pour deux raisons.

D’une part le faible nombre de 17 secteurs par piste ne reflète pas les densités longitudinales que les fabricants sont capables d’atteindre aujourd’hui. A titre d’exemple la technologie RLL datant de 1987 permettait déjà d’obtenir 26 secteurs par piste. D’autre part le nombre de têtes (16) supposerait 8 plateaux qu’il est assurément impossible de faire tenir dans un disque haut de 2,5 cm. En fait, le LPS105 dispose de deux plateaux, donc de 4 têtes, avec 1219 cylindres et un nombre de secteur par piste égal à 35 (à l’intérieur), 42 (au milieu) ou (49 à l’extérieur).
Le taux de transfert interne au disque : Les valeurs proposées sont en fait des seuils (5 et 10 megabits par seconde) et trois bits du mot de configuration sont utilisés pour indiquer les performances du disque par rapport à ces seuils. Bien entendu, ces taux de transfert ne sont pas ceux que l’on va retrouver sous DOS avec un utilitaire tel que Coretest, mais il existe une relation directe : un disque ayant un meilleur taux de transfert interne seront aussi plus performant sous DOS.
La taille et le type du tampon interne au disque : La plupart des disques modernes sont équipés d’un tampon mémoire permettant des opérations de « look-ahead » (lecture anticipée des secteurs qui suivent celui qu’on vient de lire) ainsi que du cache classique (la lecture répétée d’un même secteur ne provoquera plus d’accès « physique » au disque à partir de la deuxième opération, puisque les données sont déjà présente dans le tampon du disque). La taille est importante car elle permet d’effectuer un cache plus important ou de lire en avant une piste entière. Le type de cache peut prendre quatre valeurs différentes : (0 : tampon non spécifié), 1 (tampon monosecteur et mono-accès), 2 (tampon multi secteur vers le disque et vers l’ordinateur) et 3 (identique à 2 , avec en plus des possibilités de cache en lecture). Plus le chiffre représentant le type est élevé, plus le tampon est performant.
D’autres informations sont également disponibles, tels le nombre d’octets ECC (codes de correction d’erreur) ou les possibilités de transfert multisecteurs ou DMA.
L’écriture de l’utilitaire HDID qui affiche certains de ces paramètres a été réalisée en langage mixte (MSC et assembleur) . La partie en C permet l’interprétation et l’affichage des données tandis que l’assembleur est plus adapté pour gérer le dialogue avec le disque. L’interface entre les deux langages se fait au moyen d’une fonction GetID qui admet en paramètre un pointeur vers le tampon de 512 octets, et dont la composition est calquée sur le tableau 1. L’utilisation d’une structure permet un accès simplifié à chacun de ses éléments. L’appel à la fonction GetID doit transmettre l’adresse de cette structure au moyen de l’opérateur & . A noter que les trois chaînes de caractère ASCII rendues par le disque doivent être retraitées car les octets sont inversés deux à deux (octet bas et octet haut de chaque mot). C’est le but de la fonction swab. Il est aussi nécessaire d’y ajouter le 0 qui sert de terminateur de chaîne en langage C, car il ne il ne figure pas sur les données rendues par le disque.
Du côté assembleur, la fonction GetID est définie comme PUBLIC et précédée du caractère _ (underscore), ce qui est la convention pour les fonctions C. Afin d’accéder facilement aux paramètres d’une fonction C, il est d’usage de définir une structure (Sgetid ici) qui comprendra bien sûr le registre BP « pushé » dès le début du programme pour servir de pointeur de pile, mais aussi l’adresse de retour au C (un seul mot puisqu’on travail en mode small), puis tous les paramètres de cette fonction dans l’ordre de leur apparition. Les registres de segment doivent être sauvegardés s’ils sont modifiés lors de l’exécution de la routine assembleur.
Vu du PC, le disque dur présente huit registres (voir tableau) situés de 1F0h à 1F7h. Certains présentent des fonctions différentes en lecture et en écriture. HDID n’en utilise que trois : le registre de données (pour lire les paramètres rendus par le disque ), , le registre Disque/Tête pour définir le disque accédé (00h pour le premier disque, 10h pour le second) et le registre Statut/Commande pour envoyer la commande. En lecture, le Statut permet de gérer l’état du disque et de contrôler les erreurs. La signification des différents bits est donnée ci-après
(….)
L’envoi d’une commande requiert d’abord d’autoriser l’IRQ 14 utilisée par le disque pour signifier qu’il est prêt à transférer les paramètres. Il faut ensuite s’assurer que le disque est prêt à accepter une commande en testant le statut, puis charger les registres correspondants. Lorsque le disque a exécuté la commande, il génère une interruption IRQ14 automatiquement traîtée par le BIOS qui met à jours certaines variables dans sa zone de données situées dans le segment 40h. Il suffit de tester une de ces valeurs pour savoir si l’IRQ14 a été générée. Dans l’affirmative, c’est le signal de la disponibilité des paramètres qui peuvent alors être lus à partir du registre de données.
Le programme doit prendre bien soin, lors de toute ses opérations, de maintenir à jour les variables du Bios (en particulier la copie du Status en 40h :74h) afin de ne pas perturber le fonctionnement ultérieur de la machine. Le programme C est compilé en mode small avec MSC 6.0. Le programme assembleur est assemblé avec un MASM 6.0. Les syntaxes suivantes ont été utilisées :
Masm /MX hdida,hdida ;
Cl hdid.C hdida.obj

Parmi les améliorations qui pourraient être apportées à la version 1.00 de HDID, figurent le paramétrage du disque (0 ou 1), la sortie complète des 512 octets sous forme hexadécimale ou l’interprétation plus fine des paramètres codés sous forme binaire.

You will find here the content of the article.

Here you will find the source in C and ASM 8086 compiled with MASM 6.0 end Borland TurboC 6.0

Important Notice: The program compiled as so doesn't work (there have been errors in the article by reprinting the source and I still cannot make this program working , so If you can help you are welcome!)

Other Resources can be found here:

hdid.c

hdid.pas

hdid1.htm



Back to the Welcome page

Updated: le 26 février, 2016

matthieu.benoit@free.fr