Skip to topic | Skip to bottom
Home
Minfo05
Minfo05.TpAsySeance4r1.3 - 18 Oct 2005 - 17:06 - OlivierDalletopic end

Start of topic | Skip to actions

Approfondissement Système - TP4

Une FIFO en mode caractères de capacité variable

Dans cet exercice, nous allons commencer à utiliser les fonctions d'allocation dynamique du noyau Linux :

  • void *kmalloc(siez_t size,int flags) : alloue un tampon de taille size. Le second paramètre précise le mode d'allocation. Nous en discuterons plus en détail dans un prochain cours, pour l'instant il suffit de le mode choisr GFP_KERNEL. En retour la fonction fourni soit un pointeur vers la zone allouée (succès), soit un pointeur NULL (échec). Valeur de retour à tester impérativement
  • void kfree(const void *obj_p) : libère la zone mémoire référencée par obj_p.

Reprennez la FIFO en mode caractères que vous aviez à rendre pour aujourd'hui, et remplacez son tampon de taille fixe par un tampon de taille variable, que vous implémenterez sous la forme d'une liste chaînée : l'idée ici est de faire en sorte que lors d'une opération d'écriture, le pilote alloue la quantité de mémoire correspondant au nombre d'octets de l'écriture (plus ce qu'il faut pour le chaînage).

Lors d'une lecture, il faut consommer les éléments de la FIFO en partant de l'autre extrémité de la liste chainée. A chaque fois qu'un élément est retiré de la liste, il faut bine-entendu penser à rendre la mémoire avec kfree, autrement la mémoire est perdue pour toujours (décharger puis recharger le pilote dans le noyau n'y changera rien) ! Lors d'une opération de lecture, le pilote peut donc se trouver dans plusieurs situations, qu'il faudra faire attention à traiter correctement :

  • le nombre d'octets lus dépasse la quantité de données enregistrée dans la cellule qui se trouve en tête de liste (les prochaines données à retourner lors d'une lectur de la FIFO). Deux façon de traiter cette situation :
    • la compliquée : retirer des cellules en recopiant au fur et à mesure leur contenu vers l'espace utilisateur, jusqu'à atteindre la quantité désirée
    • la simple : ne retourner que la quantité disponible dans la première cellule. Encore une fois, c'est un comportement sémantiquement valide : lors d'une lecture avec read(), le noyau retourne au processus ce qu'il veut et pas forcément ce que le processus demande.
  • le nombre d'octets demandés est inférieur à la quantité demandée : comme on implémente une FIFO en mode caractère, il faut garder ce qui reste pour une prochaine lecture. Remarque : on peut se trouver confronté à cette situation aussi avec la solution compliquée ci-dessus (c'est pour ça qu'elle est compliquée).

Enfin, il ne faut surtout pas oublier de libérer totalement la mémoire allouée (cad vider totalement la FIFO) lors du déchargement du module.

-- OlivierDalle - 18 Oct 2005
to top


You are here: Minfo05 > ApprofondissementSysteme > TpAsySeance4

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