Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 29. July 2006, 15:02
-
Hallo,
jetzt bin ich einbisschen durcheinander. Ich habe gerade gemerkt das ich in meinem Interrupt-Handler Interrupts ausführen kann, obwohl ich den Interrupt über ein Interrupt-Gate aufruhfe. Ein Interrupt-Gate erlaubt doch aber eigentlich keine Interrupt, dachte ich. Ich dachte fürs erlauben ist ein Trap-Gate zuständig. Auch wenn ich ganz oben im Interrupt ein cli schreibe, lassen sich Interrupts aufrufen. Ich teste das nämlich indem ich das rax Register auf Null setze, ein "int 30h" aufrufe der rax auf 2 setzt. Und unter dem "int 30h" mache ich ein jmp $. Dann schaue ich mir den Wert von rax in Bochs an. Und der Wert ist 2, also muss der "int 30h" ja aufgerufen worden sein. Das soll doch aber ein Interrupt-Gate verhindern!? Kann mir das jemand erklären?
bitmaster
-
Du scheinst mir ein wenig verwirrt zu sein :lol:
Es gibt Hardware- (irqs) & Sofwareinerrupts ("int 0xXX") und dann noch CPU Exceptions (page fault, division by zero). Nur Hardwareinterrupts sind vom status des interrupt flags betroffen.
-
Du scheinst mir ein wenig verwirrt zu sein :lol:
Es gibt Hardware- (irqs) & Sofwareinerrupts ("int 0xXX") und dann noch CPU Exceptions (page fault, division by zero). Nur Hardwareinterrupts sind vom status des interrupt flags betroffen.
Cool, ich programmiere seit ewigkeiten und wusste das bis jetzt echt nicht. Was für eine ... :oops: Na ja, ich bin ja auch dumm. Wie aktiviert man die Interrupts denn dann wieder?
bitmastr
-
Mit cli/sti kann man das Interrupt flag verändern. Die Softwareinterrupts und die CPU Exceptions kann man nicht aktivieren/deaktivieren (siehe oben). Gibt ja auch keinen Sinn...
-
Na ja, ich bin ja auch dumm. Wie aktiviert man die Interrupts denn dann wieder?
Das habe ich nicht geschrieben. Die IRQs kann man im Interrupt Handler soweit ich weiß nicht einfach aktivieren. Dafür ist ja das Trap-Gate da. Also im Interrupt-Gate und Trap-Gate kann man mit cli und sti nicht verändern, soweit ich weiß.
bitmaster
-
Das stimmt nicht.Innerhalb des Interrupt/Trap-Gates kannst du die Hw-Interrupts aktivieren/deaktivieren wie du willst. Nur wenn du dann wieder mit iret zurückkehrst wird der Zustand des Interruptflags wieder auf den Zustand vor dem Interrupt/Trap-Gate gesetzt, da ja die eflags von int/iret gesichert/wiederhergestellt werden. Evtl hast du es damit verwechselt.
-
Das stimmt nicht.Innerhalb des Interrupt/Trap-Gates kannst du die Hw-Interrupts aktivieren/deaktivieren wie du willst.
Ah so, jo das wusste ich jetzt nicht genau. danke
Nur wenn du dann wieder mit iret zurückkehrst wird der Zustand des Interruptflags wieder auf den Zustand vor dem Interrupt/Trap-Gate gesetzt, da ja die eflags von int/iret gesichert/wiederhergestellt werden. Evtl hast du es damit verwechselt.
Ja das weiß ich, Nein das habe ich damit nicht verwechselt.
bitmaster