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

Konstantin Tcholokachvili tcholoka at gmail.com
Dim 7 Juin 16:17:57 CEST 2009


Merci pour les suggestions,

J'avais pensé aussi au "demand paging", je vais me diriger sur cette voie-là.
J'ai déjà un malloc() et free() fonctionnel mais pas encore très bien testé.

Cordialement,

Konstantin Tcholokachvili

Le 03/06/09, anthoine.bourgeois<anthoine.bourgeois at orange.fr> a écrit :
> 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
>
>
> _______________________________________________
> Sos mailing list
> Sos at the-doors.enix.org
> http://the-doors.enix.org/cgi-bin/mailman/listinfo/sos
>


Plus d'informations sur la liste de diffusion Sos