Skip to topic | Skip to bottom
Home
Minfo
Minfo.Tp4r1.2 - 30 Sep 2007 - 15:20 - NicolasNobelistopic end

Start of topic | Skip to actions

L'interface ioctl

Le module que vous allez écrire aujourd'hui se contrôle uniquement avec l'interface ioctl, il va donc falloir écrire les outils de contrôle en C en mode utilisateur (mais quand même à compiler et exécuter dans l'émulateur).

Cahier des charges

Écrivez un module qui implémente un pilote caractère pour un périphérique virtuel de calculette simple, accompagné d'un petit programme en mode utilisateur pour tester le périphérique.

Fonctionnement du périphérique virtuel :

  • Uniquement des ioctls
  • 4 opérations : + - * /
  • Trois ioctls en mode écriture : pour passer les deux opérandes et l'opérateur
  • Une quatrième ioctl en lecture : pour lire le résultat
  • Une cinquième ioctl en écriture : pour passer en une seule fois les deux opérandes et l'opérateur
  • Une sixième en lecture/écriture : pour écrire les opérandes, l'opérateur et récupérer le résultat

Indications

  • Définissez les constantes pour les commandes ioctls dans un fichier d'en-tête partagé entre le code du module en espace noyau et le code utilisateur qui va manipuler le périphérique. Utilisez les macros _IOWR, _IOW, _IOR pour définir les constantes, par exemple : #define OPERANDE1 _IOW('C', 0, int)
    • Les valeurs des constantes d' ioctl sont sans importance tant qu'il n'y a pas d'ambiguïté, par convention on encode des informations dans ce numéro de cette façon : _IOW(type, code, taille)
      • type : caractère indiquant le type d' ioctl. Ici 'C' pour calculette.
      • code : le code de la commande en question : 0, 1, 2, 3 ...
      • taille : en spécifiant le type passé en paramètre, le sizeof sera fait automatiquement.
    • Ces valeurs décodées ne sont pas utilisée par Linux, mais permettent au pilote d'effectuer des traitements génériques sur les ioctls. Par exemple, pour une ioctl en lecture seule, le pilote pourra vérifier que la zone mémoire devant être lue est bien lisible. Vous pouvez aussi totalement ignorer la signification des numéros et effectuer un traitement spécifique pour chaque numéro (conviendra pour ce TP).
  • Le programme utilisateur se contentera d'ouvrir le fichier spécial (open(2)), d'effectuer des ioctls avec les bons paramètres, et d'afficher les résultats.
  • Des types simples suffiront pour les quatre premières ioctls, mais il faudra passer en paramètre des structures pour les autres ioctls. Les types primitifs peuvent être manipulés directement en mode noyau contrairement aux pointeurs qui doivent être manipulés avec get_user / put_user.
  • La méthode ioctl surchargée devra donc aiguiller selon la commande (3ème argument).

Bonus : un presse papier dynamique

À faire seulement si vous avez terminé tous les tds, et si vous voulez vous perfectionner...

Le but de cet exercice est d'écrire un périphérique virtuel implémentant un presse papier et proposant quelques fonctions de transformation de chaînes.

Voici tout d'abord un code de démonstration de ce presse papier :

> cat /dev/pp
Le buffer est vide

> echo "blabla" > /dev/pp

> cat /dev/pp
blabla

Plutôt classique non ? Mais si on utilise ensuite un programme utilisateur (à écrire !) faisant quelques ioctls bien sentis :

> ppcontrol MAJ /dev/pp

> cat /dev/pp
BLABLA

>ppcontrol REV /dev/pp

> cat /dev/pp
ALBALB

À étendre suivant votre imagination !

-- NicolasNobelis - 30 Sep 2007
to top


You are here: Minfo > ApprofondissementSysteme > Tp4

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback