[Kos-dev] Bug report
Thomas Petazzoni
kos-dev@enix.org
Fri, 22 Jun 2001 11:00:32 +0200
salut,
il y a un petit probleme avec KOS. Bon le probleme est connu, mais se
pose maintenant : lorsque l'on accede a de la pile n'importe (en dehors
de la zone de la pile normale), et que l'on est dans une IRQ, et ben on
arrete le systeme.
Or, lorque l'on fonctionne en 1000Hz, et que l'on a des threads stack
fault en route, bin le systeme s'arrete car il y a tellement
d'interruptions horloge qu'on tombe pile poil la ou il faut pas. C'est
systematique, j'ai teste sur un K6-2 350 et un K6-2 500. (d'ailleurs
j'ai pu a cette occasion tester le debugging sur ligne serie... c'est
cool).
Donc maintenant il faut trouver une solution pour que lorsque qu'un
thread soit arrive au bout de sa pile, ou alors qu'il a une adresse de
pile completement farfelue on puisse terminer le handler d'IRQ.
Avec d2 on avait eu l'idee que lorsque la taille de la pile restante
devenait trop critique pour un thread (genre trois ou quatre pages avant
qu'il arrive a la limite), on le place a l'etat DELETED, pour qu'il ne
soit plus elu, et que notre cher kgc se charge de le virer.
mais le hic avec ca, c'est que si l'adresse de la pile est completement
fausse subitement (a cause d'un thread pas gentil, comme les threads
stack_fault), bin alors la on sait pas quoi faire.
bref, moi je peux proposer la solution suivante :
- si un thread atteint une limite de pile non acceptable, on le passe a
l'etat DELETED. mais attention ceci risque de poser probleme si le
nombre de threads est faible. je m'explique.
on est dans le thread A, puis la IRQ0. celle-ci fait un reschedule qui
decide d'elire de nouveau le thread A (car la politique de scheduling
l'a decide), puis apres avoir choisi ce prochain thread, double fault.
si ce double fault conduit a une stack overflow, le thread A va etre
passe a l'etat DELETED, mais vu que le reschedule a deja ete fait, mais
il sera tout de meme execute. bref on a une probabilite faible, mais non
nulle, que le thread A soit execute. donc notre solution est bof. elle
marchera dans 99.99% des cas, mais pas dans les 0.01% restants.
- si un thread est completement out de sa zone de pile, bin on arrete
le systeme.
bref, tout n'est pas simple dans cette histoire, et il faut maintenant
decider comment on va faire. j'aimerais vraiment en terminer avec ce
double fault, car je voudrais avancer sur autre chose.
des idees, des suggestions....
amicalement,
thomas
--
PETAZZONI Thomas
thomas.petazzoni@meridon.com UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/