Closed MaximeCheramy closed 12 years ago
L'esp a vraiment une drole de tronche, ça me fait peur cette histoire :D
Le bug est assez magique. Visiblement ya un truc qui pourri les variables globales de ls lorsqu'on le lance. Pour confirmer cette hypothèse, j'ai rajouté une variable globale au tout début qui est un tableau de 400ko et là, plus aucun souci, ma variable globale suivante qui était initialisée à 0, le reste.
Je ne sais pas si c'est lié mais suite à l'ajout de features dans mishell, j'obtiens cette erreur au retour de ls :
In /tacos/bin/mishell (pid:3)
Register dump: eax:0x40000b75 esp:0x40003ac8 ecx:0x00000002 ebp:0x40008bb2 edx:0x00000002 esi:0x00000044 ebx:0x00000002 edi:0x00000010
Exception handled : Page fault (error code : 4). Virtual address: 0x04000000 Cause: Read from a non-present page with CPL=3.
Je confirme qu'un petit int tab[100000]; permet de contourner le plantage :D. J'ai bien sûr mis des XXX dans mishell à cet endroit...
Est-ce qu'on peut fermer le ticket ou est-ce que tu penses que je n'ai pas rééllement corrigé le problème mais juste très bien dissimulé ? Les 2 plantages (mishell et ls après un pres) ont disparus suite au remplacement d'un malloc par un calloc sur les data du process elf.
On a encore des plantages étranges si on lance plusieurs process en même temps à l'aide de getty. Il faudrait vérifier les adresses mémoires allouées.
Je rajoute suite à notre discussion : La mémoire des processus n'est jamais libérée (sauf si on dit des erreurs) donc il n'y a pas de raison pour que la mémoire puisse être réutilisée par un autre process. Ici, avant de mettre le calloc, il y avait en mémoire les data de pres.
A noter que les data de pres qu'on écrase avec le nouveau process ne sont pas dans le tas, mais bien dans la mémoire initiale du processus, qui a donc été normalement réservée par init_process_vm et non pas par un malloc( je sais pas trop ce qu'il y a derrière, mais le malloc est plus ou moins testé alors que cette fonction non, c'est donc surement une piste...)
Est-ce que @NoWiS- pourrait nous expliquer un peu comment ça marche ?
--- pres
Breakpoint 1, map (phys_page_addr=19415040, virt_page_addr=1073795072, u_s=1) Breakpoint 1, map (phys_page_addr=19410944, virt_page_addr=1073799168, u_s=1) Breakpoint 1, map (phys_page_addr=19406848, virt_page_addr=1073803264, u_s=1) Breakpoint 1, map (phys_page_addr=19402752, virt_page_addr=1073807360, u_s=1) Breakpoint 1, map (phys_page_addr=19398656, virt_page_addr=1073811456, u_s=1) Breakpoint 1, map (phys_page_addr=19394560, virt_page_addr=1073815552, u_s=1) Breakpoint 1, map (phys_page_addr=19390464, virt_page_addr=1073819648, u_s=1) Breakpoint 1, map (phys_page_addr=19386368, virt_page_addr=1073823744, u_s=1) Breakpoint 1, map (phys_page_addr=19382272, virt_page_addr=1073827840, u_s=1) Breakpoint 1, map (phys_page_addr=19378176, virt_page_addr=1073831936, u_s=1) Breakpoint 1, map (phys_page_addr=19374080, virt_page_addr=1073836032, u_s=1) Breakpoint 1, map (phys_page_addr=19369984, virt_page_addr=1073840128, u_s=1) Breakpoint 1, map (phys_page_addr=19365888, virt_page_addr=1073844224, u_s=1) Breakpoint 1, map (phys_page_addr=19361792, virt_page_addr=1073848320, u_s=1) Breakpoint 1, map (phys_page_addr=19357696, virt_page_addr=1073852416, u_s=1)
Breakpoint 1, map (phys_page_addr=19353600, virt_page_addr=1884160, u_s=0) Breakpoint 1, map (phys_page_addr=19349504, virt_page_addr=1888256, u_s=0) Breakpoint 1, map (phys_page_addr=19345408, virt_page_addr=1892352, u_s=0) Breakpoint 1, map (phys_page_addr=19341312, virt_page_addr=1896448, u_s=0) Breakpoint 1, map (phys_page_addr=19337216, virt_page_addr=1900544, u_s=0) Breakpoint 1, map (phys_page_addr=19333120, virt_page_addr=1904640, u_s=0) Breakpoint 1, map (phys_page_addr=19329024, virt_page_addr=1908736, u_s=0) Breakpoint 1, map (phys_page_addr=19324928, virt_page_addr=1912832, u_s=0) Breakpoint 1, map (phys_page_addr=19320832, virt_page_addr=1916928, u_s=0) Breakpoint 1, map (phys_page_addr=19316736, virt_page_addr=1921024, u_s=0) Breakpoint 1, map (phys_page_addr=19312640, virt_page_addr=1925120, u_s=0) Breakpoint 1, map (phys_page_addr=19308544, virt_page_addr=1929216, u_s=0) Breakpoint 1, map (phys_page_addr=19304448, virt_page_addr=1933312, u_s=0) Breakpoint 1, map (phys_page_addr=19300352, virt_page_addr=1937408, u_s=0) Breakpoint 1, map (phys_page_addr=19296256, virt_page_addr=1941504, u_s=0)
Breakpoint 1, map (phys_page_addr=19292160, virt_page_addr=1073741824, u_s=1) Breakpoint 1, map (phys_page_addr=19288064, virt_page_addr=4289724416, u_s=1) Breakpoint 1, map (phys_page_addr=19283968, virt_page_addr=4286586880, u_s=1) Breakpoint 1, map (phys_page_addr=19279872, virt_page_addr=1073745920, u_s=1) Breakpoint 1, map (phys_page_addr=19275776, virt_page_addr=1073750016, u_s=1) Breakpoint 1, map (phys_page_addr=19271680, virt_page_addr=1073754112, u_s=1) Breakpoint 1, map (phys_page_addr=19267584, virt_page_addr=1073758208, u_s=1) Breakpoint 1, map (phys_page_addr=19263488, virt_page_addr=1073762304, u_s=1) Breakpoint 1, map (phys_page_addr=19259392, virt_page_addr=1073766400, u_s=1) Breakpoint 1, map (phys_page_addr=19255296, virt_page_addr=1073770496, u_s=1) Breakpoint 1, map (phys_page_addr=19251200, virt_page_addr=1073774592, u_s=1) Breakpoint 1, map (phys_page_addr=19247104, virt_page_addr=1073778688, u_s=1) Breakpoint 1, map (phys_page_addr=19243008, virt_page_addr=1073782784, u_s=1) Breakpoint 1, map (phys_page_addr=19238912, virt_page_addr=1073786880, u_s=1) Breakpoint 1, map (phys_page_addr=19234816, virt_page_addr=1073790976, u_s=1) Breakpoint 1, map (phys_page_addr=19230720, virt_page_addr=1073795072, u_s=1) Breakpoint 1, map (phys_page_addr=19226624, virt_page_addr=1073799168, u_s=1) Breakpoint 1, map (phys_page_addr=19222528, virt_page_addr=1073803264, u_s=1) Breakpoint 1, map (phys_page_addr=19218432, virt_page_addr=1073807360, u_s=1) Breakpoint 1, map (phys_page_addr=19214336, virt_page_addr=1073811456, u_s=1) Breakpoint 1, map (phys_page_addr=19210240, virt_page_addr=1073815552, u_s=1) Breakpoint 1, map (phys_page_addr=19206144, virt_page_addr=1073819648, u_s=1) Breakpoint 1, map (phys_page_addr=19202048, virt_page_addr=1073823744, u_s=1) Breakpoint 1, map (phys_page_addr=19197952, virt_page_addr=1073827840, u_s=1) Breakpoint 1, map (phys_page_addr=19193856, virt_page_addr=1073831936, u_s=1) Breakpoint 1, map (phys_page_addr=19189760, virt_page_addr=1073836032, u_s=1)
--- ls
Breakpoint 1, map (phys_page_addr=19185664, virt_page_addr=1945600, u_s=0) Breakpoint 1, map (phys_page_addr=19181568, virt_page_addr=1949696, u_s=0) Breakpoint 1, map (phys_page_addr=19177472, virt_page_addr=1953792, u_s=0) Breakpoint 1, map (phys_page_addr=19173376, virt_page_addr=1957888, u_s=0) Breakpoint 1, map (phys_page_addr=19169280, virt_page_addr=1961984, u_s=0) Breakpoint 1, map (phys_page_addr=19165184, virt_page_addr=1966080, u_s=0) Breakpoint 1, map (phys_page_addr=19161088, virt_page_addr=1970176, u_s=0) Breakpoint 1, map (phys_page_addr=19156992, virt_page_addr=1073741824, u_s=1) Breakpoint 1, map (phys_page_addr=19152896, virt_page_addr=4289724416, u_s=1) Breakpoint 1, map (phys_page_addr=19148800, virt_page_addr=4286586880, u_s=1) Breakpoint 1, map (phys_page_addr=19144704, virt_page_addr=1073745920, u_s=1) Breakpoint 1, map (phys_page_addr=19140608, virt_page_addr=1073750016, u_s=1) Breakpoint 1, map (phys_page_addr=19136512, virt_page_addr=1073754112, u_s=1) Breakpoint 1, map (phys_page_addr=19132416, virt_page_addr=1073758208, u_s=1) Breakpoint 1, map (phys_page_addr=19128320, virt_page_addr=1073762304, u_s=1) Breakpoint 1, map (phys_page_addr=19124224, virt_page_addr=1073766400, u_s=1) Breakpoint 1, map (phys_page_addr=19120128, virt_page_addr=1073770496, u_s=1) Breakpoint 1, map (phys_page_addr=19116032, virt_page_addr=1073774592, u_s=1) Breakpoint 1, map (phys_page_addr=19111936, virt_page_addr=1073778688, u_s=1) Breakpoint 1, map (phys_page_addr=19107840, virt_page_addr=1073782784, u_s=1) Breakpoint 1, map (phys_page_addr=19103744, virt_page_addr=1073786880, u_s=1) Breakpoint 1, map (phys_page_addr=19099648, virt_page_addr=1073790976, u_s=1)
Bon, je pense que le bug c'était vraiment juste le fait que les données n'étaient pas initialisées à 0 et que ça déconnait lorsqu'on réutilisait de la mémoire utilisée précédemment. Alors à la base on s'était dit qu'on ne libérait jamais les pages physiques donc c'est qu'il devait il y avoir un gros problème mais en fait, selon moi, les données sont celles allouées dans mishell, dans exec_elf. Ce serait ici que l'on réutiliserait de la mémoire.
Bref, je propose de fermer ce ticket et si jamais on a des bugs on peut rouvrir ou créer un nouveau ticket. Mais en tout cas maintenant je peux faire un ctrl+c dans pres pour faire un ls sans problème et depuis la console de mon choix.
ouep ok
Bug reproductible par :
Si je tape une autre commande que ls ça ne plante pas (accès à une variable d'environnement ?). Et si je tape autre chose et que je relance ensuite la présentation et que je refais Ctrl+c suivi de ls, ça ne plante pas cette fois.
L'erreur :
In /tacos/bin/ls (pid:5)
Register dump: eax:0x40008a2c esp:0x335b1b20 ecx:0x40008a6c ebp:0x40008ac8 edx:0x4000c960 esi:0x00000001 ebx:0x0000001c edi:0x4000c12a
Exception handled : Page fault (error code : 6). Virtual address: 0x0d6cd7a0 Cause: Writing on a non-present page with CPL=3.