[SOS] Allocateur mémoire First Fit - Vos conseils

anthoine.bourgeois anthoine.bourgeois at orange.fr
Mer 3 Juin 09:43:19 CEST 2009


Bonjour,

> Message du 24/05/09 11:24
> De : "Konstantin Tcholokachvili" 
> A : Sos at the-doors.enix.org
> Copie à : 
> Objet : [SOS] Allocateur mémoire First Fit - Vos conseils
> 
> 
> Bonjour,
> 
> Je souhaiterais avoir votre consultation.
> 
> Je suis sur le point d'implémenter un allocateur mémoire, mais pas un
> slab allocator, quelque chose de plus simple comme le first fit.
> 
> Si j'ai bien compris, il faut décider dans quelles régions de mémoire
> on pourra allouer la mémoire et où ça ne sera pas possible:
> 
> de SOS_KMEM_VMM_BASE à BIOS_N_VIDEO_START: région libre
> de BIOS_N_VIDEO_START à BIOS_N_VIDEO_END: région occupée
> de BIOS_N_VIDEO_END à kernel_core_base: région libre
> de kernel_core_base à bootstrap_stack_bottom_vaddr: région occupée
> de bootstrap_stack_bottom_vaddr à bootstrap_stack_top_vaddr: région occupée
> de bootstrap_stack_top_vaddr à kernel_core_top: région occupée
> de kernel_core_top à SOS_KMEM_VMM_TOP: région libre
> 
> Les régions qui sont libres doivent être mappés en appelant cette fonction:
> 
> void set_pages_status(sos_vaddr_t base_address, sos_vaddr_t top_address)
> {
> sos_vaddr_t page_virtual_address;
> sos_paddr_t page_physical_address;
> 
> for (page_virtual_address = base_address;
> page_virtual_address < top_address;
> page_virtual_address = page_virtual_address + SOS_PAGE_SIZE)
> {
> ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
> SOS_ASSERT_FATAL(ppage_paddr != (sos_paddr_t)NULL);
> 
> retval = sos_paging_map(ppage_paddr, vaddr,
> FALSE,
> SOS_VM_MAP_ATOMIC
> | SOS_VM_MAP_PROT_READ
> | SOS_VM_MAP_PROT_WRITE);
> SOS_ASSERT_FATAL(retval == SOS_OK);
> 
> retval = sos_physmem_unref_physpage(ppage_paddr);
> SOS_ASSERT_FATAL(retval == FALSE);
> }
> }
> 
> Et seront ajoutées à la liste chaînée des régions libres.
> 
> Les régions qui ne sont pas libres on les place dans la liste chaînée
> des régions qui ne sont pas libres.
> 
> 
> En suite pour allouer et désallouer la mémoire on effectue des recherches,
> ajouts et suppressions dans ces 2 listes.
> 
> C'est bien ça ou j'ai oublié des étapes ou des hypothèses?

Tu peux faire comme decrit ci-dessus. Il y a plein de solutions.
Ici tu mappes tes regions libres. Ce n'est pas ce que nous faisons
dans SOS. Dans SOS, la memoire est mappée uniquement si elle est utilisée.
Donc après cette definition des regions libres.

Le problème que tu auras avec la solution que tu nous donne est que
ton système depend de la memoire physique. Si tu as de grandes regions
libres (typiquement ca approche du Go ou plus dans un espace noyau 32bits)
et que tu as une petite memoire physique, dans ce cas ta boucle
ci-dessus n'arrivera pas a mapper lorsque tu attendras la fin de
ta memoire physique.

En bref, il faudrait essayer de décorréler la memoire virtuelle et la
memoire physique pour plus de souplesse.

Cordialement,
Anthoine




Plus d'informations sur la liste de diffusion Sos