[Kos-dev] kvalloc

Thomas Petazzoni kos-dev@enix.org
Thu, 03 May 2001 19:25:18 +0200


> L'idee, c'est qu'en fait, l'allocation de nouveau ranges dans kvalloc
> peut se faire simplement et proprement sans appel a kvalloc => on
> evite la recursivite. La technique est de faire en sorte que les
> ranges nouveaux qu'on veut allouer sur de nouvelles pages soient
> associes a un struct range* lui-meme stocke sur cette nouvelle page
> (ca rappelle le mirroring, mais ca n'a rien a voir). C'est ca le point
> fondamental de l'algo : on a des ranges dedies, donc des pages
> physiques, remplis que de ranges. 
> L'algo suivant fait comme ci-dessus. J'ai fait en sorte que ca ne
> fasse pas appel a une technique particuliere de stockage : liste,
> arbre, ... ce qui compte, c'est qu'on soit sur qu'un range qui
> contient au moins une page de 4k contenant au moins un struct range*
> ne continendra en fait QUE des struct range* colles les uns aux autres
> dans ce range. Et, que, quelle que soit la methode de stockage (arbre,
> liste), on dispose d'un champ ou d'une methode "tail" qui donne le
> struct range* d'adresse la plus elevee au sein des listes/arbres de
> ranges.

j'avoue que je vois pas trop comment tu veux proceder. je t'expose ci
dessous ce que j'ai compris de ta methode.
en fait on alloue des pages physiques, mappees en virtuel, qui ne
contiennent que des chained_range_t.

typedef struct chained_range_t {
	addr_t start;
	addr_t end;
	chained_range_t *next;
	chained_range_t *prev;
}

puis on a deux pointeurs :

	chained_range_t *free_range_list;
	chained_range_t *full_range_list;

a l'initialisation de notre kvalloc/kvfree, on alloue une page physique,
qu'on mappe en memoire virtuelle. ensuite a l'interieur de cette page
physique, on cree n+2 chained_range_t dans la liste full (un par module,
un pour le GPFM, un pour l'ensemble des sections .init) et on cree un
chained_range_t dans la liste free (pour decrire l'espace libre).

mais voila, apres dans notre page physique, comment on sait quelles
structures chained_range_t sont prises ou non ? pour moi ca ne fait que
reporter le probleme...
ou alors au debut de chaque page qui contient des chained_range_t on
place un bitmap qui nous quels sont les chained_range_t libres et ceux
qui sont occupes. ca permet d'en creer a la volee, sans faire de
kmalloc. quand on est en rade de chained_range_t, on alloue une nouvelle
page physique, qu'on mappe en virtuel....
mais faudra bien maintenir une liste des pages virtuelles qui servent a
stocker les chained_range_t, pour en trouver un de libre lorsque l'on
libere ou lorsque l'on alloue un ensemble de pages virtuelles.

bref, je suis pas sur du tout d'avoir compris ce que tu veux faire.
essaie d'expliquer plus precisement ou plus clairement. je vais essayer
de voir ce que je peux coder de mon cote, mais je garantis rien du tout.

amicalement

thomas

-- 
PETAZZONI Thomas
thomas.petazzoni@meridon.com     UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/