Question

Dans ma classe des systèmes de programmation, nous travaillons sur un petit système d'exploitation simple passe-temps. Personnellement, je travaille sur un pilote de disque dur ATA. Je l'ai découvert qu'une seule ligne de code semble provoquer une erreur qui a alors le système redémarre immédiatement. Le code en question est à la fin de ma routine de service d'interruption pour les interruptions IDE. Depuis que je suis en utilisant les canaux IDE, ils sont envoyés à travers l'esclave PIC (qui est en cascade à travers le maître). A l'origine mon code ne fut d'envoyer la fin de l'octet d'interruption à l'esclave, mais mon professeur m'a dit que je devrais l'envoyer au PIC maître aussi bien.

Voici mon problème, quand je Décommentez la ligne qui envoie l'octet EOI au PIC maître, les systèmes triples défauts, puis redémarre. De même, si je le laisse a commenté le système reste en cours d'exécution.

_outb( PIC_MASTER_CMD_PORT, PIC_EOI );  // this causes (or at least sets off) a triple fault reboot
_outb( PIC_SLAVE_CMD_PORT, PIC_EOI );

Sans y voir le reste du système, est-il possible pour quelqu'un d'expliquer ce qui pourrait se passer ici?

NOTE: Tout comme un coup de feu dans l'obscurité, je remplace le _outb () appeler avec un autre _outb () appel qui vient de faire en sorte que les interruptions étaient permettent pour le contrôleur IDE, cependant, l'ensemble généré aurait été presque identique . Cela ne provoque pas un défaut.

* _ NUM.B () est une enveloppe pour l'instruction x86 NUM.B.

Quelle est la particularité de ma fonction pour envoyer EOI au PIC maître qui est un problème?

Je me rends compte sans voir le code cela peut être impossible de répondre, mais merci pour la recherche!

Était-ce utile?

La solution

défauts point triple habituellement à un débordement de pile ou de pointeur de pile impaire. En cas de défaut ou d'interruption survient, le système essaie immédiatement de pousser encore plus indésirable sur la pile (avant d'appeler le gestionnaire de défaut). Si la pile est lavé au jet, cela entraînera une autre faute, qui tente alors de pousser plus de choses sur la pile, ce qui provoque un autre défaut. À ce stade, le système donne sur vous et redémarrages.

Je sais cela parce que je suis en fait un brevet stupide (tout en travaillant à Dell il y a environ 20 ans) sur une façon de provoquer une remise à zéro du processeur sans matériel externe (utilisé pour être fait par le contrôleur du clavier):

   MOV ESP,1
   PUSH EAX    ; triple fault and reset!

Une instruction FINB ne peut pas provoquer une faute sur lui-même. Je suppose que vous Réactivation d'une interruption, et l'interruption se déclenche alors que quelque chose ne va pas avec votre pile.

Autres conseils

Lorsque vous réactivez le PIC, faites-vous avec le jeu de drapeau d'interruption de la CPU, ou dédouanées (ie. Le faites-vous quelque temps après un opcode CLI, ou, quelque temps après un opcode STI)?

En supposant que est activé le drapeau d'interruption de la CPU, votre acte de Réactivation du PIC permet des interruptions en attente pour atteindre la CPU. Qui interromprait votre code, l'envoi à un vecteur spécifié par l'IDT, etc

Je pense que ce n'est pas votre opcode qui cause directement la faute. Au contraire, ce qui est la formation de failles est le code qui est exécuté à la suite d'une interruption qui se produit à la suite de votre réactivant le PIC

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top