Section courante

A propos

Section administrative du site

Pilotes de périphérique

Un pilote de périphérique est un fichier binaire contenant tout le code pour manipuler le matériel et fournir une interface cohérente à MS-DOS. De plus, il possède au début un entête spécial l'identifiant comme un périphérique, définissant la stratégie et interrompant les points d'entrée, et décrivant divers attributs du périphérique. Il existe deux types de pilotes de périphérique :

Les périphériques de caractères sont conçus pour effectuer des entrées/sorties de caractères en série comme CON, AUX et PRN. Ces périphériques sont nommés (c'est-à-dire qu'il porte des noms comme CON, AUX, CLOCKS,...), et les utilisateurs peuvent ouvrir des canaux (Identificateur de descripteur Handle ou FCB) pour leur faire des entrées/sorties. Les blocs de périphériques d'entrées/sorties aléatoires en morceaux sont appelés des périphériques par blocs (généralement la taille du secteur physique). Ces périphériques ne sont pas nommés comme les périphériques de caractères et ne peuvent donc pas être ouverts directement. Au lieu de cela, ils sont identifiés via les lettres d'unité de disque (A:, B:, C:,...). Les périphériques par bloc ont également des unités. Un seul pilote peut être responsable d'un ou plusieurs unité de disque. Par exemple, le pilote de périphérique de bloc ALPHA peut être responsable des lecteurs A:, B:, C: et D:. Cette situation signifie qu'il a quatre unités (0 à 3) définies et, par conséquent, prend 4 lettres d'unité de disque. La position du pilote dans la liste de tous les pilotes détermine quelles unités correspondent à quelles lettres de pilote. Si le pilote ALPHA est le premier pilote de bloc dans la liste des périphériques et qu'il définit 4 unités (0 à 3), ils seront A:, B:, C:, et D:. Si BETA est le deuxième pilote de bloc et définit trois unités (0 à 2), alors elles seront E:, F:, et G:, et ainsi de suite. Le MS-DOS 2.0 n'est pas limité à 16 unités de bloc, comme les versions 1.0. La limite théorique est de 63 (26 - 1), mais il convient de noter qu'après 26, les lettres d'unité de disque ne sont pas conventionnelles (comme «]», «\» et «^»). A partir de la version MS-DOS 3.0, la limite théorique du nombre d'unité de disque est descendu à 26.

Entête de périphérique

Un entête de périphérique est requis au début d'un pilote de périphérique. Un entête de périphérique ressemble à ceci :

Déplacement Taille Description
0 4 octets (Double mot) Ce champ contient un pointeur vers le prochain périphérique.
4 2 octets (mot) Ce champ contient les attributs :
Bit Description
0 Ce bit permet d'indiquer si le périphérique courant est STI si le bit 15 = 1.
1 Ce bit permet d'indiquer si le STO courant est une sortie si le bit 15 = 1.
2 Ce bit permet d'indiquer si le périphérique courant est NUL si le bit 15 = 1.
3 Ce bit permet d'indiquer si le périphérique courant est CLOCK si le bit 15 = 1.
4 Ce bit permet d'indiquer si le périphérique est spécial si le bit 15 = 1.
5 à 12 Ce bit doivent être fixé à 0.
13 Ce bit permet d'indiquer si ce n'est pas un format IBM.
14 Ce bit permet d'indiquer si un périphérique est un IOCTL.
15 Ce bit permet d'indiquer si un périphérique de caractère 0 est blanc.
6 2 octets (mot) Ce champ contient un pointeur vers la stratégie de pilote (point d'entrée).
8 2 octets (mot) Ce champ contient un pointeur vers l'interruption de pilote (point d'entrée).
10 8 octets Ce champ contient le nom du périphérique de caractères de 8 octets. Les périphériques de caractères définissent un nom de périphérique. Pour les périphériques blocs, le premier octet est le nombre d'unités.

Notez que les points d'entrée de périphériques sont des mots. Ils doivent être des déplacements du même numéro de segment utilisé pour pointer vers ce tableau. Par exemple, si XXX:YYY pointe vers le début de ce tableau, alors XXX:stratégie et XXX:interruption sont les points d'entrée.

Pointeur vers le prochain champ du bloc

Le pointeur vers le champ d'entête de périphérique suivant est un champ de double mot (déplacement suivi d'un segment) étant défini par MS-DOS pour pointer vers le pilote suivant dans la liste système au moment où le pilote de périphérique est chargé. Il est important que ce champ soit défini sur -1 avant le chargement (lorsqu'il se trouve sur le disque en tant que fichier), sauf s'il existe plusieurs pilotes de périphérique dans le fichier. S'il y a plus d'un pilote dans le fichier, le premier mot du pointeur de double mot doit être le déplacement de l'entête de périphérique du pilote suivant.

Champ d'attributs

Le champ d'attribut est utilisé pour indiquer au système si ce périphérique est un périphérique de type bloc ou caractère (bit 15). La plupart des autres bits sont utilisés pour donner aux périphériques de caractères sélectionnés un traitement spécial (Notez que ces bits ne signifient rien sur un périphérique bloc). Par exemple, supposons qu'un utilisateur dispose d'un nouveau pilote de périphérique qu'il souhaite être l'entrée et la sortie standard. Outre l'installation du pilote, il doit dire au système d'exploitation MS-DOS qu'il souhaite que son nouveau pilote remplace les entrées et sorties standard actuelles (le périphérique CON). Cette situation est accompli en définissant les attributs sur les caractéristiques souhaitées, il mettra donc les bits 0 et 1 à 1 (notez qu'ils sont séparés!). De même, un nouveau périphérique CLOCK pourrait être installé en définissant cet attribut. Bien qu'il existe un attribut de périphérique NUL, le périphérique NUL ne peut pas être réaffecté. Cet attribut existe afin que le système d'exploitation MS-DOS puisse déterminer si le périphérique NUL est utilisé. Le bit de pas de format IBM s'applique uniquement aux périphériques de bloc et affecte le fonctionnement de l'appel de périphérique de construction BPB (Bios Parameter Block). L'autre élément intéressant est le bit IOCTL, ayant une signification sur les périphériques de caractères et de blocs. Ce bit indique a au système d'exploitation MS-DOS si le périphérique peut gérer les chaînes de contrôle (via l'appel système IOCTL, Interruption 21h, Fonction 44h). Si un pilote ne peut pas traiter les chaînes de contrôle, il doit initialement mettre ce bit à 0. Cette situation indique au système d'exploitation MS-DOS de renvoyer une erreur si une tentative est effectuée (via l'Interruption 21h, Fonction 44h) pour envoyer ou recevoir des chaînes de contrôle à ce périphérique. Un périphérique pouvant traiter les chaînes de contrôle doit initialiser le bit IOCTL à 1. Pour les pilotes de ce type, MS-DOS effectuera des appels aux fonctions de périphérique IOCTL en INPUT (entrée) et OUTPUT (sortie) pour envoyer et recevoir des chaînes IOCTL. Les fonctions IOCTL permettent d'envoyer et de recevoir des données pour le périphérique pour son propre usage (par exemple, pour définir le débit en bauds, les bits d'arrêt et la longueur du formulaire), au lieu de transmettre des données sur le canal du périphérique comme le fait une lecture ou une écriture normale. L'interprétation des informations transmises dépend du périphérique, mais elle ne doit pas être traitée comme une demande d'entrée/sortie normale.

Stratégie et routines d'interruption

Ces deux champs sont les pointeurs vers les points d'entrée des routines de stratégie et d'interruption. Ce sont des valeurs de mot, elles doivent donc être dans le même segment que l'entête de périphérique.

Champ du nom de périphérique

Il s'agit d'un champ de 8 octets contenant le nom d'un périphérique de caractères ou le nombre d'unités d'un périphérique de bloc. S'il s'agit d'un périphérique par bloc, le nombre d'unités peut être mis dans le premier octet. Ce champ est facultatif, car le système d'exploitation MS-DOS remplira cet emplacement avec la valeur renvoyée par le code INIT du pilote.

Comment créer un pilote de périphérique

Afin de créer un pilote de périphérique que le système d'exploitation MS-DOS peut insérer, vous devez écrire un fichier binaire avec un entête de périphérique au début du fichier. Notez que pour les pilotes de périphérique, le code ne doit pas avoir l'origine 100h, mais plutôt de 0. Le champ de lien (pointeur vers l'entête de périphérique suivant) doit être -1, sauf s'il y a plus d'un pilote de périphérique dans le fichier. Le champ d'attribut et les points d'entrée doivent être définis correctement. S'il s'agit d'un périphérique de caractères, le champ du nom doit être rempli avec le nom de ce périphérique de caractères. Le nom peut être n'importe quel nom de fichier légal à 8 caractères. Le système d'exploitation MS-DOS traite toujours les pilotes de périphérique installables avant de manipuler les périphériques par défaut, donc pour installer un nouveau périphérique CON, nommez simplement le périphérique CON. N'oubliez pas de définir le périphérique d'entrée standard et les bits de périphérique de sortie standard dans le mot d'attribut sur un nouveau périphérique CON. L'analyse de la liste des périphériques s'arrête à la première correspondance, le pilote de périphérique installable est donc prioritaire.

Installation d'un pilote de périphérique

Le système d'exploitation MS-DOS permet d'installer de nouveaux pilotes de périphérique dynamiquement au démarrage. Cette situation est accompli par le code INIT dans le BIOS, qui lit et traite le fichier CONFIG.SYS. Le système d'exploitation MS-DOS appelle les pilotes de périphérique pour effectuer leur fonction de la manière suivante : le système d'exploitation MS-DOS effectue un appel éloigné (CALL FAR) à l'entrée de stratégie et transmet (dans un entête de requête) les informations décrivant les fonctions du pilote de périphérique. La structure vous permet de programmer un pilote de périphérique déclenché par l'interruption. Par exemple, vous souhaiterez peut-être effectuer une mise en mémoire tampon locale pour une imprimante.

Entête de requête

Lorsque le système d'exploitation MS-DOS appelle un pilote de périphérique pour exécuter une fonction, il transmet un entête de requête dans le couple de registres ES:BX au point d'entrée de stratégie. Il s'agit d'un entête de longueur fixe, suivi de données pertinentes pour l'opération en cours. Notez que c'est la responsabilité du pilote de périphérique de préserver l'état de la machine (par exemple, enregistrer tous les registres à l'entrée et les restaurer à la sortie). Il y a assez de place sur la pile quand une stratégie ou une interruption est appelée pour effectuer environ 20 empilements dans la pile. Si plus de pile est nécessaire, le pilote doit configurer sa propre pile. La figure suivante permet de l'illustrer l'entête de requête :

Code d'unité

Le champ de code d'unité identifie l'unité dans le pilote de votre périphérique à laquelle la requête est destinée. Par exemple, si votre pilote de périphérique a 3 unités définies, les valeurs possibles du champ de code d'unité seraient 0, 1 et 2.

Champ de code de commande

Le champ de code de commande dans l'entête de requête peut avoir les valeurs suivantes :

Code de commande Nom Description
0 INIT Cette commande permet d'initialiser le pilote.
1 MEDIA CHECK Cette commande permet de vérifier le média. Cette commande est applicable pour les périphériques par bloc pour les NOP de caractères.
2 BUILD CHECK Cette commande permet de vérifier la construction. Cette commande est applicable pour les périphériques par bloc pour les NOP de caractères.
3 IOCTL INPUT Cette commande permet d'indiquer l'entrée IOCTL. Cette commande est seulement appelé si le périphérique est IOCTL.
4 INPUT Cette commande permet d'indiquer une entrée en lecture seulement.
5 NON-DESTRUCTIVE INPUT NO WAIT Cette commande permet d'indiquer une entrée sans attente et sans perte de données. Cette commande est pour les périphériques de caractères seulement.
6 INPUT STATUS Cette commande permet d'indiquer l'état d'entrée. Cette commande est pour les périphériques de caractères seulement.
7 INPUT FLUSH Cette commande permet d'indiquer le vidage de l'entrée. Cette commande est pour les périphériques de caractères seulement.
8 OUTPUT Cette commande permet d'indiquer la sortie en écriture.
9 OUTPUT WITH VERIFY Cette commande permet d'indiquer la sortie en écriture avec vérification.
10 OUTPUT STATUS Cette commande permet d'indiquer l'état de la sortie. Cette commande est pour les périphériques de caractères seulement.
11 OUTPUT FLUSH Cette commande permet d'indiquer le visage de la sortie. Cette commande est pour les périphériques de caractères seulement.
12 IOCTL OUTPUT Cette commande permet d'indiquer la sortie IOCTL. Cette commande est seulement pour les périphériques IOCTL.

Remarques



Dernière mise à jour : Samedi, le 18 avril 2020