[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