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: