[Kos-dev] kvalloc, synchronisation des PDE, port-e8-hack
d2
kos-dev@enix.org
07 May 2001 11:38:43 +0200
>>>>> "Thomas" == Thomas Petazzoni <thomas.petazzoni@meridon.com> writes:
Thomas> pourrais-tu preciser les petites erreurs que je puisse
Thomas> corriger et comprendre mes fautes ?
Pas une erreur, un "detail de syntaxe" :
Dans kvalloc :
for(current_range = free_page_ranges;
current_range != NULL;
current_range = current_range->next)
{
/* If range has exactly the same size, just move it to used list */
if(current_range->nb_pages == nb_pages)
{
xxxx lignes...
}
}
D'ailleurs, je remarque que ca doit etre une erreur finalement : ca va
impliquer une allocation de nb_pages pages partout ou c'est possible
(en ne mappant que la derniere trouvee), au lieu d'une allocation
unique parmi tous les ranges dispo.
Une version correcte est :
for(current_range = free_page_ranges;
current_range != NULL;
current_range = current_range->next)
if(current_range->nb_pages == nb_pages)
break;
if (! current_range)
return -1;
xxxx lignes...
return virt_base_addr;
... Ou mieux :
current_range = find_range_in_free_ranges_list();
if (! current_range)
return -1;
xxxx lignes...
return virt_base_addr;
Thomas> cette fonction serait appellee dans kvalloc pour trouver
Thomas> un range suffisamment grand et libre. effectivement le
Thomas> first fit me plait pas trop, parce que si on veut allouer
Thomas> une page, qu'on a un gros range puis un petit de une page
Thomas> dans la liste, faut mieux utiliser le petit de une page
Thomas> que splitter le gros. c'est moins couteux en temps et ca
Thomas> evite la fragmentation. mais comment faire ca ? faudrait
Thomas> scanner plusieurs fois la liste ? je connais pas bien les
Thomas> algo type first fit et autres ? un petit topo ?
Tu utilises first fit. Tu proposes dans ce paragraphe d'utiliser "best
fit". Il reste 2 autres voies "classiques" :
- worst fit : on prend le range libre le plus grand.
- first fit bis (j'ai oublie son nom) : on memorise la ou on en
etait la derniere fois dans le parcours de la liste, et on part de
la jusqu'a trouver un range suffisamment grand. On peut reutiliser
ce principe pour best et worst fit.
Une autre solution serait d'utiliser des arbres binaires (avec ordre
partiel), mais je suis pas sur que pour des ranges de pages ca se
justifie (on aura peu d'intervalles libres, tout au plus qqs
dizaines/centaines).
>> Pour le port e7/e8, ca peut servir, oui. Va falloir qd meme
>> reflechir a un moyen de recuperer les infos de relocation
>> off-line (maintenant que l'adresse de debut est connuee et
>> standard [512M]).
Thomas> ouais j'ai commence a reflechir a ca, mais c'est quand
Thomas> meme chaud.
Pareil.
--
d2