[SOS] Problème de compréhension
Thomas Petazzoni
thomas.petazzoni at enix.org
Lun 15 Nov 12:16:50 CET 2004
Bonjour,
Cyril Dupuit wrote:
> Je n'arrive pas à comprendre le schéma globale des objets (range, slab,
> cache) mis en oeuvre. Pourriez-vous m'aider à comprendre cette
> initialisation.
Il y a deux parties distinctes dans l'allocateur :
- Un allocateur de "ranges" dans l'espace noyau. Cet allocateur permet
d'allouer des espaces de mémoire dont la taille est un multiple de la
taille d'une page. Cet allocateur par "ranges" repose sur le second
allocateur pour allouer les "struct range" (c'est là la subtilité)
- Un allocateur ala "malloc()", c'est à dire un allocateur qui permet
d'allouer des objets de petite taille (< taille d'une page). Différents
types d'allocateurs existent pour faire cela, mais pour SOS, nous avons
choisi un allocateur par "slab". Dans un allocateur par "slab", on créé
un cache pour chaque type ou taille d'objet que l'on souhaite allouer.
Ainsi, dans un OS, on crééera certainement un cache pour les objets
"semaphore", un cache pour les objets "thread", un cache pour les objets
"fichier", un cache pour les objets divers de 16 octets, un cache pour
les objets divers de 32 octets, un cache pour les objets divers de 64
octets, etc... Et ensuite, on va puiser dans ces caches en fonction de
l'objet que l'on souhaite allouer. Chaque cache est un ensemble de
"slab". Un "slab" est lui même un ensemble de pages virtuelles contigues
découpées de manière arbitraire pour former des zones de la taille
unitaire d'un objet du cache considéré. Et là, de nouveau la subtilité :
cet allocateur repose sur le premier allocateur. En effet, un slab
n'étant qu'un ensemble de pages virtuelles contigues, on utilise le
premier allocateur pour allouer un "range" !
Voilà, je ne sais pas si c'est plus clair, n'hésite pas à poser d'autres
questions si besoin est.
> - Dans les fonctions create_cache_of_caches et create_cache_of_ranges,
> vous faites appel à la fonction : cache_initialize. Cette fonction,
> comme son nom l'indique, sert à initialiser un cache.
> Pourtant, je ne comprend pas pourquoi the_cache est initialisé à 0 pour
> une taille de sizeof(struct sos_kslab_cache) lorsque d'autres fonctions
> de ce module (sos_kmem_cache_create, create_cache_of_caches,
> create_cache_of_ranges) utilisent cette fonction avec un paramètre de
> taille de sizeof_struct_range ou obj_size. Si obj_size > sizeof(struct
> sos_kslab_cache), c'est bon. Par contre, sizeof_struct_range est
> inférieur à sizeof(struct sos_kslab_cache) d'où un bogue latent.
Dans cache_initialize(), je vois :
memset(the_cache, 0x0, sizeof(struct sos_kslab_cache));
the_cache est donc invariablement initialisé à 0 pour une taille de
sos_kslab_cache.
Le paramètre obj_size de cache_initialize() est effectivement pour
chaque appel de cache_initialize(). Mais obj_size désigne la taille des
objets contenus dans ce cache. Dans le cas du cache des caches, obj_size
vaut sizeof(struct sos_kslab_cache), dans le cas du cache des ranges
obj_size vaut sizeof(struct range), etc...
Je ne vois pas où est le problème que tu soulèves.
> - Autre problème dans la fonction sos_kmem_vmm_free. Le type retourné
> est : sos_vaddr_t qui cache un type unsigned long. En cas d'erreur,
> cette fonction retourne -SOS_EINVAL ou -SOS_EBUSY.
Oui, la bonne pratique mise en place par d2 aurait je pense voulu que la
fonction sos_kmem_vmm_free() retourne un sos_ret_t, et que la véritable
sos_vaddr_t soit retournée via un pointeur.
Bonne journée,
Thomas
--
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: thomas.petazzoni at jabber.dk
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
Url : http://the-doors.enix.org/pipermail/sos/attachments/20041115/f3c21412/signature.pgp
Plus d'informations sur la liste de diffusion Sos