[Résolu][C]Segmentation fault après execution d'une boucle infinie

Bonjour!

Je vous explique mon problème:
Je suis en 2° année de GEII et dans le cadre des projets “Etude et réalisation” on doit developper une carte ISA (lol) pour gérer un carrefour.
Bon jusque là, rien de bien compliqué vous me direz!
Certes! Mais pour relever des signaux à l’oscilloscope, on doit faire tourner le programme (qui pour le moment se résume a une simple mise à 1 d’un port) en boucle. Le probleme est, qu’une fois que ce programme est lancé et que je fais Ctrl+c pour stopper l’execution, dès que je lance un autre programme, je me prend une “erreur de segmentation”. J’ai essayé de ne pas faire une boucle infinie en mettant juste une boucle longue, mais ca fait la même chose B) .

Ca veut donc dire que si je veux lancer un autre programme, il faut que je redemarre l’ordinateur (ce qui prend en moyenne 5min (386 pawaaa XD))

Quelqu’un aurai une idée d’où ca peut venir?

La seule info que j’ai c’est que le “PC” sur lequel s’execute ce programme tourne sur une version adaptée de Red Hat! (soit pas grand chose en fait)

ça peut venir de pleins d’endroits …
j’ai pas bien saisi : il lui est arrivé de pas segfaulter ?
sinon les segfault ça peut venir de pleins de surprises : pointeurs ou multi threading.
bref il faut des détails pour que l’on puisse éventuellement t’aider.

voici le code en question:

#include <stdio.h> #include <unistd.h> #include <sys/io.h> int main() { ioperm(0x300,2,1); // droit d'accès aux ports d'E/S outb(0x89,0x303); // Port A en sortie/port C en entrée while(1) { outb(0xFF,0x300); // écriture (sortie) } }

Entre temps, avec un ami je me suis rendu compte d’un problème déjà mais je ne pense pas que le segmentation fault vienne de là.

Donc si je fait le code sans la boucle:

int main() { ioperm(0x300,2,1); // droit d'accès aux ports d'E/S outb(0x89,0x303); // Port A en sortie/port C en entrée outb(0xFF,0x300); // écriture (sortie) }

pas de segmentation fault,

si je fait le meme code avec une boucle finie:

int main() { int A; A = 0; ioperm(0x300,2,1); // droit d'accès aux ports d'E/S outb(0x89,0x303); // Port A en sortie/port C en entrée while(A !=X) { outb(0xFF,0x300); // écriture (sortie) A++; } }

Pour X= 100,1 000,100 000, pas de segmentation fault
pour X = 1 000 000, segmentation fault!

Donc je comprend pas :confused:

sinon j’execute bien le code en SU, et le probleme qu’on a trouvé est dans ioperm :
il faudrai:

ioperm(0x300,4,1);

au lieu de:

ioperm(0x300,2,1);

si besoin je peux essayer de donner plus d’infos B)

Tu peux voir au bout de combien d’itérations tu as le segfault ? Est-ce fixe ? Si tu as une autre instruction entre les outb, ça change quelque chose (pour des problèmes de latence par exemple) ? De plus, outre les 4 ports au lieu des 2, faudrait aussi vérifier que tu as bien eu la permission en checkant la sortie de ioperm. Ca se trouve, ton segfault vient du outb alors que le ioperm a échoué. B)

pour le nombre precis d’iterations il doit etre entre 100 000 et 1 000 000 XD donc bon…

sinon, si j’avais pas eu la permission sur les ports je pourrai, normalement pas y ecrire/lire ne serais-ce qu’une seule fois non?

Par acquis de conscience je verifierai le resultat de ioperm B)

oui, je me doute, j’ai lu tes posts avant, mais y’a moyen de reproduire ça avec un compteur pour voir si le plantage est systématique? B)

non, ça veut dire que le système garantit pas l’accès, stou. C’est comme le panneau « Fin de route » sur une nouvelle autoroute, ça indique pas forcément la fin de la route àçl’endroit du panneau mais vaut mieux s’arrêter là, même si tu peux physiquement continuer sur 200, 300 mètres. B) (D’ailleurs en passant, normalement, tu dois aussi refermer tes ports proprement en fin de prog)

Sinon, le coup d’une instruction intermédiaire dans ta boucle, c’est aussi à tenter (genre un mini sleep) car en élec, on est assez bas niveau quand même, et donc envoyer sans discontinuer, les machines n’aiment pas forcément.

perso, je testerais avec une fermeture propre des ports a la fin du programme, et un while(!kbhit())

Bon voila, j’ai travaillé sur le projet vendredi, et le probleme venait bien du ioperm sur lequel je ne donnais pas les permissions sur les registres que j’utilisais…

maintenant ca explique pas pourquoi en simple execution ça fonctionnait… les mysteres de l’informatique! lol

merci pour votre aide ^^