In meiner Systemprogrammierklasse arbeiten wir an einem kleinen, einfachen Hobby-Betriebssystem. Persönlich habe ich an einem ATA-Festplattentreiber gearbeitet. Ich habe entdeckt, dass eine einzige Codezeile einen Fehler zu verursachen scheint, der das System sofort neu startet. Der fragliche Code befindet sich am Ende meiner Interrupt-Service-Routine für die IDE-Interrupts. Da ich die IDE-Kanäle verwende, werden sie über den Slave-PIC gesendet (der über den Master kaskadiert wird). Ursprünglich hat mein Code nur das Ende des Interrupt-Bytes an den Slave gesendet, aber dann sagte mir mein Professor, dass ich es auch an den Master-PIC schicken sollte.Wie könnte eine OUTB-Funktion der Baugruppe einen dreifachen Fehler verursachen?
SO ist hier mein Problem, wenn ich die Linie ent-Kommentar, die das EOI-Byte an den Master-PIC sendet, die Systeme dreifach Fehler und dann neu gestartet. Ebenso, wenn ich es kommentiert lasse, läuft das System weiter.
Ohne den Rest des Systems zu sehen, ist es für jemanden möglich zu erklären, was hier möglicherweise passieren könnte?
ANMERKUNG: Genau wie eine Aufnahme im Dunkeln, ersetzte ich den Aufruf _outb() durch einen anderen Aufruf _outb(), der nur dafür sorgte, dass die Interrupts für den IDE-Controller aktiviert waren identisch. Dies verursachte keinen Fehler.
* _outb() ist ein Wrapper für die Anweisung x86 OUTB.
Was ist so besonders an meiner Funktion, EOI an den Master PIC zu senden, der ein Problem ist?
Ich realisiere, ohne den Code zu sehen, dies kann unmöglich zu beantworten sein, aber danke fürs schauen!
Ich wünschte, das wäre der Fall, aber wir haben Code, um die Flagge automatisch zu deaktivieren. Ich bin mir also ziemlich sicher, dass das nicht das Problem ist. –
Es wurde deaktiviert, als Ihr ISR eingegeben wurde, aber wurde es möglicherweise erneut in Ihrem ISR aktiviert?Haben Sie kurz vor der Ausgabe von EOI die Flagge betrachtet und/oder eine andere CLI ausgegeben? – ChrisW