[Kos-cvs] [kos] Modification CVS par thomas

KOS CVS Gestion CVS KOS <d2@kos.enix.org>
Mon, 1 Apr 2002 15:56:29 +0200 (CEST)


Module :	kos
Modifié par :	thomas	01/04/02 15:56:29

Fichiers modifiés :
	.              : TODO 
	modules/fat    : _fat.c 
	modules/ide    : _ide.c 
	modules/init   : _post_init.c 
	modules/kos    : _vr_test.c wolfgang.c 
	modules/scheduler: _scheduler.h _sleep.c scheduler.c scheduler.h 
	modules/x86/lib: Makefile lib.c 
	modules/x86/mm : _team_mm_context.c _vmap.c mm.c 
	modules/x86/task: _thread_cpu_context.c 
Fichiers ajoutés :
	modules/x86/lib: _delay.c delay.h 

Détails :
Du nouveau :
------------

- Creation d'une primitive de calibration du temps
(scheduler/_sleep.c) pour faire de l'attente active correctement
mesuree. La fonction init_delay_loop calcule le nombre de boucles par
seconde de la fonction __delay(), ce qui permet ensuite a la fonction
udelay() de fonctionner correctement. => Gros pompage sur le code
source de Linux 2.2 pour cette histoire.

Un truc tres tres tres tres etrange : dans le code de Linux ils font :

while(ticks == jiffies)
;

Pour attendre que ticks soit different de jiffies. Dans KOS, si on
fait pas un truc genre

while(ticks == jiffies)
{
jiffies = jiffies + 1;
jiffies = jiffies -1;
}

Bin ce con de GCC optimise, et ne relit pas la valeur de jiffies a
chaque iteration de la boucle.

SOLUTION RETENUE : creation d'une fonction arch_wait_no_equality dans
arch/lib qui attend l'inegalite des deux termes, le dernier etant
fourni par adresse, pour FORCER sa relecture a chaque iteration.

Avec Bochs, j'ai 0.45 Bogomips. Sachant qu'un 386 SX 16 sans cache
fait 0.57. Je sais pas trop quoi penser de cette valeur.J'ai pas teste
sur machine reelle. (Cf mini HOWTO Bogomips pour une liste de
valeurs).

- Amelioration de _ide.c => au lieu d'utiliser usleep() on utilise
udelay => attente active, mieux pour deux raisons :
- les delais sont courts, c'est toujours des usleep(1) (1 micro
seconde, sachant que HZ=10, ou 100, bin la granularite du timer est
de 100ms ou 10ms... compare a une micro seconde c'est
enorme). Faudrait envisager une ndelay() en nanosecondes.
- on faisait des usleep() => mechant reschedule a chaque fois en
plein traitement d'un page fault... Un peu gore nan ?

=> Le IDE qui mettait trois plombes a charger le fichier avant, va
maintenant la vitesse de la lumiere. En fait j'avais mis des
usslep(1000) un peu partout pour le debuggage (voir si les pbs etaient
du a un controlleur trop lent), et j'avais oublie de les enlever :o)

- Bug mineur : on oubliait lorsqu'on allouait les PDs pour une
nouvelle team de faire un memset a 0, resultat quand c'etait une page
deja utilisee, vla le bazar.

- Virage des sections .init dans init/_post_init.c

- Le bug de l'exception 0 n'existe pas.

Voila pour le moment.
Je continue a bosser sur KOS.