[Kos-dev] Bug concernant les piles statiques
Thomas Petazzoni
kos-dev@enix.org
Thu, 12 Jul 2001 11:28:52 +0200
Bonjour,
J'ai debugge jusqu'a une heure du mat' hier soir, mais ca a donne ces
resultats, j'ai trouve le bug qui faisait que les piles statiques
marchaient pas bien. Je vous l'expose car il assez strange.
C'etait bien un probleme d'ecrasement de pile, du au TLB. Quand un
thread etait supprime, on liberait les pages virtuelles associees a sa
pile, et on les demappait. La prochaine allocation de thread utilisait
ces pages virtuelles pour la pile, et la bing probleme de TLB !
En fait j'avais remplace le flush_tbl dans unmap_virtual_to_physical par
des invlpg plus propres, mais je l'avais apparemment mal fait (je sais
pas comment ca pouvait marcher jusqu'a maintenant, surement parce qu'on
reutilisait pas des pages virtuelles liberes).
J'avais code la macro invplg ainsi (cf mm-x86/paging.c):
#define invlpg(vaddr) \
do { \
__asm__ __volatile__("invlpg %0"::"m"(vaddr)); \
} while(0)
Et j'appelais la macro de la maniere suivante :
invplg (page) ou page est un addr_t qui contient l'adresse de la page
a invalider.
A priori c'etait bon, enfin en tout cas moi ca me paraissait bon. Mais
en remplacant par
invplg(*(unsigned*)page) le bug disparaissait.
N'etant pas sur de moi, j'ai fait de nombreux tests, avec des nombres de
threads differents, sur des machines differentes...
Voici ce que dit la doc Intel sur la question :
INVPLG m Invalidate TLB entry for page that CONTAINS m
Invalidates (flushes) the translation lookaside buffer (tlb) entry
specified with the source operang. The source operand is a memory
address. The processor determines the page that containes that address
and flushes the TLB entry for that page.
Pensez-vous que le *(unsigned *) devant corrige bien le probleme.
Empiriquement il semblerait que oui, mais je me pomme dans toutes ces
histoires de pointeurs. Alors si quelqu'un pouvait me dire...
Amicalement,
thomas
--
PETAZZONI Thomas
thomas.petazzoni@meridon.com UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/