Skip to topic | Skip to bottom
Home
Minfo05
Minfo05.TpAsySeance6r1.1 - 30 Oct 2005 - 16:19 - OlivierDalletopic end

Start of topic | Skip to actions

Approfondissement Système - TP6

Utilisation de différents allocateurs

Dans cet exercice vous devrez repartir d'un pilote comportant une gestion de liste chaînée que vous avez écrit pour l'un des deux TP précédents (idéalement la solution du TP5, éventuellement le pilote du TP4).

L'objectif de l'exercice est de modifier le pilote de façon à remplacer les appels à kmalloc et kfree par des appels aux nouveaux allocateurs que vous avez vus dans le cours 6. Normalement, vous avez du utiliser les allocations dynamiques pour allouer deux types d'objets :

  • Les structures de chaînage
  • Les tampons de stockage de données

Partie 0 : terminer une liste chaînée !

Si vous n'êtes pas encore arrivé à faire fonctionner au moins l'un des pilotes comportant une gestion de liste chaînée dans les TP précédents, alors prenez le temps de la faire maintenant, ne vous lancez pas immédiatement dans la suite de cet exercice ! (Pour la suite de cet exercice vous devez travailler sur un pilote que vous avez écrit vous-même.

Partie 1 : Utilisation du Slab Allocator

Comme les structures de chaînage sont toujours de la même taille, vous utiliserez le Slab Allocator de façon à créer un cache de ces structures.

Une fois que vous aurez terminé, testez cette version intermédiaire de votre pilote. Utilisez en particulier le fichier /proc/slabinfo pour contrôler l'état de vos allocations. Pensez en particulier à libérer le contenu du cache et à la détruire avant d'autoriser le déchargement du module.

Partie 2 : Utilisation du Buddy Allocator

Il s'agit maintenant de remplacer la méthode d'allocation des tampons de stockage de données. Pour cela vous allez directement utiliser le Buddy Allocateur pour allouer des pages. Attention cependant : le BA vous retourne des pages complètes, et il faut faire attention à ne pas les gaspiller (cad éviter la fragmentation interne) :
  • Si vous avez besoin de stocker 10 octets dans premier temps, puis 20 octets la fois suivante, il n'est pas question d'allouer deux pages.
  • Vous devrez d'abord finir de remplir complètement une page avant d'en réclamer une autre.

Vous devrez de plus trouver un moyen de gérer correctement la libération de ces pages. Comme il y a de grandes chances que vous ayez utilisé chaque page pour stocker les données de plusieurs écritures successives (par exemple 10 puis 20 octets), alors vous ne devrez libérer cette page (la rendre au système) que lorsque tout ce que vous y avez mis aura disparu de la FIFO. Plusieurs solutions existent pour cela. Vous pouvez par exemple choisir d'utiliser les premiers octets de chaque page pour stocker un compteur d'utilisations de la page, qui augmente à chaque fois que vous ajoutez un objet dans la page, et diminue à chaque fois que vous en retirez un. Pour retrouver l'adresse de début d'une page, souvenez-vous que les pages ont une taille fixe : pour une adresse quelconque donnée, le début de la page s'obtient par un simple calcul de modulo. Ou par des opérations arithmétiques binaires puisque la taille d'une page est une puissance de 2.

Enfin, réfléchissez aussi aux cas particuliers suivants :

  • "Grosses" écritures : si une écriture dans la FIFO est demandée pour une quantité supérieure à la taille d'une page
  • Ecritures à cheval sur deux pages
Souvenez-vous que votre pilote est libre de n'écrire que la quantité qu'il souhaite et pas forcément celle demandée. Ca peut simplifier pas mal les choses...

Testez soigneusement votre pilote, et en particulier avec de grosses écritures et ou en remplissant la FIFO avec une quantité de données supérieure à la taille d'une page (constante PAGE_SIZE )

-- OlivierDalle - 30 Oct 2005
to top


You are here: Minfo05 > ApprofondissementSysteme > TpAsySeance6

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